| # Building | |
| ## Getting the Sources | |
| Please refer to the [LLVM Getting Started Guide](https://llvm.org/docs/GettingStarted.html#getting-started-with-llvm) for | |
| general instructions on how to check out the LLVM monorepo, which contains the | |
| LLDB sources. | |
| Git browser: <https://github.com/llvm/llvm-project/tree/main/lldb> | |
| ## Preliminaries | |
| LLDB relies on many of the technologies developed by the larger LLVM project. | |
| In particular, it requires both Clang and LLVM itself in order to build. Due to | |
| this tight integration the Getting Started guides for both of these projects | |
| come as prerequisite reading: | |
| - [LLVM](https://llvm.org/docs/GettingStarted.html) | |
| - [Clang](http://clang.llvm.org/get_started.html) | |
| The following requirements are shared on all platforms. | |
| - [CMake](https://cmake.org) | |
| - [Ninja](https://ninja-build.org) (strongly recommended) | |
| If you want to run the test suite, you'll need to build LLDB with Python | |
| scripting support. | |
| - [Python](http://www.python.org/) 3.8 or later (3.11 or later on Windows). | |
| - [SWIG](http://swig.org/) 4 or later. | |
| If you are on FreeBSD or NetBSD, you will need to install `gmake` for building | |
| the test programs. On other platforms `make` is used. | |
| (optional-dependencies)= | |
| ### Optional Dependencies | |
| Although the following dependencies are optional, they have a big impact on | |
| LLDB's functionality. It is strongly encouraged to build LLDB with these | |
| dependencies enabled. | |
| By default they are auto-detected: if CMake can find the dependency it will be | |
| used. It is possible to override this behavior by setting the corresponding | |
| CMake flag to `On` or `Off` to force the dependency to be enabled or | |
| disabled. When a dependency is set to `On` and can't be found it will cause a | |
| CMake configuration error. | |
| | Feature | Description | CMake Flag | | |
| | -------- | ---------------------------------------------------------- | --------------------- | | |
| | Editline | Generic line editing, history, Emacs and Vi bindings | `LLDB_ENABLE_LIBEDIT` | | |
| | Curses | Text user interface | `LLDB_ENABLE_CURSES` | | |
| | Libxml2 | XML | `LLDB_ENABLE_LIBXML2` | | |
| | Python | Python scripting. 3.8 or later (3.11 or later on Windows). | `LLDB_ENABLE_PYTHON` | | |
| | Lua | Lua scripting. Lua 5.3 and 5.4 are supported. | `LLDB_ENABLE_LUA` | | |
| | SWIG | Required for Python or LUA support. Version 4 or later. | N/A | | |
| Depending on your platform and package manager, one might run any of the | |
| commands below. | |
| ``` | |
| $ yum install libedit-devel libxml2-devel ncurses-devel python-devel swig | |
| $ sudo apt-get install build-essential swig python3-dev libedit-dev libncurses5-dev libxml2-dev | |
| $ pkg install swig python libxml2 | |
| $ pkgin install swig python38 cmake ninja-build | |
| $ brew install swig cmake ninja | |
| ``` | |
| :::{note} | |
| Installing multiple versions of Curses, particularly when only one is built with | |
| wide character support, can cause lldb to be linked with an incorrect set of | |
| libraries. If your system already has Curses, we recommend you use that version. | |
| If you do install another one, use a tool like `ldd` to ensure only one version | |
| of Curses is being used in the final `lldb` executable. | |
| ::: | |
| ### Windows | |
| The steps outlined here describe how to set up your system and install the | |
| required dependencies for building and testing LLDB on Windows. They only need | |
| to be performed once. | |
| #### Build Requirements | |
| Please follow the steps below if you only want to **build** lldb. | |
| 1. Install [Visual Studio](https://visualstudio.microsoft.com) with the | |
| "Desktop Development with C++" workload. Make sure that the latest Windows | |
| SDK and the Active Template Library (ATL) are installed. | |
| 2. Install [Git Bash](https://git-scm.com/install/windows) and add | |
| `<Git install dir>\usr\bin` to your `PATH`. Verify that utilities like | |
| `dirname` are available from your terminal. | |
| 3. Install [make](https://sourceforge.net/projects/ezwinports/files/) and | |
| verify that it's in your `PATH`. | |
| 4. Install [Python 3.11](https://www.python.org/downloads/windows/) or later. | |
| Either using the "Windows Installer" or "Python Install Manager". Make sure | |
| `python` is added to your `PATH`. | |
| :::{note} | |
| Building LLDB in debug mode requires a debug version of Python (because | |
| all parts of a debug build must use the debug C runtime). | |
| If you use the "Windows installer", **include the debug libraries** during | |
| the install. | |
| The "Python Install Manager" has no way to install debug libraries, so you | |
| must [build](https://devguide.python.org/getting-started/setup-building/) | |
| a debug version of Python yourself. | |
| ::: | |
| 5. Install [SWIG for Windows](http://www.swig.org/download.html). Make sure | |
| `swig` is added to your `PATH` and that `swig -swiglib` points to the | |
| correct directory. | |
| 6. Register the Debug Interface Access DLLs with the Registry from a privileged | |
| terminal. | |
| ``` | |
| > regsvr32 "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\DIA SDK\bin\msdia140.dll" | |
| > regsvr32 "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\DIA SDK\bin\amd64\msdia140.dll" | |
| ``` | |
| Any command prompt from which you build LLDB should have a valid Visual Studio | |
| environment setup. This means you should open an appropriate [Developer Command | |
| Prompt for VS](https://docs.microsoft.com/en-us/visualstudio/ide/reference/command-prompt-powershell?view=vs-2019) | |
| corresponding to the version you wish to use or run `vcvarsall.bat` or | |
| `VsDevCmd.bat`. | |
| #### Test Requirements | |
| Please follow the steps above and below if you want to **test** {any}`lldb`. | |
| - Install [Python Tools for Visual Studio](https://github.com/Microsoft/PTVS/), | |
| an indispensable debugging extension to Visual Studio which enables full | |
| editing and debugging support for Python (including mixed native/managed | |
| debugging). | |
| ### macOS | |
| - To use the in-tree debug server on macOS, lldb needs to be code signed. For | |
| more information see {ref}`CodeSigning` below. | |
| - If you are building both Clang and LLDB together, be sure to also check out | |
| libc++, which is a required for testing on macOS. | |
| ## Building LLDB with CMake | |
| The LLVM project is migrating to a single monolithic repository for LLVM and | |
| its subprojects. This is the recommended way to build LLDB. Check out the | |
| source-tree with git: | |
| ``` | |
| $ git clone https://github.com/llvm/llvm-project.git | |
| ``` | |
| CMake is a cross-platform build-generator tool. CMake does not build the | |
| project, it generates the files needed by your build tool. The recommended | |
| build tool for LLVM is Ninja, but other generators like Xcode or Visual Studio | |
| may be used as well. Please also read [Building LLVM with CMake](https://llvm.org/docs/CMake.html). | |
| ### Regular in-tree builds | |
| Create a new directory for your build-tree. From there run CMake and point it | |
| to the `llvm` directory in the source-tree: | |
| ``` | |
| $ cmake -G Ninja -DLLVM_ENABLE_PROJECTS="clang;lldb" [<cmake options>] path/to/llvm-project/llvm | |
| ``` | |
| We used the `LLVM_ENABLE_PROJECTS` option here to tell the build-system which | |
| subprojects to build in addition to LLVM (for more options see | |
| {ref}`CommonCMakeOptions` and {ref}`CMakeCaches`). Parts of the LLDB test suite | |
| require `lld`. Add it to the list in order to run all tests. Once CMake is done, | |
| run ninja to perform the actual build. | |
| ``` | |
| $ ninja lldb lldb-server | |
| ``` | |
| If you only want lldb, or are on a platform where lldb-server is not supported, | |
| you can pass just `lldb`. Ninja will only build what is necessary to run the | |
| lldb driver: | |
| ``` | |
| $ ninja lldb | |
| ``` | |
| ### Standalone builds | |
| This is another way to build LLDB. We can use the same source-tree as we | |
| checked out above, but now we will have multiple build-trees: | |
| - the main build-tree for LLDB in `/path/to/lldb-build` | |
| - one or more provided build-trees for LLVM and Clang; for simplicity we use a | |
| single one in `/path/to/llvm-build` | |
| Run CMake with `-B` pointing to a new directory for the provided | |
| build-tree and the positional argument pointing to the `llvm` | |
| directory in the source-tree.{sup}`1` Note that we leave out LLDB here and only include | |
| Clang. Then we build the `ALL` target: | |
| ``` | |
| $ cmake -B /path/to/llvm-build -G Ninja \ | |
| -DCMAKE_BUILD_TYPE=[<build type>] \ | |
| -DLLVM_ENABLE_PROJECTS=clang \ | |
| [<more cmake options>] /path/to/llvm-project/llvm | |
| $ cmake --build /path/to/llvm-build | |
| ``` | |
| Now run CMake a second time with `-B` pointing to a new directory for the | |
| main build-tree and the positional argument pointing to the `lldb` directory | |
| in the source-tree. In order to find the provided build-tree, the build system | |
| looks for the path to its CMake modules in `LLVM_DIR`. If you use a separate | |
| build directory for Clang, remember to pass its module path via `Clang_DIR` | |
| (CMake variables are case-sensitive!): | |
| ``` | |
| $ cmake -B /path/to/lldb-build -G Ninja \ | |
| -DCMAKE_BUILD_TYPE=[<build type>] \ | |
| -DLLVM_DIR=/path/to/llvm-build/lib/cmake/llvm \ | |
| [<more cmake options>] /path/to/llvm-project/lldb | |
| $ cmake --build /path/to/lldb-build -t lldb lldb-server | |
| ``` | |
| If you do not require or cannot build `lldb-server` on your platform, simply | |
| remove it from the Ninja command. | |
| :::{note} | |
| 1. If you want to have a standalone LLDB build with tests enabled, you also | |
| need to pass in `-DLLVM_ENABLE_RUNTIME='libcxx;libcxxabi;libunwind'` to your CMake invocation when configuring your LLVM standalone build. | |
| ::: | |
| (commoncmakeoptions)= | |
| ### Common CMake options | |
| Following is a description of some of the most important CMake variables which | |
| you are likely to encounter. A variable FOO is set by adding `-DFOO=value` to | |
| the CMake command line. | |
| If you want to debug the lldb that you're building -- that is, build it with | |
| debug info enabled -- pass two additional arguments to cmake before running | |
| ninja: | |
| ``` | |
| $ cmake -G Ninja \ | |
| -DLLDB_EXPORT_ALL_SYMBOLS=1 \ | |
| -DCMAKE_BUILD_TYPE=Debug | |
| <path to root of llvm source tree> | |
| ``` | |
| If you want to run the test suite, you will need a compiler to build the test | |
| programs. If you have Clang checked out, that will be used by default. | |
| Alternatively, you can specify a C and C++ compiler to be used by the test | |
| suite. | |
| ``` | |
| $ cmake -G Ninja \ | |
| -DLLDB_TEST_COMPILER=<path to C compiler> \ | |
| <path to root of llvm source tree> | |
| ``` | |
| :::{note} | |
| `LLDB_TEST_COMPILER` points to a single compiler. It is expected that this is | |
| the C compiler and that the C++ compiler's name can be inferred from the name | |
| of the C compiler. | |
| ::: | |
| It is strongly recommend to use a release build for the compiler to speed up | |
| test execution. | |
| #### Script Interpreter Plugins | |
| LLDB's script interpreter plugins (for Python and Lua) can be built as static | |
| or dynamic libraries. This is controlled by | |
| `LLDB_ENABLE_DYNAMIC_SCRIPTINTERPRETERS`, which defaults to `ON` on masOS and | |
| FreeBSD, and `OFF` everywhere else. | |
| `LLDB_ENABLE_PYTHON_LIMITED_API` makes LLDB use the Python | |
| [Limited API](https://docs.python.org/3/c-api/stable.html). It defaults to `ON` | |
| when using SWIG 4.2 or later. | |
| When both of these options are enabled, LLDB can use, and be used from, a | |
| different version of Python (3.8 or later) than it was built against. Note that | |
| on Windows, `LLDB_ENABLE_DYNAMIC_SCRIPTINTERPRETERS` is not required. | |
| #### Windows | |
| On Windows the LLDB test suite requires lld. Either add `lld` to | |
| `LLVM_ENABLE_PROJECTS` or disable the test suite with | |
| `LLDB_INCLUDE_TESTS=OFF`. | |
| Although the following CMake variables are by no means Windows specific, they | |
| are commonly used on Windows. | |
| - `LLDB_TEST_DEBUG_TEST_CRASHES` (Default=0): If set to 1, will cause Windows | |
| to generate a crash dialog whenever lldb.exe or the python extension module | |
| crashes while running the test suite. If set to 0, LLDB will silently crash. | |
| Setting to 1 allows a developer to attach a JIT debugger at the time of a | |
| crash, rather than having to reproduce a failure or use a crash dump. | |
| - `PYTHON_HOME` (Required): Path to the folder where the Python distribution | |
| is installed. For example, `C:\Python35`. | |
| - `LLDB_EMBED_PYTHON_HOME` (Default=1 on Windows): When this is 1, LLDB will bind | |
| statically to the location specified in the `PYTHON_HOME` CMake variable, | |
| ignoring any value of `PYTHONHOME` set in the environment. This is most | |
| useful for developers who simply want to run LLDB after they build it. If you | |
| wish to move a build of LLDB to a different machine where Python will be in a | |
| different location, setting `LLDB_EMBED_PYTHON_HOME` to 0 will cause | |
| Python to use its default mechanism for finding the python installation at | |
| runtime (looking for installed Pythons, or using the `PYTHONHOME` | |
| environment variable if it is specified). | |
| Sample command line: | |
| ``` | |
| $ cmake -G Ninja^ | |
| -DLLDB_TEST_DEBUG_TEST_CRASHES=1^ | |
| -DPYTHON_HOME=C:\Python35^ | |
| -DLLDB_TEST_COMPILER=d:\src\llvmbuild\ninja_release\bin\clang.exe^ | |
| <path to root of llvm source tree> | |
| ``` | |
| Building with ninja is both faster and simpler than building with Visual Studio, | |
| but chances are you still want to debug LLDB with an IDE. One solution is to run | |
| cmake twice and generate the output into two different folders. One for | |
| compiling (the ninja folder), and one for editing, browsing and debugging. | |
| Follow the previous instructions in one directory, and generate a Visual Studio | |
| project in another directory. | |
| ``` | |
| $ cmake -G "Visual Studio 16 2019" -A x64 -T host=x64 <cmake variables> <path to root of llvm source tree> | |
| ``` | |
| Then you can open the .sln file in Visual Studio, set lldb as the startup | |
| project, and use F5 to run it. You need only edit the project settings to set | |
| the executable and the working directory to point to binaries inside of the | |
| ninja tree. | |
| #### macOS | |
| On macOS the LLDB test suite requires libc++. Either add | |
| `LLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind"` or disable the test suite with | |
| `LLDB_INCLUDE_TESTS=OFF`. Further useful options: | |
| - `LLDB_BUILD_FRAMEWORK:BOOL`: Builds the LLDB.framework. | |
| - `LLDB_CODESIGN_IDENTITY:STRING`: Set the identity to use for code-signing | |
| all executables. If not explicitly specified, only `debugserver` will be | |
| code-signed with identity `lldb_codesign` (see {ref}`CodeSigning`). | |
| - `LLDB_USE_SYSTEM_DEBUGSERVER:BOOL`: Use the system's debugserver, so lldb is | |
| functional without setting up code-signing. | |
| - `LLDB_ENFORCE_STRICT_TEST_REQUIREMENTS:BOOL`: Detect missing packages or modules at configuration time. | |
| (cmakecaches)= | |
| ### CMake caches | |
| CMake caches allow to store common sets of configuration options in the form of | |
| CMake scripts and can be useful to reproduce builds for particular use-cases | |
| (see by analogy [usage in LLVM and Clang](https://llvm.org/docs/AdvancedBuilds.html)). | |
| A cache is passed to CMake with the `-C` flag, following the absolute path to | |
| the file on disk. Subsequent `-D` options are still allowed. Please find the | |
| currently available caches in the [lldb/cmake/caches/](https://github.com/llvm/llvm-project/tree/main/lldb/cmake/caches) | |
| directory. | |
| #### Common configurations on macOS | |
| Build, test and install a distribution of LLDB from the [monorepo](https://github.com/llvm/llvm-project) (see also [Building a Distribution of | |
| LLVM](https://llvm.org/docs/BuildingADistribution.html)): | |
| ``` | |
| $ git clone https://github.com/llvm/llvm-project | |
| $ cmake -B /path/to/lldb-build -G Ninja \ | |
| -C /path/to/llvm-project/lldb/cmake/caches/Apple-lldb-macOS.cmake \ | |
| -DLLVM_ENABLE_PROJECTS="clang;lldb" \ | |
| -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind" \ | |
| llvm-project/llvm | |
| $ DESTDIR=/path/to/lldb-install ninja -C /path/to/lldb-build check-lldb install-distribution | |
| ``` | |
| (cmakegeneratedxcodeproject)= | |
| Build LLDB standalone for development with Xcode: | |
| ``` | |
| $ git clone https://github.com/llvm/llvm-project | |
| $ cmake -B /path/to/llvm-build -G Ninja \ | |
| -C /path/to/llvm-project/lldb/cmake/caches/Apple-lldb-base.cmake \ | |
| -DLLVM_ENABLE_PROJECTS="clang" \ | |
| -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind" \ | |
| llvm-project/llvm | |
| $ ninja -C /path/to/llvm-build | |
| $ cmake -B /path/to/lldb-build \ | |
| -C /path/to/llvm-project/lldb/cmake/caches/Apple-lldb-Xcode.cmake \ | |
| -DLLVM_DIR=/path/to/llvm-build/lib/cmake/llvm \ | |
| llvm-project/lldb | |
| $ open lldb.xcodeproj | |
| $ cmake --build /path/to/lldb-build --target check-lldb | |
| ``` | |
| :::{note} | |
| The `-B` argument was undocumented for a while and is only officially | |
| supported since [CMake version 3.14](https://cmake.org/cmake/help/v3.14/release/3.14.html#command-line) | |
| ::: | |
| ## Building the Documentation | |
| If you wish to build the optional (reference) documentation, additional | |
| dependencies are required: | |
| - Sphinx (for the website and the Python API reference) | |
| - Graphviz (for the 'dot' tool) | |
| - doxygen (if you wish to build the C++ API reference) | |
| - SWIG (for generating Python bindings) | |
| To install the system prerequisites for building the documentation (on Debian/Ubuntu) | |
| do: | |
| ``` | |
| $ sudo apt-get install doxygen graphviz swig | |
| ``` | |
| To install Sphinx and its dependencies, use the `requirements.txt` available within LLVM | |
| to ensure you get a working configuration: | |
| ``` | |
| $ pip3 install -r /path/to/llvm-project/llvm/docs/requirements.txt | |
| ``` | |
| To build the documentation, configure with `LLVM_ENABLE_SPHINX=ON` and build the desired target(s). | |
| ``` | |
| $ ninja docs-lldb-html | |
| $ ninja docs-lldb-man | |
| $ ninja lldb-cpp-doc | |
| ``` | |
| ## Cross-compiling LLDB | |
| The advice presented here may not be complete or represent the best practices | |
| of CMake at this time. Please refer to [CMake's documentation](https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html) | |
| if you have any doubts or want more in depth information. | |
| In order to debug remote targets running different architectures than your | |
| host, you will need to compile LLDB (or at least the server component | |
| `lldb-server`) for the target. While the easiest solution is to compile it | |
| locally on the target, this is often not feasible, and in these cases you will | |
| need to cross-compile LLDB on your host. | |
| Cross-compilation is often a daunting task and has a lot of quirks which depend | |
| on the exact host and target architectures, so it is not possible to give a | |
| universal guide which will work on all platforms. However, here we try to | |
| provide an overview of the cross-compilation process along with the main things | |
| you should look out for. | |
| First, you will need a working toolchain which is capable of producing binaries | |
| for the target architecture. Since you already have a checkout of clang and | |
| lldb, you can compile a host version of clang in a separate folder and use | |
| that. Alternatively you can use system clang or even cross-gcc if your | |
| distribution provides such packages (e.g., `g++-aarch64-linux-gnu` on | |
| Ubuntu). | |
| Next, you will need a copy of the required target headers and libraries on your | |
| host. The libraries can be usually obtained by copying from the target machine, | |
| however the headers are often not found there, especially in case of embedded | |
| platforms. In this case, you will need to obtain them from another source, | |
| either a cross-package if one is available, or cross-compiling the respective | |
| library from source. Fortunately the list of LLDB dependencies is not big and | |
| if you are only interested in the server component, you can reduce this even | |
| further by passing the appropriate cmake options, such as: | |
| ``` | |
| -DLLDB_ENABLE_PYTHON=0 | |
| -DLLDB_ENABLE_LIBEDIT=0 | |
| -DLLDB_ENABLE_CURSES=0 | |
| ``` | |
| (see {ref}`optional-dependencies` for more) | |
| In this case you, will often not need anything other than the standard C and | |
| C++ libraries. | |
| If you find that CMake is finding a version of an optional dependency that | |
| for whatever reason doesn't work, consider simply disabling it if you don't | |
| know that you need it. | |
| Once all of the dependencies are in place, you need to configure the build | |
| system with the locations and arguments of all the necessary tools. | |
| There are 2 ways to do this depending on your starting point and requirements. | |
| 1\. If you are starting from scratch and only need the resulting cross compiled | |
| binaries, you can have LLVM build the native tools for you. | |
| 2\. If you need a host build too, or already have one, you can tell CMake where | |
| that is and it will use those native tools instead. | |
| If you are going to run `lldb` and `lldb-server` only on the target machine, | |
| choose option 1. If you are going to run `lldb` on the host machine and | |
| connect to `lldb-server` on the target, choose option 2. | |
| Either way, the most important cmake options when cross-compiling are: | |
| - `CMAKE_SYSTEM_NAME` and `CMAKE_SYSTEM_PROCESSOR`: This tells CMake what | |
| the build target is and from this it will infer that you are cross compiling. | |
| - `CMAKE_C_COMPILER`, `CMAKE_CXX_COMPILER` : C and C++ compilers for the | |
| target architecture. | |
| - `CMAKE_C_FLAGS`, `CMAKE_CXX_FLAGS` : The flags for the C and C++ target | |
| compilers. You may need to specify the exact target cpu and ABI besides the | |
| include paths for the target headers. | |
| - `CMAKE_EXE_LINKER_FLAGS` : The flags to be passed to the linker. Usually | |
| this is a list of library search paths referencing the target libraries. | |
| - `LLVM_HOST_TRIPLE` : The triple of the system that lldb (or lldb-server) | |
| will run on. Not setting this (or setting it incorrectly) can cause a lot of | |
| issues with remote debugging as a lot of the choices lldb makes depend on the | |
| triple reported by the remote platform. | |
| - `LLVM_NATIVE_TOOL_DIR` (only when using an existing host build): Is a | |
| path to the llvm tools compiled for the host. Any tool that must be run on the | |
| host during a cross build will be configured from this path, so you do not | |
| need to set them all individually. If you are doing a host build only for the | |
| purpose of a cross build, you will need it to include at least | |
| `llvm-tblgen`, `clang-tblgen` and `lldb-tblgen`. Be aware that | |
| the list may grow over time. | |
| - `CMAKE_LIBRARY_ARCHITECTURE` : Affects the cmake search path when looking | |
| for libraries. You may need to set this to your architecture triple if you do | |
| not specify all your include and library paths explicitly. | |
| To find the possible values of the `CMAKE_*` options, please refer to the | |
| CMake documentation. | |
| You can of course also specify the usual cmake options like | |
| `CMAKE_BUILD_TYPE`, etc. | |
| For testing, you may want to set one of: | |
| - `LLDB_TEST_COMPILER` : The compiler used to build programs used | |
| in the test suite. If you are also building clang, this will be used | |
| but if you want to test remotely from the host, you should choose the | |
| cross compiler you are using for the cross build. | |
| - `LLDB_INCLUDE_TESTS=0` : To disable the tests completely. | |
| ### Example 1: Cross-compiling for linux arm64 on Ubuntu host | |
| Ubuntu already provides the packages necessary to cross-compile LLDB for arm64. | |
| It is sufficient to install packages `gcc-aarch64-linux-gnu`, | |
| `g++-aarch64-linux-gnu`, `binutils-aarch64-linux-gnu`. | |
| Configure as follows: | |
| ``` | |
| cmake <path-to-monorepo>/llvm-project/llvm -G Ninja \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DLLVM_ENABLE_PROJECTS="clang;lld;lldb" \ | |
| -DCMAKE_SYSTEM_NAME=Linux \ | |
| -DCMAKE_SYSTEM_PROCESSOR=AArch64 \ | |
| -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc \ | |
| -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \ | |
| -DLLVM_HOST_TRIPLE=aarch64-unknown-linux-gnu \ | |
| -DLLDB_ENABLE_PYTHON=0 \ | |
| -DLLDB_ENABLE_LIBEDIT=0 \ | |
| -DLLDB_ENABLE_CURSES=0 | |
| ``` | |
| During this build native tools will be built automatically when they are needed. | |
| The contents of `<build dir>/bin` will be target binaries as you'd expect. | |
| AArch64 binaries in this case. | |
| ### Example 2: Cross-compiling for linux arm64 on Ubuntu host using an existing host build | |
| This build requires an existing host build that includes the required native | |
| tools. Install the compiler as in example 1 then run CMake as follows: | |
| ``` | |
| cmake <path-to-monorepo>/llvm-project/llvm -G Ninja \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DLLVM_ENABLE_PROJECTS="clang;lld;lldb" \ | |
| -DCMAKE_SYSTEM_NAME=Linux \ | |
| -DCMAKE_SYSTEM_PROCESSOR=AArch64 \ | |
| -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc \ | |
| -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \ | |
| -DLLVM_HOST_TRIPLE=aarch64-unknown-linux-gnu \ | |
| -DLLVM_NATIVE_TOOL_DIR=<path-to-host>/bin/ \ | |
| -DLLDB_ENABLE_PYTHON=0 \ | |
| -DLLDB_ENABLE_LIBEDIT=0 \ | |
| -DLLDB_ENABLE_CURSES=0 | |
| ``` | |
| The only difference from example 1 is the addition of | |
| `DLLVM_NATIVE_TOOL_DIR` pointing to your existing host build. | |
| An alternative (and recommended) way to compile LLDB is with clang. | |
| Unfortunately, clang is not able to find all the include paths necessary for a | |
| successful cross-compile, so we need to help it with a couple of CFLAGS | |
| options. In my case it was sufficient to add the following arguments to | |
| `CMAKE_C_FLAGS` and `CMAKE_CXX_FLAGS` (in addition to changing | |
| `CMAKE_C(XX)_COMPILER` to point to clang compilers): | |
| ``` | |
| -target aarch64-linux-gnu \ | |
| -I /usr/aarch64-linux-gnu/include/c++/4.8.2/aarch64-linux-gnu \ | |
| -I /usr/aarch64-linux-gnu/include | |
| ``` | |
| If you wanted to build a full version of LLDB and avoid passing | |
| `-DLLDB_ENABLE_PYTHON=0` and other options, you would need to obtain the | |
| target versions of the respective libraries. The easiest way to achieve this is | |
| to use the qemu-debootstrap utility, which can prepare a system image using | |
| qemu and chroot to simulate the target environment. Then you can install the | |
| necessary packages in this environment (python-dev, libedit-dev, etc.) and | |
| point your compiler to use them using the correct -I and -L arguments. | |
| ### Example 3: Cross-compiling for Android on Linux | |
| In the case of Android, the toolchain and all required headers and libraries | |
| are available in the Android NDK. | |
| The NDK also contains a cmake toolchain file, which makes configuring the build | |
| much simpler. The compiler, include and library paths will be configured by the | |
| toolchain file and all you need to do is to select the architecture | |
| (ANDROID_ABI) and platform level (`ANDROID_PLATFORM`, should be at least 21). | |
| You will also need to set `ANDROID_ALLOW_UNDEFINED_SYMBOLS=On`, as the | |
| toolchain file defaults to "no undefined symbols in shared libraries", which is | |
| not compatible with some llvm libraries. The first version of NDK which | |
| supports this approach is r14. | |
| For example, the following arguments are sufficient to configure an android | |
| arm64 build: | |
| ``` | |
| -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake \ | |
| -DANDROID_ABI=arm64-v8a \ | |
| -DANDROID_PLATFORM=android-21 \ | |
| -DANDROID_ALLOW_UNDEFINED_SYMBOLS=On \ | |
| -DLLVM_HOST_TRIPLE=aarch64-unknown-linux-android \ | |
| -DCROSS_TOOLCHAIN_FLAGS_NATIVE='-DCMAKE_C_COMPILER=cc;-DCMAKE_CXX_COMPILER=c++' | |
| ``` | |
| Note that currently only lldb-server is functional on android. The lldb client | |
| is not supported and unlikely to work. | |
| ### Example 4: Cross-compiling for FreeBSD arm64 on FreeBSD host using distset | |
| Start by identifying the FreeBSD version you want to target — in this case, | |
| FreeBSD 15.0. | |
| Download and decompress the FreeBSD 15.0 distset: | |
| ``` | |
| fetch https://download.freebsd.org/releases/arm64/15.0-RELEASE/base.txz | |
| sudo mkdir -p /path/to/sysroot/arm64 | |
| sudo tar -xJf base.txz -C /path/to/sysroot/arm64 | |
| ``` | |
| Then configure with CMake as follows: | |
| ``` | |
| cmake <path-to-monorepo>/llvm-project/llvm -G Ninja \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DLLVM_ENABLE_PROJECTS="clang;lldb" \ | |
| -DCMAKE_SYSTEM_NAME=FreeBSD \ | |
| -DCMAKE_SYSTEM_PROCESSOR=AArch64 \ | |
| -DCMAKE_ASM_FLAGS_INIT="-target aarch64-unknown-freebsd15.0 --sysroot /path/to/sysroot/arm64" \ | |
| -DCMAKE_C_FLAGS_INIT="-target aarch64-unknown-freebsd15.0 --sysroot /path/to/sysroot/arm64" \ | |
| -DCMAKE_CXX_FLAGS_INIT="-target aarch64-unknown-freebsd15.0 --sysroot /path/to/sysroot/arm64" \ | |
| -DCMAKE_FIND_ROOT_PATH="/path/to/sysroot/arm64" \ | |
| -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \ | |
| -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \ | |
| -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY \ | |
| -DLLVM_DEFAULT_TARGET_TRIPLE=aarch64-unknown-freebsd15.0 \ | |
| -DLLVM_HOST_TRIPLE=aarch64-unknown-freebsd15.0 \ | |
| -DLLVM_TARGET_ARCH=AArch64 | |
| ``` | |
| ## Verifying Python Support | |
| LLDB has a Python scripting capability and supplies its own Python module named | |
| lldb. If a script is run inside the command line lldb application, the Python | |
| module is made available automatically. However, if a script is to be run by a | |
| Python interpreter outside the command line application, the `PYTHONPATH` | |
| environment variable can be used to let the Python interpreter find the lldb | |
| module. | |
| The correct path can be obtained by invoking the command line lldb tool with | |
| the -P flag: | |
| ``` | |
| $ export PYTHONPATH=`$llvm/build/Debug+Asserts/bin/lldb -P` | |
| ``` | |
| If you used a different build directory or made a release build, you may need | |
| to adjust the above to suit your needs. To test that the lldb Python module is | |
| built correctly and is available to the default Python interpreter, run: | |
| ``` | |
| $ python -c 'import lldb' | |
| ``` | |
| Make sure you're using the Python interpreter that matches the Python library | |
| you linked against. For more details please refer to the {ref}`caveats | |
| <python_caveat>`. | |
| (codesigning)= | |
| ## Code Signing on macOS | |
| To use the in-tree debug server on macOS, lldb needs to be code signed. The | |
| Debug, DebugClang and Release builds are set to code sign using a code signing | |
| certificate named `lldb_codesign`. | |
| Automatic setup, run: | |
| - `scripts/macos-setup-codesign.sh` | |
| Note that it's possible to build and use lldb on macOS without setting up code | |
| signing by using the system's debug server. To configure lldb in this way with | |
| cmake, specify `-DLLDB_USE_SYSTEM_DEBUGSERVER=ON`. | |
| If you have re-installed a new OS, please delete all old `lldb_codesign` items | |
| from your keychain. There will be a code signing certification and a public | |
| and private key. Reboot after deleting them. You will also need to delete and | |
| build folders that contained old signed items. The darwin kernel will cache | |
| code signing using the executable's file system node, so you will need to | |
| delete the file so the kernel clears its cache. | |
| When you build your LLDB for the first time, the Xcode GUI will prompt you for | |
| permission to use the `lldb_codesign` keychain. Be sure to click "Always | |
| Allow" on your first build. From here on out, the `lldb_codesign` will be | |
| trusted and you can build from the command line without having to authorize. | |
| Also the first time you debug using a LLDB that was built with this code | |
| signing certificate, you will need to authenticate once. |