Building LLVM and Clang using Clang?

Try as I might I can't seem to get LLVM to bulid using clang/clang++.
No matter what I do it insists on using /usr/bin/cc and /usr/bin/c++
which are gcc. Am I missing something obvious? I vaguely remember some
document describing a stage1 compiler built by your old toolchain and
a stage2 compiler but I can't find the steps to do that any more.

$ CC=/usr/local/bin/clang CXX=/usr/local/bin/clang++ cmake
-DCMAKE_BUILD_TYPE=Release -Wno-dev ~/src/llvm
-- Target triple: x86_64-unknown-linux-gnu
-- Native target architecture is X86
-- Threads enabled.
-- Doxygen disabled.
-- Sphinx disabled.
-- Go bindings disabled.
-- Could NOT find OCaml (missing: OCAMLFIND OCAML_VERSION OCAML_STDLIB_PATH)
-- Could NOT find OCaml (missing: OCAMLFIND OCAML_VERSION OCAML_STDLIB_PATH)
-- OCaml bindings disabled.
-- Building with -fPIC
-- Constructing LLVMBuild project information
-- Targeting AArch64
-- Targeting AMDGPU
-- Targeting ARM
-- Targeting BPF
-- Targeting CppBackend
-- Targeting Hexagon
-- Targeting Mips
-- Targeting MSP430
-- Targeting NVPTX
-- Targeting PowerPC
-- Targeting Sparc
-- Targeting SystemZ
-- Targeting X86
-- Targeting XCore
-- Compiler-RT supported architectures: x86_64
-- Clang version: 3.8.0
-- Configuring done
-- Generating done
-- Build files have been written to: /home/stark/src/llvm-build
$ make CC=/usr/local/bin/clang CXX=/usr/local/bin/clang++
[ 0%] Building CXX object lib/Support/CMakeFiles/LLVMSupport.dir/APFloat.cpp.o
[ 0%] Building CXX object lib/Support/CMakeFiles/LLVMSupport.dir/APInt.cpp.o
[ 0%] Building CXX object lib/Support/CMakeFiles/LLVMSupport.dir/APSInt.cpp.o
[ 0%] Building CXX object
lib/Support/CMakeFiles/LLVMSupport.dir/ARMBuildAttrs.cpp.o
[ 0%] Building CXX object lib/Support/CMakeFiles/LLVMSupport.dir/ARMWinEH.cpp.o
[ 0%] Building CXX object
lib/Support/CMakeFiles/LLVMSupport.dir/Allocator.cpp.o
[ 0%] Building CXX object
lib/Support/CMakeFiles/LLVMSupport.dir/BlockFrequency.cpp.o

And while doing that I ran this and see it's running /usr/bin/c++:

