Ninja build targets
TheMeta/ladybird.py script provides an abstraction over the build targets which are made available by CMake. The following build targets cannot be accessed through the script and have to be used directly by changing the current directory to Build/release and then running ninja <target>:
ninja check-style: Runs the same linters the CI does to verify project style on changed filesninja lint-shell-scripts: Checks style of shell scripts in the source tree with shellcheckninja all_generated: Builds all generated code. Useful for running analysis tools that can use compile_commands.json without a full system build
CMake build options
There are optional features that can be enabled during compilation for specific types of development work or to introduce experimental features.Sanitizers
Sanitizers add runtime checks and may significantly impact performance.
ENABLE_ADDRESS_SANITIZER: Builds in runtime checks for memory corruption bugs (like buffer overflows and memory leaks) in Lagom test casesENABLE_MEMORY_SANITIZER: Enables runtime checks for uninitialized memory accesses in Lagom test casesENABLE_UNDEFINED_SANITIZER: Builds in runtime checks for undefined behavior (like null pointer dereferences and signed integer overflows) in Lagom and LadybirdUNDEFINED_BEHAVIOR_IS_FATAL: Makes all undefined behavior sanitizer errors non-recoverable. This option reduces the performance overhead ofENABLE_UNDEFINED_SANITIZER
Fuzzers
ENABLE_FUZZERS: Builds fuzzers for various parts of the systemENABLE_FUZZERS_LIBFUZZER: Builds Clang libFuzzer-based fuzzers for various parts of the systemENABLE_FUZZERS_OSSFUZZ: Builds OSS-Fuzz compatible fuzzers for various parts of the system
Debug options
ENABLE_ALL_THE_DEBUG_MACROS: Used for checking whether debug code compiles on CI. This should not be set normally, as it clutters the console output and makes the system run very slowly. Instead, enable only the needed debug macros, as described belowENABLE_COMPILETIME_FORMAT_CHECK: Checks for the validity ofstd::format-style format string during compilation. Enabled by default
Many parts of the codebase have debug functionality via
<component_name>_DEBUG macros, which can be enabled individually at build time. They are listed in Meta/CMake/all_the_debug_macros.cmake.Build configuration
ENABLE_COMPILER_EXPLORER_BUILD: Skip building non-library entities in Lagom (this only applies to Lagom)LAGOM_TOOLS_ONLY: Skips building libraries, utilities and tests for Lagom. Mostly only useful for cross-compilationLADYBIRD_CACHE_DIR: Sets the location of a shared cache of downloaded files. Should not need to be set manually unless managing a distribution packageENABLE_NETWORK_DOWNLOADS: Allows downloading files from the internet during the build. Default on, turning off enables offline builds. For offline builds, the structure of the LADYBIRD_CACHE_DIR must be set up the way that the build expects
Testing
INCLUDE_WASM_SPEC_TESTS: Downloads and includes the WebAssembly spec testsuite tests. In order to use this option, you will need to installprettierandwasm-toolsINCLUDE_FLAC_SPEC_TESTS: Downloads and includes the xiph.org FLAC test suite
Clang plugins
ENABLE_CLANG_PLUGINS: Enables Clang plugins which analyze the code for programming mistakes. See Clang Plugins below
CMake cache manipulation
CMake caches variables and options in the binary directory. This allows a developer to tailor variables that areset() within the persistent configuration cache.
There are three main ways to manipulate the cache:
cmake path/to/binary/dir -DVAR_NAME=Valueccmake(TUI interface)cmake-gui
cmake invocation that creates the binary directory to set the initial cache for the binary directory. Once the binary directory exists, any of the three options above can be used to change the value of cache variables.
Example: Enabling debug macros
Boolean options such asENABLE_<setting> or <component_name>_DEBUG can be enabled with the value ON and disabled with OFF:
For more information on how the CMake cache works, see the CMake guide for Running CMake. Additional context is available in the CMake documentation for variables and set().
Clang-format updates
Some OS distributions don’t ship bleeding-edge clang-format binaries. Below are 2 options to acquire an updated clang-format tool:LLVM apt repositories (Debian-based)
Use the LLVM apt repositories to install the latest release of clang-format.
Compile from source
Compile LLVM from source as described in the LLVM documentation here.
Clangd configuration
Clangd will automatically look for configuration information in files named.clangd in each of the parent directories of the file being edited. The Ladybird source code repository has a top-level .clangd configuration file in the root directory.
One of the configuration stanzas in that file specifies the location for a compilation database. Depending on your build configuration (e.g., Debug, default, Sanitizer, etc.), the path to the compilation database in that file may not be correct.
Clang plugins
Clang plugins are used to validate the code at compile time. Currently, they are used to detect JavaScript-related garbage collection faux pas, such as neglecting to visit a garbage-collected type.Prerequisites
In order to enable Clang plugins, you will need Clang’s development headers installed. For example, on Ubuntu this is thelibclang-dev package.
ccache configuration
When Clang plugins are enabled, it is recommended to have the following environment variable set for ccache:Building the Flatpak
Ladybird has an in-tree Flatpak manifest that can be used to build a Flatpak package for Ladybird. The recommended way to build the Flatpak is to use theflatpak-builder tool.
Configure Flatpak
See the Flatpak setup documentation on how to configure your environment for user Flatpak builds, and to configure the Flathub repo.
Debugging the Flatpak
You can pass the--devel and --command=sh flags to flatpak run. This will drop you into a shell in the Flatpak sandbox:
Debugging without optimizations
It’s possible that when trying to inspect certain frame variables in your debugger, you’ll get an error similar to:Disable compiler optimizations
Apply the patch
At your command-line prompt in your shell environment, copy and paste the following:That will patch the build config in such a way as to disable all compiler optimizations and make all debug symbols always available.
Tell git to ignore the change