summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
AgeCommit message (Collapse)Author
2021-09-15Meta: Switch to a SuperBuild that splits host and target buildsAndrew Kaster
Replace the old logic where we would start with a host build, and swap all the CMake compiler and target variables underneath it to trick CMake into building for Serenity after we configured and built the Lagom code generators. The SuperBuild creates two ExternalProjects, one for Lagom and one for Serenity. The Serenity project depends on the install stage for the Lagom build. The SuperBuild also generates a CMakeToolchain file for the Serenity build to use that replaces the old toolchain file that was only used for Ports. To ensure that code generators are rebuilt when core libraries such as AK and LibCore are modified, developers will need to direct their manual `ninja` invocations to the SuperBuild's binary directory instead of the Serenity binary directory. This commit includes warning coalescing and option style cleanup for the affected CMakeLists in the Kernel, top level, and runtime support libraries. A large part of the cleanup is replacing USE_CLANG_TOOLCHAIN with the proper CMAKE_CXX_COMPILER_ID variable, which will no longer be confused by a host clang compiler.
2021-09-15Meta: Move all options to targetname_options.cmake filesAndrew Kaster
This common strategy of having a serenity_option() macro defined in either the Lagom or top level CMakeLists.txt allows us to do two things: First, we can more clearly see which options are Serenity-specific, Lagom-specific, or common between the target and host builds. Second, it enables the upcoming SuperBuild changes to set() the options in the SuperBuild's CMake cache and forward each target's options to the corresponding ExternalProject.
2021-09-15Meta: Add Meta/CMake to the CMAKE_MODULE_PATH for Serenity and LagomAndrew Kaster
This makes it so we don't need to specify the full path to all the helper scripts we include() from different places in the codebase and feels a lot cleaner.
2021-09-15Meta: Use Lagom:: namespaced names for code generatorsAndrew Kaster
This will be required when we switch to a SuperBuild that has Lagom as a configure time dependency, but is a distinct enough change to be separate.
2021-09-09Build: Add -fno-delete-null-pointer-checksAndreas Kling
This prevents GCC and Clang from deleting null pointer checks for optimization purposes. I think we're strictly better off crashing in those cases instead of the compiler hiding errors from us.
2021-08-31Build: Pass "-z separate-code" to linkerAndreas Kling
This tells the linker to not combine read-only data and executable code, instead favoring multiple PT_LOAD headers with more precise permissions. This greatly reduces the amount of executable pages in all our programs and libraries. /usr/lib/libjs.so before: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x000000 0x00000000 0x00000000 0x2fc77c 0x2fc77c R E 0x1000 LOAD 0x2fc900 0x002fd900 0x002fd900 0x0c708 0x0dd1c RW 0x1000 /usr/lib/libjs.so after: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x000000 0x00000000 0x00000000 0x80e60 0x80e60 R 0x1000 LOAD 0x081000 0x00081000 0x00081000 0x25f6c9 0x25f6c9 R E 0x1000 LOAD 0x2e1000 0x002e1000 0x002e1000 0x1c27c 0x1c27c R 0x1000 LOAD 0x2fd900 0x002fe900 0x002fe900 0x0c708 0x0dd1c RW 0x1000 As you can see, we go from 0x2fc77c bytes of executable memory down to 0x25f6c9 (a ~20% reduction!) The memory that was previous executable is now simply read-only instead. :^)
2021-08-31Meta: Require unzip and tar explicitly in CMakeListsAndrew Kaster
This should help stem the tide of people hopping in the build problems channel on discord because they don't have unzip installed.
2021-08-30CMake: Add custom target to build only the generated sourcesBrian Gianforcaro
This is needed so all headers and files exist on disk, so that the sonar cloud analyzer can find them when executing the compilation commands contained in compile_commands.json, without actually building. Co-authored-by: Andrew Kaster <akaster@serenityos.org>
2021-08-28CMake: Don't build Userland and Tests in aarch64 builds for nowNico Weber
2021-08-28CMake: Let `Meta/serenity.sh run aarch64` make it past cmakeNico Weber
This adds just enough scaffolding to make cmake succeed. The build falls over immediately.
2021-08-28Meta: Remove write-only-on-difference scriptAndrew Kaster
It's now been replaced with "${CMAKE_PROGRAM}" -E copy_if_different in all previous usage locations.
2021-08-28Everywhere: Move all host tools into the Lagom/Tools subdirectoryAndrew Kaster
This allows us to remove all the add_subdirectory calls from the top level CMakeLists.txt that referred to targets linking LagomCore. Segregating the host tools and Serenity targets helps us get to a place where the main Serenity build can simply use a CMake toolchain file rather than swapping all the compiler/sysroot variables after building host libraries and tools.
2021-08-28Meta: Prefer SerenityOS_SOURCE_DIR to CMAKE_SOURCE_DIRAndrew Kaster
By using SerenityOS_SOURCE_DIR we can make custom targets and commands agnostic to the actual location of the root CMakeLists directory. All we care about is the root of the SerenityOS project.
2021-08-18Meta+LibC: Don't allow text relocations in SerenityOS librariesDaniel Bertalan
The `-z,text` linker flag causes the linker to reject shared libraries and PIE executables that have textrels. Our code mostly did not use these except in one place in LibC, which is changed in this commit. This makes GNU ld match LLD's behavior, which has this option enabled by default. TEXTRELs pose a security risk, as performing these relocations require executable pages to be written to by the dynamic linker. This can significantly weaken W^X hardening mitigations. Note that after this change, TEXTRELs can still be used in ports, as the dynamic loader code is not changed. There are also uses of it in the kernel, removing which are outside the scope of this PR. To allow those, `-z,notext` is added.
2021-08-12Meta: Enable `nonnull-compare` warningsDaniel Bertalan
Previously, this was disabled because GCC flagged seemingly correct and well-defined code. This was however not the case because GCC implicitly marked some pointers non-null, even if we wanted to handle them ourselves, and deleted null checks on them. By re-introducing this warning, we will know if the compiler tries to discard our code again.
2021-08-08Meta: Add Clang support to the CMake build scriptsDaniel Bertalan
2021-08-08Build: Add -fsized-deallocation to global CXXFLAGSAndreas Kling
This is enabled by default for GCC (>=C++14) but apparently not for Clang, which has been causing CLion to get confused about kernel code.
2021-07-29Kernel: Use our toolchain's c++filt tool for the kernel mapGunnar Beutner
The host's version of c++filt might not work on some operating systems, e.g. macOS.
2021-07-28Toolchain: Update GCC to version 11.2.0Gunnar Beutner
2021-07-26Meta: Add LibUnicode (and its tests) to LagomTimothy Flynn
This is primarily to allow using LibUnicode within LibJS and its REPL. Note: this seems to be the first time that a Lagom dependency requires generated source files. For this to work, some of Lagom's CMakeLists.txt commands needed to be re-organized to include the CMake files that fetch and parse UnicodeData.txt. The paths required to invoke the generator also differ depending on what is currently building (SerenityOS vs. Lagom as part of the Serenity build vs. a standalone Lagom build).
2021-07-26LibUnicode: Introduce a Unicode library for interacting with UCD filesTimothy Flynn
The Unicode standard publishes the Unicode Character Database (UCD) with information about every code point, such as each code point's upper case mapping. LibUnicode exists to download and parse UCD files at build time and to provide accessors to that data. As a start, LibUnicode includes upper- and lower-case code point converters.
2021-07-26Kernel: Add option to build with coverage instrumentation and KCOVPatrick Meyer
GCC and Clang allow us to inject a call to a function named __sanitizer_cov_trace_pc on every edge. This function has to be defined by us. By noting down the caller in that function we can trace the code we have encountered during execution. Such information is used by coverage guided fuzzers like AFL and LibFuzzer to determine if a new input resulted in a new code path. This makes fuzzing much more effective. Additionally this adds a basic KCOV implementation. KCOV is an API that allows user space to request the kernel to start collecting coverage information for a given user space thread. Furthermore KCOV then exposes the collected program counters to user space via a BlockDevice which can be mmaped from user space. This work is required to add effective support for fuzzing SerenityOS to the Syzkaller syscall fuzzer. :^) :^)
2021-07-15Kernel: Make new kernel build process work on macOSGunnar Beutner
Use objcopy from the toolchain so that the changes introduced in 7236584 will succeed on macOS. Fixes #8768.
2021-07-14Meta: Remove obsolete `-fconcepts` CFLAGDaniel Bertalan
The GCC documentation says that since it's officially a part of C++20, this flag does nothing. Clang, however, does complain that it does not recognize it, so it's better to just remove it.
2021-07-12Meta+Documentation: Remove unused -DDEBUG from buildAndrew Kaster
2021-07-06Meta: Add the ConfigureComponents utilityMax Wipfli
This adds a utility program which is essentially a command generator for CMake. It reads the 'components.ini' file generated by CMake in the build directory, prompts the user to select a build type and optionally customize it, generates and runs a CMake command as well as 'ninja clean' and 'rm -rf Root', which are needed to properly remove system components. The program uses whiptail(1) for user interaction.
2021-07-04Toolchain+Userland: Enable TLS for x86_64Gunnar Beutner
This is not technically a toolchain change, but it does require rebuilding the toolchain for x86_64 (and just that).
2021-06-30Kernel: Disable __thread and TLS on x86_64 for nowGunnar Beutner
They're not yet properly supported.
2021-06-28Userland: Set linker max page size to 4096Gunnar Beutner
Neither the kernel nor LibELF support loading libraries with larger PT_LOAD alignment. The default on x86 is 4096 while it's 2MiB on x86_64. This changes the alignment to 4096 on all platforms.
2021-06-25Meta: Run 64-bit kernels with qemu-system-x86_64Gunnar Beutner
2021-06-18Userland/Libraries: Add LibUSBDB libraryJesse Buhagiar
Simple clone of LibPCIDB to support USB IDs instead of PCI ones. The format is basically identical, besides a few changes of the double tab fields.
2021-06-17Meta: Add support for declaring componentsGunnar Beutner
Components are a group of build targets that can be built and installed separately. Whether a component should be built can be configured with CMake arguments: -DBUILD_<NAME>=ON|OFF, where <NAME> is the name of the component (in all caps). Components can be marked as REQUIRED if they're necessary for a minimally functional base system or they can be marked as RECOMMENDED if they're not strictly necessary but are useful for most users. A component can have an optional description which isn't used by the build system but may be useful for a configuration UI. Components specify the TARGETS which should be built when the component is enabled. They can also specify other components which they depend on (with DEPENDS). This also adds the BUILD_EVERYTHING CMake variable which lets the user build all optional components. For now this defaults to ON to make the transition to the components-based build system easier. The list of components is exported as an INI file in the build directory (e.g. Build/i686/components.ini). Fixes #8048.
2021-06-09Meta: Disable -Wmaybe-uninitializedAli Mohammad Pur
It's prone to finding "technically uninitialized but can never happen" cases, particularly in Optional<T> and Variant<Ts...>. The general case seems to be that it cannot infer the dependency between Variant's index (or Optional's boolean state) and a particular alternative (or Optional's buffer) being untouched. So it can flag cases like this: ```c++ if (index == StaticIndexForF) new (new_buffer) F(move(*bit_cast<F*>(old_buffer))); ``` The code in that branch can _technically_ make a partially initialized `F`, but that path can never be taken since the buffer holding an object of type `F` and the condition being true are correlated, and so will never be taken _unless_ the buffer holds an object of type `F`. This commit also removed the various 'diagnostic ignored' pragmas used to work around this warning, as they no longer do anything.
2021-05-31CMake: Hide KMALLOC_VERIFY_NO_SPINLOCK_HELD so folks don't find itBrian Gianforcaro
Since I introduced this functionality there has been a steady stream of people building with `ALL_THE_DEBUG_MACROS` and trying to boot the system, and immediately hitting this assert. I have no idea why people try to build with all the debugging enabled, but I'm tired of seeing the bug reports about asserts we know are going to happen at this point. So I'm hiding this value under the new ENABLE_ALL_DEBUG_FACILITIES flag instead. This is only set by CI, and hopefully no-one will try to build with this thing (It's documented as not recommended). Fixes: #7527
2021-05-31CMake: Verify the GCC host version is new enough to build serenityBrian Gianforcaro
There are lots of people who have issues building serenity because they don't read the build directions closely enough and have an unsupported GCC version as their host compiler. Instead of repeatedly having to answer these kinds of questions, lets just error out upfront.
2021-05-27Userland: Port UBSAN implementation to userspaceAndrew Kaster
Take Kernel/UBSanitizer.cpp and make a copy in LibSanitizer. We can use LibSanitizer to hold other sanitizers as people implement them :^). To enable UBSAN for LibC, DynamicLoader, and other low level system libraries, LibUBSanitizer is built as a serenity_libc, and has a static version for LibCStatic to use. The approach is the same as that taken in Note that this means now UBSAN is enabled for code generators, Lagom, Kernel, and Userspace with -DENABLE_UNDEFINED_SANTIZER=ON. In userspace however, UBSAN is not deadly (yet). Co-authored-by: ForLoveOfCats <ForLoveOfCats@vivaldi.net>
2021-05-27Meta: Run the Wasm spec tests in CIAli Mohammad Pur
Since LibWasm is still not capable of passing all of the spec tests, ignore failing tests, only fail the build if some segfault/abort/etc occurs.
2021-05-27Meta/CI: Add ENABLE_ALL_DEBUG_FACILITIES CMake optionAndrew Kaster
This option replaces the use of ENABLE_ALL_THE_DEBUG_MACROS in CI runs, and enables all debug options that might be broken by developers unintentionally that are only used in specific debugging situations.
2021-05-27Kernel: Add ENABLE_EXTRA_KERNEL_DEBUG_SYMBOLS option to set Og and ggdb3Andrew Kaster
When debugging kernel code, it's necessary to set extra flags. Normal advice is to set -ggdb3. Sometimes that still doesn't provide enough debugging information for complex functions that still get optimized. Compiling with -Og gives the best optimizations for debugging, but can sometimes be broken by changes that are innocuous when the compiler gets more of a chance to look at them. The new CMake option enables both compile options for kernel code.
2021-05-21LibWasm+Meta: Implement instantiation/execution primitives in test-wasmAli Mohammad Pur
This also optionally generates a test suite from the WebAssembly testsuite, which can be enabled via passing `INCLUDE_WASM_SPEC_TESTS` to cmake, which will generate test-wasm-compatible tests and the required fixtures. The generated directories are excluded from git since there's no point in committing them.
2021-05-21LibWasm+Meta: Add test-wasm and optionally test the conformance testsAli Mohammad Pur
This only tests "can it be parsed", but the goal of this commit is to provide a test framework that can be built upon :) The conformance tests are downloaded, compiled* and installed only if the INCLUDE_WASM_SPEC_TESTS cmake option is enabled. (*) Since we do not yet have a wast parser, the compilation is delegated to an external tool from binaryen, `wasm-as`, which is required for the test suite download/install to succeed. This *does* run the tests in CI, but it currently does not include the spec conformance tests.
2021-05-17Build: Stop using precompiled headers (PCH)Andreas Kling
This had very bad interactions with ccache, often leading to rebuilds with 100% cache misses, etc. Ali says it wasn't that big of a speedup in the end anyway, so let's not bother with it. We can always bring it back in the future if it seems like a good idea.
2021-05-16DevTools: Add StateMachineGenerator utilityDaniel Bertalan
This program turns a description of a state machine that takes its input byte-by-byte into C++ code. The state machine is described in a custom format as specified below: ``` // Comments are started by two slashes, and cause the rest of the line // to be ignored @name ExampleStateMachine // sets the name of the generated class @namespace Test // sets the namespace (optional) @begin Begin // sets the state the parser will start in // The rest of the file contains one or more states and an optional // @anywhere directive. Each of these is a curly bracket delimited set // of state transitions. State transitions contain a selector, the // literal "=>" and a (new_state, action) tuple. Examples: // 0x0a => (Begin, PrintLine) // [0x00..0x1f] => (_, Warn) // '_' means no change // [0x41..0x5a] => (BeginWord, _) // '_' means no action // Rules common to all states. These take precedence over rules in the // specific states. @anywhere { 0x0a => (Begin, PrintLine) [0x00..0x1f] => (_, Warn) } Begin { [0x41..0x5a] => (Word, _) [0x61..0x7a] => (Word, _) // For missing values, the transition (_, _) is implied } Word { // The entry action is run when we transition to this state from a // *different* state. @anywhere can't have this @entry IncreaseWordCount 0x09 => (Begin, _) 0x20 => (Begin, _) // The exit action is run before we transition to any *other* state // from here. @anywhere can't have this @exit EndOfWord } ``` The generated code consists of a single class which takes a `Function<Action, u8>` as a parameter in its constructor. This gets called whenever an action is to be done. This is because some input might not produce an action, but others might produce up to 3 (exit, state transition, entry). The actions allow us to build a more advanced parser over the simple state machine. The sole public method, `void advance(u8)`, handles the input byte-by-byte, managing the state changes and requesting the appropriate Action from the handler. Internally, the state transitions are resolved via a lookup table. This is a bit wasteful for more complex state machines, therefore the generator is designed to be easily extendable with a switch-based resolver; only the private `lookup_state_transition` method needs to be re-implemented. My goal for this tool is to use it for implementing a standard-compliant ANSI escape sequence parser for LibVT, as described on <https://vt100.net/emu/dec_ansi_parser>
2021-05-13CMake: Fix message levels for error conditions during configurationBrian Gianforcaro
Make messages which should be fatal, actually fail the build. - FATAL is not a valid mode keyword. The full list is available in the docs: https://cmake.org/cmake/help/v3.19/command/message.html - SEND_ERROR doesn't immediately stop processing, FATAL_ERROR does. We should immediately stop if the Toolchain is not present. - The app icon size validation was just a WARNING that is easy to overlook. We should promote it to a FATAL_ERROR so that people will not overlook the issue when adding a new application. We can only make the small icon message FATAL_ERROR, as there is currently one violation of the medium app icon validation.
2021-05-12Build: Add extlinux-image target to CMakeDolphinChips
2021-05-06Tests: Establish root Tests directory, move Userland/Tests thereBrian Gianforcaro
With the goal of centralizing all tests in the system, this is a first step to establish a Tests sub-tree. It will contain all of the unit tests and test harnesses for the various components in the system.
2021-05-01LibC: Move crypt() and crypt_r() to the right header fileGunnar Beutner
According to POSIX.1 these should be in <crypt.h>.
2021-04-30CMake: Fix building with AppleClang compilerCarlos César Neves Enumo
2021-04-30CMake: Fix building libraries on macOSGunnar Beutner
When building libraries on macOS they'd be missing the SONAME attribute which causes the linker to embed relative paths into other libraries and executables: Dynamic section at offset 0x52794 contains 28 entries: Type Name/Value (NEEDED) Shared library: [libgcc_s.so] (NEEDED) Shared library: [Userland/Libraries/LibCrypt/libcrypt.so] (NEEDED) Shared library: [Userland/Libraries/LibCrypto/libcrypto.so] (NEEDED) Shared library: [Userland/Libraries/LibC/libc.so] (NEEDED) Shared library: [libsystem.so] (NEEDED) Shared library: [libm.so] (NEEDED) Shared library: [libc.so] The dynamic linker then fails to load those libraries which makes the system unbootable.
2021-04-29Kernel: Add a CMake flag to enable LTO for the kernelGunnar Beutner