$ ps auxww | grep LLVMSupp
stark 26435 0.1 0.0 10400 2744 pts/6 S+ 18:50 0:00 make
-f lib/Support/CMakeFiles/LLVMSupport.dir/build.make
lib/Support/CMakeFiles/LLVMSupport.dir/build
stark 26463 0.0 0.0 4328 752 pts/6 S+ 18:50 0:00
/bin/sh -c cd /home/stark/src/llvm-build/lib/Support && /usr/bin/c++
-DGTEST_HAS_RTTI=0 -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS
-D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -fPIC
-fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter
-Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic
-Wno-long-long -Wno-maybe-uninitialized -Wnon-virtual-dtor
-Wno-comment -std=c++11 -ffunction-sections -fdata-sections -O3
-DNDEBUG -fPIC -I/home/stark/src/llvm-build/lib/Support
-I/home/stark/src/llvm/lib/Support
-I/home/stark/src/llvm-build/include -I/home/stark/src/llvm/include
-fno-exceptions -fno-rtti -o
CMakeFiles/LLVMSupport.dir/ARMBuildAttrs.cpp.o -c
/home/stark/src/llvm/lib/Support/ARMBuildAttrs.cpp
stark 26464 0.0 0.0 11512 996 pts/6 S+ 18:50 0:00
/usr/bin/c++ -DGTEST_HAS_RTTI=0 -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS
-D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -fPIC
-fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter
-Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic
-Wno-long-long -Wno-maybe-uninitialized -Wnon-virtual-dtor
-Wno-comment -std=c++11 -ffunction-sections -fdata-sections -O3
-DNDEBUG -fPIC -I/home/stark/src/llvm-build/lib/Support
-I/home/stark/src/llvm/lib/Support
-I/home/stark/src/llvm-build/include -I/home/stark/src/llvm/include
-fno-exceptions -fno-rtti -o
CMakeFiles/LLVMSupport.dir/ARMBuildAttrs.cpp.o -c
/home/stark/src/llvm/lib/Support/ARMBuildAttrs.cpp
stark 26465 0.0 1.2 88756 48740 pts/6 R+ 18:50 0:00
/usr/lib/gcc/x86_64-linux-gnu/5/cc1plus -quiet -I
/home/stark/src/llvm-build/lib/Support -I
/home/stark/src/llvm/lib/Support -I /home/stark/src/llvm-build/include
-I /home/stark/src/llvm/include -imultiarch x86_64-linux-gnu
-D_GNU_SOURCE -D GTEST_HAS_RTTI=0 -D _GNU_SOURCE -D
__STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS
-D NDEBUG /home/stark/src/llvm/lib/Support/ARMBuildAttrs.cpp -quiet
-dumpbase ARMBuildAttrs.cpp -mtune=generic -march=x86-64
-auxbase-strip CMakeFiles/LLVMSupport.dir/ARMBuildAttrs.cpp.o -O3
-Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual
-Wno-missing-field-initializers -Wpedantic -Wno-long-long
-Wno-maybe-uninitialized -Wnon-virtual-dtor -Wno-comment -std=c++11
-fvisibility-inlines-hidden -ffunction-sections -fdata-sections -fPIC
-fno-exceptions -fno-rtti -o /tmp/ccTTfqUE.s
stark 26467 0.0 0.0 14452 932 pts/3 S+ 18:50 0:00 grep LLVMSupp

Hi Greg,

Try as I might I can't seem to get LLVM to bulid using clang/clang++.
No matter what I do it insists on using /usr/bin/cc and /usr/bin/c++
which are gcc. Am I missing something obvious? I vaguely remember some
document describing a stage1 compiler built by your old toolchain and
a stage2 compiler but I can't find the steps to do that any more.

$ CC=/usr/local/bin/clang CXX=/usr/local/bin/clang++ cmake
-DCMAKE_BUILD_TYPE=Release -Wno-dev ~/src/llvm
-- Target triple: x86_64-unknown-linux-gnu

CMake will only detect the compiler once in a build directory. Based
on the console output you show the tests checking the capabilities of
the compiler and system headers **aren't being run**
which means you must have run cmake in the build directory previously
and now those results of testing the host compiler have been cached.

The easiest thing to do is just delete your entire build directory and
run CMake again. You could try deleting your CMake cache
(CMakeCache.txt) and rerunning CMake but I'm not sure if that will
work correctly.

HTH,
Dan.

Here’s part of a script I use. It uses a specific version of gcc, but if you follow the pattern, it should give you what you need…

cd ${local_dir}/build
cmake -DCMAKE_C_COMPILER=${CLANG_GCC}/bin/gcc
-DCMAKE_CXX_COMPILER=${CLANG_GCC}/bin/g++
-DGCC_INSTALL_PREFIX=${CLANG_GCC}
-DCMAKE_CXX_LINK_FLAGS=“-L${CLANG_GCC}/lib64 -Wl,-rpath,${CLANG_GCC}/lib64”
-DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX}
-DLLVM_ENABLE_ASSERTIONS=ON
-DCMAKE_BUILD_TYPE=“Release”
-DLLVM_TARGETS_TO_BUILD=“X86”
…/llvm-${version}.src
-GNinja || die “cmake failed”
${NINJA} -j16 -v || die “ninja failed”
exit

Thanks! Hopefully by sometime next week I'll get to use it :slight_smile:

I think you can do -DCMAKE_C_COMPILER=... and -DCMAKE_CXX_COMPILER=... with cmake.
I personally like using "ccmake" (comes with every cmake install) which gives you a GUI that lists all options available to a cmake build.

- Matthias

Unless you’re on Debian / Ubuntu, in which case it’s in a separate cmake-curses-gui package, presumably on the assumption that people who want to install cmake don’t actually want to use it…

David