CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
723 lines
29 KiB
Markdown
723 lines
29 KiB
Markdown
# 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` |
|
|
| LZMA | Lossless data compression | `LLDB_ENABLE_LZMA` |
|
|
| 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` |
|
|
|
|
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}
|
|
There is an [incompatibility](https://github.com/swig/swig/issues/1321) between Python version 3.7 and later
|
|
and swig versions older than 4.0.0 which makes builds of LLDB using debug
|
|
versions of python unusable. This primarily affects Windows, as debug builds of
|
|
LLDB must use debug python as well.
|
|
:::
|
|
|
|
:::{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>
|
|
```
|
|
|
|
It is strongly recommend to use a release build for the compiler to speed up
|
|
test execution.
|
|
|
|
#### 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.
|