How to build clang from source

I’ve been trying to build clang from source (for the newest C++23 features)

From what I can understand from the flake I wrote, it should create a directory $src/build, cd into the same, run cmake on $src/llvm and start building. The build fails on cmake part.

The build fails with CMake Error: The source directory "/build/source" does not appear to contain CMakeLists.txt..

flake.nix:

{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    flake-utils.url = "github:numtide/flake-utils";
    llvm = {
      url = "github:llvm/llvm-project";
      flake = false;
    };
  };

  outputs = { self, nixpkgs, flake-utils, llvm }:
    flake-utils.lib.eachDefaultSystem (system:
      let 
        name = "llvm-toolchain";
        src = llvm;
        meta.mainProgram = "clang";
        inherit system;
        pkgs = import nixpkgs { inherit system; };
        buildInputs = with pkgs; [ 
          bashInteractive
          python3
          ninja
          cmake
          # llvmPackages_17.llvm
        ];
        # where to find libgcc
        NIX_LDFLAGS="-L${pkgs.gccForLibs}/lib/gcc/${pkgs.targetPlatform.config}/${pkgs.gccForLibs.version}";
        # teach clang about C startup file locations
        CFLAGS="-B${pkgs.gccForLibs}/lib/gcc/${pkgs.targetPlatform.config}/${pkgs.gccForLibs.version} -B ${pkgs.stdenv.cc.libc}/lib";

        cmakeFlags = [
          "-DGCC_INSTALL_PREFIX=${pkgs.gcc}"
          "-DC_INCLUDE_DIRS=${pkgs.stdenv.cc.libc.dev}/include"
          "-GNinja"
          # Debug for debug builds
          "-DCMAKE_BUILD_TYPE=Release"
          # out will be our installation prefix
          "-DCMAKE_INSTALL_PREFIX=../$out"
          "-DLLVM_INSTALL_TOOLCHAIN_ONLY=ON"
          # change this to enable the projects you need
          "-DLLVM_ENABLE_PROJECTS=clang"
          # enable libcxx* to come into play at runtimes
          "-DLLVM_ENABLE_RUNTIMES=libcxx;libcxxabi"
          # this makes llvm only to produce code for the current platform, this saves CPU time, change it to what you need
          "-DLLVM_TARGETS_TO_BUILD=host"
        ];
        buildPhase = ''
          mkdir -p $src/build
          cd $src/build
          cmake $cmakeFlags $src/llvm
          ninja -j5
        '';
        installPhase = ''
          mkdir -p $out/bin
          cd $src/build
          ninja install 
        '';
      in {
        packages.default = pkgs.stdenv.mkDerivation {
          inherit name src buildInputs NIX_LDFLAGS CFLAGS buildPhase installPhase cmakeFlags;
        };
      }
    );
}

logs:

@nix { "action": "setPhase", "phase": "unpackPhase" }
Running phase: unpackPhase
unpacking source archive /nix/store/0n23ig5l9kwyb5k88fpfh0h27g08155g-source
source root is source
@nix { "action": "setPhase", "phase": "patchPhase" }
Running phase: patchPhase
@nix { "action": "setPhase", "phase": "updateAutotoolsGnuConfigScriptsPhase" }
Running phase: updateAutotoolsGnuConfigScriptsPhase
Updating Autotools / GNU config script to a newer upstream version: ./llvm/cmake/config.guess
@nix { "action": "setPhase", "phase": "configurePhase" }
Running phase: configurePhase
fixing cmake files...
cmake flags: -DCMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY=OFF -DCMAKE_FIND_USE_PACKAGE_REGISTRY=OFF -DCMAKE_EXPORT_NO_PACKAGE_REGISTRY=ON -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF -DCMAKE_INSTALL_LOCALEDIR=/nix/store/z47vi077hl8h3z5kclq06g7mgvcdjhm2-llvm-toolchain/share/locale -DCMAKE_INSTALL_LIBEXECDIR=/nix/store/z47vi077hl8h3z5kclq06g7mgvcdjhm2-llvm-toolchain/libexec -DCMAKE_INSTALL_LIBDIR=/nix/store/z47vi077hl8h3z5kclq06g7mgvcdjhm2-llvm-toolchain/lib -DCMAKE_INSTALL_DOCDIR=/nix/store/z47vi077hl8h3z5kclq06g7mgvcdjhm2-llvm-toolchain/share/doc/llvm-toolchain -DCMAKE_INSTALL_INFODIR=/nix/store/z47vi077hl8h3z5kclq06g7mgvcdjhm2-llvm-toolchain/share/info -DCMAKE_INSTALL_MANDIR=/nix/store/z47vi077hl8h3z5kclq06g7mgvcdjhm2-llvm-toolchain/share/man -DCMAKE_INSTALL_OLDINCLUDEDIR=/nix/store/z47vi077hl8h3z5kclq06g7mgvcdjhm2-llvm-toolchain/include -DCMAKE_INSTALL_INCLUDEDIR=/nix/store/z47vi077hl8h3z5kclq06g7mgvcdjhm2-llvm-toolchain/include -DCMAKE_INSTALL_SBINDIR=/nix/store/z47vi077hl8h3z5kclq06g7mgvcdjhm2-llvm-toolchain/sbin -DCMAKE_INSTALL_BINDIR=/nix/store/z47vi077hl8h3z5kclq06g7mgvcdjhm2-llvm-toolchain/bin -DCMAKE_INSTALL_NAME_DIR=/nix/store/z47vi077hl8h3z5kclq06g7mgvcdjhm2-llvm-toolchain/lib -DCMAKE_POLICY_DEFAULT_CMP0025=NEW -DCMAKE_OSX_SYSROOT= -DCMAKE_FIND_FRAMEWORK=LAST -DCMAKE_STRIP=/nix/store/sfgnb6rr428bssyrs54d6d0vv2avi95c-gcc-wrapper-12.3.0/bin/strip -DCMAKE_RANLIB=/nix/store/sfgnb6rr428bssyrs54d6d0vv2avi95c-gcc-wrapper-12.3.0/bin/ranlib -DCMAKE_AR=/nix/store/sfgnb6rr428bssyrs54d6d0vv2avi95c-gcc-wrapper-12.3.0/bin/ar -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_INSTALL_PREFIX=/nix/store/z47vi077hl8h3z5kclq06g7mgvcdjhm2-llvm-toolchain -DGCC_INSTALL_PREFIX=/nix/store/sfgnb6rr428bssyrs54d6d0vv2avi95c-gcc-wrapper-12.3.0 -DC_INCLUDE_DIRS=/nix/store/jhi4wsbrxfscrf57k46d1lfq1v8d25kx-glibc-2.38-27-dev/include -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../$out -DLLVM_INSTALL_TOOLCHAIN_ONLY=ON -DLLVM_ENABLE_PROJECTS=clang -DLLVM_ENABLE_RUNTIMES=libcxx;libcxxabi -DLLVM_TARGETS_TO_BUILD=host 
CMake Warning:
  Ignoring extra path from command line:

   ".."


CMake Error: The source directory "/build/source" does not appear to contain CMakeLists.txt.
Specify --help for usage, or press the help button on the CMake GUI.

I have no idea how it ends up in /build/source.

I used the NixOS wiki for reference. LLVM - NixOS Wiki

1 Like