Building LDC from source

From D Wiki
Revision as of 09:37, 4 March 2018 by Joakim (talk | contribs) (Update to latest tweaked llvm and use Ninja)
Jump to: navigation, search

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.

Advice

This wiki page may not always be up to date. If you run into trouble, have a look at our packaging scripts for the official release of ldc.

Prerequisites

  • Git (for fetching the source code, if not using a tarball)
  • a C++ toolchain (GCC, Clang, …)
  • a D compiler (currently LDC and DMD are supported)
    • If you don't have a D compiler installed: LDC 0.17 is the last version that does not need a D compiler to be built. Thus for bootstrapping, you can first build 0.17, and then use that to build newer compiler versions. Our testing infrastructure explicitly tests that new LDC versions can be built with 0.17. The git branch is called ltsmaster or you can get the source for the latest 0.17 release.
  • CMake 2.8+
  • Make or Ninja
  • LLVM 3.7+
  • For 0.17 ltsmaster, you need libconfig++ and its header files
    • Get the libconfig-devel or libconfig-dev package for some Linux distributions. On OSX, sudo port install libconfig-hr); on Android with the Termux app, apt install libconfig-dev
  • libcurl-dev for building the Phobos standard library and tests (various versions available, e.g. libcurl4-gnutls-dev on Ubuntu)
  • libedit-dev
  • zlib-dev (e.g. zlib1g-dev on Ubuntu)

LLVM

Many Linux distributions already provide recent binary LLVM packages, sometimes in the form of user-curated package repositories (PPA, …). If a recent LLVM package is available, you might prefer to use it, as LLVM is a rather big project to build. Only the Android target requires building our lightly tweaked version of LLVM, which is what we'll use here.

Building LLVM manually

We try to keep LDC up-to-date with LLVM trunk, but the latest official release is recommended for the least amount of trouble (with LLVM trunk, you will have to recompile LLVM often). Download our lightly tweaked version of the last official release, 5.0.1, extract the archive, configure it, and build:

curl -L -O https://github.com/ldc-developers/llvm/releases/download/ldc-v5.0.1/llvm-5.0.1.src.tar.xz
tar xf llvm-5.0.1.src.tar.xz
cd llvm-5.0.1.src/
mkdir build && cd build/

cmake -GNinja .. -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD="X86;AArch64;ARM;PowerPC;NVPTX" -DLLVM_BUILD_TOOLS=OFF -DLLVM_BUILD_UTILS=OFF # remove -GNinja to use Make instead
ninja all llvm-config

cd ../../

If you are planning to work on LDC itself, you might want to install a debug build of LLVM instead by using -DCMAKE_BUILD_TYPE=Debug. Warning: This leads to a heavy slowdown!

If you are building natively in Termux for Android, you'll want to add -DLLVM_DEFAULT_TARGET_TRIPLE=armv7-none-linux-android, because CMake cannot detect the Android platform yet.

LDC

Now that you're ready to build and install 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're behind a company firewall and cloning of the submodules fails, first configure git to use a different protocol, ex https:

$ git config --global url."https://github".insteadOf git://github

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 runtime libraries (see the list of useful CMake switches below):

cd ldc
mkdir build && cd build   # arbitrary working directory

export DMD=/path/to/your/dmd2/bin/dmd   # not needed for 0.17 ltsmaster
cmake -GNinja .. -DLLVM_CONFIG=../../llvm-5.0.1.src/build/bin/llvm-config # remove -GNinja to use Make instead

ninja -j5
sudo ninja install

The last step is optional; instead of installing it to the system, you can also choose to run LDC from the bin/ directory in your CMake working tree. If you're using an LLVM already installed in your system instead of the tweaked version we just compiled, you don't need to specify -DLLVM_CONFIG=.., because our CMake config should pick it up automatically. If you want to target Android and are building ldc 1.4 or later, add -DLDC_TARGET_PRESET=Android-arm to the CMake config.

If cross-compiling the runtime libraries, you'll need to specify the C cross-compiler before running CMake

$ export CC=/home/david/android-ndk-r16b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang

and pass any C, D, or linker flags you need to CMake:

-DRT_CFLAGS="-target armv7-none-linux-gnueabihf -Os" -DD_FLAGS="-w;-mtriple=armv7-none-linux-gnueabihf" -DLD_FLAGS="-target armv7-none-linux-gnueabihf -fpie -pie"

Useful CMake variables

  • 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.
  • CMAKE_INSTALL_PREFIX: The installation prefix, /usr/local by default (e.g. -DCMAKE_INSTALL_PREFIX=/opt/ldc).
  • INCLUDE_INSTALL_DIR: The location the D modules for druntime and Phobos are installed to.
  • RUNTIME_DIR, PHOBOS2_DIR: By default, druntime and Phobos are expected in runtime/ as git submodules. Should circumstances require it, these paths can be changed by setting the variables accordingly.
  • LLVM_ROOT_DIR and 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. EDIT: https://github.com/ldc-developers/ldc/issues/1928#issuecomment-268421779 suggests we should just use `ccmake -DLLVM_ROOT_DIR=$homebrew_D/ ..` on ubuntu 14.04 even if /usr/bin/llvm-config-3.8 is available
  • LIBCONFIG_LIBRARY and LIBCONFIG_INCLUDE_DIR: Only for 0.17 ltsmaster, these variables can be used to specify the location of the libconfig++ library files and the path to the corresponding header files. NOTE: on error Could NOT find LibConfig (missing: LIBCONFIG_INCLUDE_DIR LIBCONFIG_LIBRARY) and using brew, use for eg: CMAKE_PREFIX_PATH=`brew --prefix` cmake .. [see https://github.com/ldc-developers/ldc/issues/952] or use `sudo apt-get install libconfig++`
  • D_COMPILER: path to prebuilt D compiler, needed for anything newer than 0.17 ltsmaster

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>