| (build_and_test)= |
| |
| # Building and Testing the libc |
| |
| ## Build modes |
| |
| The libc can be built and tested in two different modes: |
| |
| 1. **The overlay mode** - In this mode, one uses the static archive from LLVM's |
| libc along with the system libc. See {ref}`overlay_mode` for more details |
| on building and using the libc in this mode. You can only run the libc |
| unittests in this mode. To run them, one simply does: |
| |
| ```sh |
| $> ninja check-libc |
| ``` |
| |
| Note that, unittests for only those functions which are part of the overlay |
| static archive will be run with the above command. |
| |
| 2. **The full build mode** - In this mode, the libc is used as the only libc |
| for the user's application. See {ref}`full_host_build` for more details on |
| building and using the libc in this mode. Once configured for a full libc |
| build, you can run three kinds of tests: |
| |
| 1. Unit tests - You can run unittests by the command: |
| |
| ```sh |
| $> ninja check-libc |
| ``` |
| |
| 2. Integration tests - You can run integration tests by the command: |
| |
| ```sh |
| $> ninja libc-integration-tests |
| ``` |
| |
| 3. Shared tests - You can run tests for shared, standalone components (like math primitives) without needing the full libc runtime by the command: |
| |
| ```sh |
| $> ninja libc-shared-tests |
| ``` |
| |
| ## Building with VSCode |
| |
| As a quickstart to using VSCode for development, install the cmake extension |
| and put the following in your settings.json file: |
| |
| ```javascript |
| { |
| "cmake.sourceDirectory": "${workspaceFolder}/runtimes", |
| "cmake.configureSettings": { |
| "LLVM_ENABLE_RUNTIMES" : ["libc", "compiler-rt"], |
| "LLVM_LIBC_FULL_BUILD" : true, |
| "LLVM_ENABLE_SPHINX" : true, |
| "LIBC_INCLUDE_DOCS" : true, |
| "LLVM_LIBC_INCLUDE_SCUDO" : true, |
| "COMPILER_RT_BUILD_SCUDO_STANDALONE_WITH_LLVM_LIBC": true, |
| "COMPILER_RT_BUILD_GWP_ASAN" : false, |
| "COMPILER_RT_SCUDO_STANDALONE_BUILD_SHARED" : false, |
| "CMAKE_EXPORT_COMPILE_COMMANDS" : true, |
| "LIBC_CMAKE_VERBOSE_LOGGING" : true |
| } |
| } |
| ``` |
| |
| ## Building with Bazel |
| |
| 1. To build with Bazel, use the following command: |
| |
| ```sh |
| $> bazel build --config=generic_clang @llvm-project//libc/... |
| ``` |
| |
| 1. To run the unit tests with bazel, use the following command: |
| |
| ```sh |
| $> bazel test --config=generic_clang @llvm-project//libc/... |
| ``` |
| |
| 1. The bazel target layout of `libc` is located at: [utils/bazel/llvm-project-overlay/libc/BUILD.bazel](https://github.com/llvm/llvm-project/tree/main/utils/bazel/llvm-project-overlay/libc/BUILD.bazel). |
| |
| ## Building in a container for a different architecture |
| |
| [Podman](https://podman.io/) can be used together with |
| [QEMU](https://www.qemu.org/) to run container images built for architectures |
| other than the host's. This can be used to build and test the libc on other |
| supported architectures for which you do not have access to hardware. It can |
| also be used if the hardware is slower than emulation of its architecture on a |
| more powerful machine under a different architecture. |
| |
| As an example, to build and test in a container for 32-bit Arm: |
| |
| 1. To install the necessary packages on Arch Linux: |
| |
| ```sh |
| $> pacman -S podman qemu-user-static qemu-user-static-binfmt \ |
| qemu-system-arm |
| ``` |
| |
| 2. To run Bash interactively in an Ubuntu 22.04 container for 32-bit Arm and |
| bind-mount an existing checkout of llvm-project on the host: |
| |
| ```sh |
| $> podman run -it \ |
| -v </host/path/to/llvm-project>:</container/path/to/llvm-project> \ |
| --arch arm docker.io/ubuntu:jammy bash |
| ``` |
| |
| 3. Install necessary packages, invoke CMake, build, and run tests. |
| |
| ## Building and Testing with an Emulator |
| |
| If you are cross-compiling the libc for a different architecture, you can use an emulator |
| such as QEMU to run the tests directly on your host without a container. See |
| {ref}`full_cross_build` for detailed instructions on configuring CMake to use an emulator. |