Difference between revisions of "Building LDC from source"
m (→Building LDC from source: no LDC_TARGET_PRESET anymore) |
(→LLVM: Make distro packages more prominent) |
||
(4 intermediate revisions by 2 users not shown) | |||
Line 2: | Line 2: | ||
== Advice == | == Advice == | ||
− | It is hard for us to keep these wiki pages up-to-date. If you run into trouble, have a look at the build scripts for our [http://wiki.dlang.org/LDC_contributor%27s_guide#Continuous_Integration Continuous Integration] platforms: the | + | It is hard for us to keep these wiki pages up-to-date. If you run into trouble, have a look at the build scripts for our [http://wiki.dlang.org/LDC_contributor%27s_guide#Continuous_Integration Continuous Integration] platforms: the [https://github.com/ldc-developers/ldc/tree/master/.github GitHub Actions scripts] are always up-to-date with the latest build setup. |
== Prerequisites == | == Prerequisites == | ||
Line 9: | Line 9: | ||
* a C++ toolchain (GCC, Clang, …) | * a C++ toolchain (GCC, Clang, …) | ||
* a D compiler (LDC/DMD/GDC) | * a D compiler (LDC/DMD/GDC) | ||
− | |||
* CMake 3.8+ | * CMake 3.8+ | ||
* [https://github.com/ninja-build/ninja/releases Ninja] or Make (Ninja is highly recommended as it builds in parallel by default and doesn't suffer from concurrency issues wrt. CMake custom commands) | * [https://github.com/ninja-build/ninja/releases Ninja] or Make (Ninja is highly recommended as it builds in parallel by default and doesn't suffer from concurrency issues wrt. CMake custom commands) | ||
Line 15: | Line 14: | ||
* libcurl for Phobos' <tt>std.net.curl</tt> (e.g., <tt>libcurl4</tt> on recent Ubuntu) | * libcurl for Phobos' <tt>std.net.curl</tt> (e.g., <tt>libcurl4</tt> on recent Ubuntu) | ||
* zlib-dev (e.g., <tt>zlib1g-dev</tt> on Ubuntu) | * zlib-dev (e.g., <tt>zlib1g-dev</tt> on Ubuntu) | ||
− | |||
− | |||
− | |||
* For the tests: gdb, unzip, zip and tzdata | * For the tests: gdb, unzip, zip and tzdata | ||
** For BSD: bash and GNU make | ** For BSD: bash and GNU make | ||
− | On Ubuntu | + | On Ubuntu 24.04, this amounts to: |
<syntaxhighlight lang=bash> | <syntaxhighlight lang=bash> | ||
− | apt-get install git-core g++ ldc cmake ninja-build zlib1g-dev | + | apt-get install git-core g++ ldc cmake ninja-build python3 zlib1g-dev libcurl4t64 \ |
gdb unzip zip tzdata # only required for the tests | gdb unzip zip tzdata # only required for the tests | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 30: | Line 26: | ||
=== LLVM === | === LLVM === | ||
− | The minimum supported LLVM version as of August | + | The minimum supported LLVM version as of August 2024 is 15.0. |
− | ==== Building LLVM from source ==== | + | ==== Using a pre-built distro package ==== |
+ | |||
+ | Most OS distributions provide recent LLVM dev packages, sometimes in the form of user-curated package repositories (PPA, …). Using those is recommended, as LLVM is a rather big project to build. E.g., on Debian/Ubuntu: | ||
+ | |||
+ | <syntaxhighlight lang=bash> | ||
+ | apt-get install llvm-dev libclang-common-<matching LLVM major version>-dev | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | The LLVM compiler-rt libraries aka <tt>libclang-common-*-dev</tt> are optional but recommended. | ||
+ | |||
+ | There are also pre-built binary tarballs of our [https://github.com/ldc-developers/llvm-project/releases lightly tweaked version of LLVM] (used for the official LDC releases on GitHub), but they don't always work in other build environments. | ||
+ | |||
+ | ==== Alternative: Building LLVM from source ==== | ||
<syntaxhighlight lang=bash> | <syntaxhighlight lang=bash> | ||
Line 39: | Line 47: | ||
# Download & extract source tarball of our lightly tweaked LLVM | # Download & extract source tarball of our lightly tweaked LLVM | ||
− | curl -OL https://github.com/ldc-developers/llvm-project/releases/download/ldc- | + | curl -OL https://github.com/ldc-developers/llvm-project/releases/download/ldc-v19.1.3/llvm-19.1.3.src.tar.xz |
− | tar -xf llvm- | + | tar -xf llvm-19.1.3.src.tar.xz |
# Generate Ninja build files; remove `-G Ninja` to use Make instead | # Generate Ninja build files; remove `-G Ninja` to use Make instead | ||
mkdir build-llvm && cd build-llvm # using a fresh new build dir is highly recommended whenever re-invoking CMake | mkdir build-llvm && cd build-llvm # using a fresh new build dir is highly recommended whenever re-invoking CMake | ||
− | cmake -G Ninja ../llvm- | + | cmake -G Ninja ../llvm-19.1.3.src/llvm \ |
-DCMAKE_BUILD_TYPE=Release \ | -DCMAKE_BUILD_TYPE=Release \ | ||
-DCMAKE_INSTALL_PREFIX=$PWD/../install-llvm \ | -DCMAKE_INSTALL_PREFIX=$PWD/../install-llvm \ | ||
+ | -DLLVM_ENABLE_PROJECTS="compiler-rt;lld" \ | ||
-DLLVM_BINUTILS_INCDIR=/usr/include \ # non-Apple only: location of binutils-dev's plugin.h | -DLLVM_BINUTILS_INCDIR=/usr/include \ # non-Apple only: location of binutils-dev's plugin.h | ||
− | |||
-DCOMPILER_RT_INCLUDE_TESTS=OFF \ | -DCOMPILER_RT_INCLUDE_TESTS=OFF \ | ||
− | -DLLVM_INCLUDE_TESTS=OFF | + | -DLLVM_INCLUDE_TESTS=OFF \ |
+ | -DLLVM_INCLUDE_BENCHMARKS=OFF | ||
# Build and install (to directory specified as CMAKE_INSTALL_PREFIX above) | # Build and install (to directory specified as CMAKE_INSTALL_PREFIX above) | ||
Line 57: | Line 66: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | Check out the [ | + | Check out the [https://llvm.org/docs/CMake.html#options-and-variables LLVM CMake page] for more CMake variables. |
− | If you are planning to work on LDC itself, we recommend <tt>-DCMAKE_BUILD_TYPE=RelWithDebInfo</tt> for the (huge!) LLVM debuginfos and <tt>-DLLVM_ENABLE_ASSERTIONS=ON</tt>. LLVM's assertions mode also controls LDC's assertions (in both C++ and D parts of LDC). A debug build of LLVM (<tt>-DCMAKE_BUILD_TYPE=Debug</tt>) leads to a ''heavy'' slowdown of LDC's compilation speed. LLVM's <tt>CMAKE_BUILD_TYPE</tt> also controls how the C++ parts of LDC are compiled (LDC inherits the C++ compiler flags used to build LLVM). | + | If you are planning to work on LDC itself, we recommend <tt>-DCMAKE_BUILD_TYPE=RelWithDebInfo</tt> for the (huge!) LLVM debuginfos (or alternatively, <tt>-DCMAKE_CXX_FLAGS="-g1"</tt>) and <tt>-DLLVM_ENABLE_ASSERTIONS=ON</tt>. LLVM's assertions mode also controls LDC's assertions (in both C++ and D parts of LDC). A debug build of LLVM (<tt>-DCMAKE_BUILD_TYPE=Debug</tt>) leads to a ''heavy'' slowdown of LDC's compilation speed. LLVM's <tt>CMAKE_BUILD_TYPE</tt> also controls how the C++ parts of LDC are compiled (LDC inherits the C++ compiler flags used to build LLVM). |
− | If you are building natively in Termux for Android, you'll want to specify a proper default triple like <tt>-DLLVM_DEFAULT_TARGET_TRIPLE=armv7a-unknown-linux- | + | If you are building natively in Termux for Android, you'll want to specify a proper default triple like <tt>-DLLVM_DEFAULT_TARGET_TRIPLE=armv7a-unknown-linux-androideabi29</tt>. |
== Building LDC from source == | == Building LDC from source == | ||
Line 80: | Line 89: | ||
-DCMAKE_INSTALL_PREFIX=$PWD/../install-ldc \ | -DCMAKE_INSTALL_PREFIX=$PWD/../install-ldc \ | ||
-DLLVM_ROOT_DIR=$PWD/../install-llvm \ # not needed if using a distro LLVM package | -DLLVM_ROOT_DIR=$PWD/../install-llvm \ # not needed if using a distro LLVM package | ||
− | -DD_COMPILER=$PWD/../ldc2-1. | + | -DD_COMPILER=$PWD/../ldc2-1.39.0-linux-x86_64/bin/ldmd2 # not needed if host D compiler (ldmd2/dmd/gdmd) is found in PATH |
# Build; use -j<N> to limit parallelism if running out of memory. The binaries end up in bin/. | # Build; use -j<N> to limit parallelism if running out of memory. The binaries end up in bin/. | ||
Line 87: | Line 96: | ||
ninja install | ninja install | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |||
+ | '''Note''': On recent Mac systems, you may likely need an additional <tt>-DD_COMPILER_FLAGS="-gcc=/usr/bin/cc"</tt> in case CMake fails with linker errors. See https://github.com/ldc-developers/ldc/issues/3901. | ||
If you are planning to work on LDC, we recommend <tt>-DCMAKE_BUILD_TYPE=RelWithDebInfo</tt>. | If you are planning to work on LDC, we recommend <tt>-DCMAKE_BUILD_TYPE=RelWithDebInfo</tt>. | ||
Line 125: | Line 136: | ||
! LDC_DYNAMIC_COMPILE | ! LDC_DYNAMIC_COMPILE | ||
| Set this to <tt>OFF</tt> (before v1.21: <tt>False</tt>) to disable support for dynamic compilation aka JIT. Try this when getting strange CMake errors. | | Set this to <tt>OFF</tt> (before v1.21: <tt>False</tt>) to disable support for dynamic compilation aka JIT. Try this when getting strange CMake errors. | ||
− | |||
− | |||
− | |||
|- | |- | ||
|} | |} |
Latest revision as of 16:08, 12 December 2024
This page shows you how to build and install LDC on most Posix-like systems such as linux, macOS, BSD, or Android. For building LDC on Windows, please see its dedicated page.
Contents
Advice
It is hard for us to keep these wiki pages up-to-date. If you run into trouble, have a look at the build scripts for our Continuous Integration platforms: the GitHub Actions scripts are always up-to-date with the latest build setup.
Prerequisites
- Git (for fetching the source code, if not using a tarball)
- a C++ toolchain (GCC, Clang, …)
- a D compiler (LDC/DMD/GDC)
- CMake 3.8+
- Ninja or Make (Ninja is highly recommended as it builds in parallel by default and doesn't suffer from concurrency issues wrt. CMake custom commands)
- Python
- libcurl for Phobos' std.net.curl (e.g., libcurl4 on recent Ubuntu)
- zlib-dev (e.g., zlib1g-dev on Ubuntu)
- For the tests: gdb, unzip, zip and tzdata
- For BSD: bash and GNU make
On Ubuntu 24.04, this amounts to:
apt-get install git-core g++ ldc cmake ninja-build python3 zlib1g-dev libcurl4t64 \
gdb unzip zip tzdata # only required for the tests
LLVM
The minimum supported LLVM version as of August 2024 is 15.0.
Using a pre-built distro package
Most OS distributions provide recent LLVM dev packages, sometimes in the form of user-curated package repositories (PPA, …). Using those is recommended, as LLVM is a rather big project to build. E.g., on Debian/Ubuntu:
apt-get install llvm-dev libclang-common-<matching LLVM major version>-dev
The LLVM compiler-rt libraries aka libclang-common-*-dev are optional but recommended.
There are also pre-built binary tarballs of our lightly tweaked version of LLVM (used for the official LDC releases on GitHub), but they don't always work in other build environments.
Alternative: Building LLVM from source
# Non-Apple platforms: install binutils-dev package required to generate the ld.gold LTO linker plugin
apt-get install binutils-dev
# Download & extract source tarball of our lightly tweaked LLVM
curl -OL https://github.com/ldc-developers/llvm-project/releases/download/ldc-v19.1.3/llvm-19.1.3.src.tar.xz
tar -xf llvm-19.1.3.src.tar.xz
# Generate Ninja build files; remove `-G Ninja` to use Make instead
mkdir build-llvm && cd build-llvm # using a fresh new build dir is highly recommended whenever re-invoking CMake
cmake -G Ninja ../llvm-19.1.3.src/llvm \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=$PWD/../install-llvm \
-DLLVM_ENABLE_PROJECTS="compiler-rt;lld" \
-DLLVM_BINUTILS_INCDIR=/usr/include \ # non-Apple only: location of binutils-dev's plugin.h
-DCOMPILER_RT_INCLUDE_TESTS=OFF \
-DLLVM_INCLUDE_TESTS=OFF \
-DLLVM_INCLUDE_BENCHMARKS=OFF
# Build and install (to directory specified as CMAKE_INSTALL_PREFIX above)
ninja install # or `make -j$(nproc) install`
cd ..
Check out the LLVM CMake page for more CMake variables.
If you are planning to work on LDC itself, we recommend -DCMAKE_BUILD_TYPE=RelWithDebInfo for the (huge!) LLVM debuginfos (or alternatively, -DCMAKE_CXX_FLAGS="-g1") and -DLLVM_ENABLE_ASSERTIONS=ON. LLVM's assertions mode also controls LDC's assertions (in both C++ and D parts of LDC). A debug build of LLVM (-DCMAKE_BUILD_TYPE=Debug) leads to a heavy slowdown of LDC's compilation speed. LLVM's CMAKE_BUILD_TYPE also controls how the C++ parts of LDC are compiled (LDC inherits the C++ compiler flags used to build LLVM).
If you are building natively in Termux for Android, you'll want to specify a proper default triple like -DLLVM_DEFAULT_TARGET_TRIPLE=armv7a-unknown-linux-androideabi29.
Building LDC from source
Now that you're ready to build LDC from source, clone the LDC GitHub repository or get one of our official source releases:
git clone --recursive https://github.com/ldc-developers/ldc.git
If you already have the git repo, don't forget to make sure your submodules are up to date by running git submodule update --init.
Run the following commands to configure and build LDC and its default libraries:
# Generate Ninja build files
mkdir build-ldc && cd build-ldc # using a fresh new build dir is highly recommended whenever re-invoking CMake
cmake -G Ninja ../ldc \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=$PWD/../install-ldc \
-DLLVM_ROOT_DIR=$PWD/../install-llvm \ # not needed if using a distro LLVM package
-DD_COMPILER=$PWD/../ldc2-1.39.0-linux-x86_64/bin/ldmd2 # not needed if host D compiler (ldmd2/dmd/gdmd) is found in PATH
# Build; use -j<N> to limit parallelism if running out of memory. The binaries end up in bin/.
ninja
# Optional: install LDC to the CMAKE_INSTALL_PREFIX directory above
ninja install
Note: On recent Mac systems, you may likely need an additional -DD_COMPILER_FLAGS="-gcc=/usr/bin/cc" in case CMake fails with linker errors. See https://github.com/ldc-developers/ldc/issues/3901.
If you are planning to work on LDC, we recommend -DCMAKE_BUILD_TYPE=RelWithDebInfo.
Note: When installing LDC, existing Phobos/druntime includes (*.d and *.di files) aren't removed, only overwritten. This can cause conflicts when installing a new LDC version into an older LDC installation directory, e.g., when a std/datetime.d module is replaced by a std/datetime/*.d package. Cleaning up the installation dir or using a new one is recommended.
More useful CMake variables
LLVM_ROOT_DIR or LLVM_CONFIG |
Allows you to specify the LLVM instance to use. LLVM_CONFIG specifies the path and name of the llvm-config binary to use. By default, it is assumed to be ${LLVM_ROOT_DIR}/bin/llvm-config, otherwise it is searched for on default system paths. |
---|---|
BUILD_LTO_LIBS | Set this to ON to build an additional LTO-able set of Phobos and druntime (to be selected via -defaultlib=phobos2-ldc-lto,druntime-ldc-lto). |
LDC_INSTALL_LTOPLUGIN | Set this to ON to include the LLVM ld.gold LTO linker plugin in the LDC installation, if found. |
LDC_INSTALL_LLVM_RUNTIME_LIBS | Set this to ON to include the LLVM compiler-rt libraries in the LDC installation, if found. |
MULTILIB | Set this to ON to build the 32-bit libraries too. You'll need a multilib C toolchain, e.g., apt-get install g++-multilib. |
BUILD_SHARED_LIBS | Build only shared libraries (ON), only static libraries (OFF), or both (BOTH). Defaults to BOTH if shared libraries are supported on your platform, and OFF if they aren't. |
LIB_SUFFIX | Some Linux distributions, such as Fedora, expect 64 bit libraries in /usr/lib64 instead of /usr/lib. In this case, the installation directory can be adjusted using -DLIB_SUFFIX=64. |
INCLUDE_INSTALL_DIR | The location the D modules for druntime and Phobos are installed to. Defaults to ${CMAKE_INSTALL_PREFIX}/include/d. |
LDC_WITH_LLD | Set this to OFF to disable the LLD linker integration even if the LLD headers are found, e.g., when getting errors about conflicting command-line options when running LDC. |
LDC_DYNAMIC_COMPILE | Set this to OFF (before v1.21: False) to disable support for dynamic compilation aka JIT. Try this when getting strange CMake errors. |
NOTE: see https://github.com/Linuxbrew/homebrew-core/blob/master/Formula/ldc.rb for brew's install
Tips
The Makefiles generated by CMake respect the DESTDIR variable for the install target. It is prepended to all the file installation targets. This can be useful for building packages:
$ make install DESTDIR=<your root directory>