You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
606 lines
24 KiB
606 lines
24 KiB
4 months ago
|
Building
|
||
|
========
|
||
|
|
||
|
.. contents::
|
||
|
:local:
|
||
|
|
||
|
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/master/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/>`_
|
||
|
* `SWIG <http://swig.org/>`_ 2 or later.
|
||
|
|
||
|
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 | ``LLDB_ENABLE_PYTHON`` |
|
||
|
+-------------------+------------------------------------------------------+--------------------------+
|
||
|
| Lua | Lua scripting | ``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 subversion swig python3-dev libedit-dev libncurses5-dev
|
||
|
> pkg install swig python
|
||
|
> pkgin install swig python27 cmake ninja-build
|
||
|
> brew install swig cmake ninja
|
||
|
|
||
|
Note that there's 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.
|
||
|
|
||
|
Windows
|
||
|
*******
|
||
|
|
||
|
* Visual Studio 2017.
|
||
|
* The latest Windows SDK.
|
||
|
* The Active Template Library (ATL).
|
||
|
* `GnuWin32 <http://gnuwin32.sourceforge.net/>`_ for CoreUtils and Make.
|
||
|
* `Python 3 <https://www.python.org/downloads/windows/>`_. Make sure to (1) get
|
||
|
the x64 variant if that's what you're targetting and (2) install the debug
|
||
|
library if you want to build a debug lldb.
|
||
|
* `Python Tools for Visual Studio
|
||
|
<https://github.com/Microsoft/PTVS/releases>`_. If you plan to debug test
|
||
|
failures or even write new tests at all, PTVS is an indispensable debugging
|
||
|
extension to VS that enables full editing and debugging support for Python
|
||
|
(including mixed native/managed debugging).
|
||
|
|
||
|
The steps outlined here describes how to set up your system and install the
|
||
|
required dependencies such that they can be found when needed during the build
|
||
|
process. They only need to be performed once.
|
||
|
|
||
|
#. Install Visual Studio with the Windows SDK and ATL components.
|
||
|
#. Install GnuWin32, making sure ``<GnuWin32 install dir>\bin`` is added to
|
||
|
your PATH environment variable. Verify that utilities like ``dirname`` and
|
||
|
``make`` are available from your terminal.
|
||
|
#. Install SWIG for Windows, making sure ``<SWIG install dir>`` is added to
|
||
|
your PATH environment variable. Verify that ``swig`` is available from your
|
||
|
terminal.
|
||
|
#. Register the Debug Interface Access DLLs with the Registry from a privileged
|
||
|
terminal.
|
||
|
|
||
|
::
|
||
|
|
||
|
> regsvr32 "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\DIA SDK\bin\msdia140.dll"
|
||
|
> regsvr32 "C:\Program Files (x86)\Microsoft Visual Studio\2017\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 run ``vcvarsall.bat`` or open an
|
||
|
appropriate Visual Studio Command Prompt corresponding to the version you wish
|
||
|
to use.
|
||
|
|
||
|
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 respository 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. We pass ``lldb`` here as the target, so
|
||
|
it only builds 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\ :sup:`1` and the positional argument pointing to the ``llvm``
|
||
|
directory in the source-tree. Note that we leave out LLDB here and only include
|
||
|
Clang. Then we build the ``ALL`` target with ninja:
|
||
|
|
||
|
::
|
||
|
|
||
|
> cmake -B /path/to/llvm-build -G Ninja \
|
||
|
-DLLVM_ENABLE_PROJECTS=clang \
|
||
|
[<more cmake options>] /path/to/llvm-project/llvm
|
||
|
> ninja
|
||
|
|
||
|
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 \
|
||
|
-DLLVM_DIR=/path/to/llvm-build/lib/cmake/llvm \
|
||
|
[<more cmake options>] /path/to/llvm-project/lldb
|
||
|
> ninja 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>`_
|
||
|
|
||
|
.. _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_RELOCATABLE_PYTHON`` (Default=0): When this is 0, 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_RELOCATABLE_PYTHON`` to 1 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 15 2017 Win64" -Thost=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 ``libcxx`` to
|
||
|
``LLVM_ENABLE_PROJECTS`` 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.
|
||
|
|
||
|
|
||
|
.. _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/master/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;libcxx;lldb" \
|
||
|
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;libcxx" \
|
||
|
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)
|
||
|
* Graphviz (for the 'dot' tool)
|
||
|
* doxygen (if you wish to build the C++ API reference)
|
||
|
* epydoc (if you wish to build the Python API reference)
|
||
|
|
||
|
To install the prerequisites for building the documentation (on Debian/Ubuntu)
|
||
|
do:
|
||
|
|
||
|
::
|
||
|
|
||
|
> sudo apt-get install doxygen graphviz python3-sphinx
|
||
|
> sudo pip install epydoc
|
||
|
|
||
|
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
|
||
|
> ninja lldb-python-doc
|
||
|
|
||
|
Cross-compiling LLDB
|
||
|
--------------------
|
||
|
|
||
|
In order to debug remote targets running different architectures than your
|
||
|
host, you will need to compile LLDB (or at least the server component) for the
|
||
|
target. While the easiest solution is to just 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
|
||
|
-DLLVM_ENABLE_TERMINFO=0
|
||
|
|
||
|
In this case you, will often not need anything other than the standard C and
|
||
|
C++ libraries.
|
||
|
|
||
|
Once all of the dependencies are in place, it's just a matter of configuring
|
||
|
the build system with the locations and arguments of all the necessary tools.
|
||
|
The most important cmake options here are:
|
||
|
|
||
|
* ``CMAKE_CROSSCOMPILING`` : Set to 1 to enable cross-compilation.
|
||
|
* ``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.
|
||
|
* ``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
|
||
|
just a list of library search paths referencing the target libraries.
|
||
|
* ``LLVM_TABLEGEN``, ``CLANG_TABLEGEN`` : Paths to llvm-tblgen and clang-tblgen
|
||
|
for the host architecture. If you already have built clang for the host, you
|
||
|
can point these variables to the executables in your build directory. If not,
|
||
|
you will need to build the llvm-tblgen and clang-tblgen host targets at
|
||
|
least.
|
||
|
* ``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.
|
||
|
|
||
|
You can of course also specify the usual cmake options like
|
||
|
``CMAKE_BUILD_TYPE``, etc.
|
||
|
|
||
|
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``. Then it is possible
|
||
|
to prepare the cmake build with the following parameters:
|
||
|
|
||
|
::
|
||
|
|
||
|
-DCMAKE_CROSSCOMPILING=1 \
|
||
|
-DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc \
|
||
|
-DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \
|
||
|
-DLLVM_HOST_TRIPLE=aarch64-unknown-linux-gnu \
|
||
|
-DLLVM_TABLEGEN=<path-to-host>/bin/llvm-tblgen \
|
||
|
-DCLANG_TABLEGEN=<path-to-host>/bin/clang-tblgen \
|
||
|
-DLLDB_ENABLE_PYTHON=0 \
|
||
|
-DLLDB_ENABLE_LIBEDIT=0 \
|
||
|
-DLLDB_ENABLE_CURSES=0
|
||
|
|
||
|
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 2: 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.
|
||
|
|
||
|
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.
|