Building past few days with Clang++ and Clang produces errors on Cmake for Debian Linux

System: Debian Linux Sid/Unstable amd64

LLVM/Clang: Trunk

Scenario: In the past couple of days I’ve been compiling against trunk I get two separate and spurious hang ups with CMake.

Note: I build against more than just X86 follow along the progress of other platforms, though just building for X86 produces the same results below.

Assumption: Configure cmake with prior built clang and clang++ via gcc-4.6.3 under /usr/local/bin… /clang …/clang++ as follows:

mdriftmeyer@horus:~/DeveloperProjects/LLVMProject/cmake-llvm$ cmake -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_CXX_COMPILER=/usr/local/bin/clang++ -DCMAKE_C_COMPILER=/usr/local/bin/clang -DCMAKE_CXX_FLAGS=’-O2’ CMAKE_C_FLAGS=’-O2’ -DLLVM_BUILD_EXAMPLES=ON -DLLVM_BUILD_TESTS=ON -DLLVM_INCLUDE_TESTS=ON -DLLVM_TARGETS_TO_BUILD=‘ARM;CppBackend;PTX;Hexagon;X86’ …/trunk/llvm/
– Target triple: x86_64-unknown-linux-gnu
– Native target architecture is X86
– Threads enabled.
– Building with -fPIC
– Constructing LLVMBuild project information
– Targeting ARM
– Targeting CppBackend
– Targeting PTX
– Targeting Hexagon
– Targeting X86
– Clang version: 3.1
– Configuring done
You have changed variables that require your cache to be deleted.
Configure will be re-run and you may have to reset some variables.
The following variables have changed:
CMAKE_C_COMPILER= /usr/local/bin/clang
CMAKE_CXX_COMPILER= /usr/local/bin/clang++

– The C compiler identification is Clang
– The CXX compiler identification is Clang
– Check for working C compiler: /usr/local/bin/clang
– Check for working C compiler: /usr/local/bin/clang – works
– Detecting C compiler ABI info
– Detecting C compiler ABI info - done
– Check for working CXX compiler: /usr/local/bin/clang++
– Check for working CXX compiler: /usr/local/bin/clang++ – broken
CMake Error at /usr/share/cmake-2.8/Modules/CMakeTestCXXCompiler.cmake:45 (MESSAGE):
The C++ compiler “/usr/local/bin/clang++” is not able to compile a simple
test program.

It fails with the following output:

Change Dir: /home/mdriftmeyer/DeveloperProjects/LLVMProject/cmake-llvm/CMakeFiles/CMakeTmp

Run Build Command:/usr/bin/make “cmTryCompileExec/fast”

/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make
CMakeFiles/cmTryCompileExec.dir/build

make[1]: Entering directory
`/home/mdriftmeyer/DeveloperProjects/LLVMProject/cmake-llvm/CMakeFiles/CMakeTmp’

/usr/bin/cmake -E cmake_progress_report
/home/mdriftmeyer/DeveloperProjects/LLVMProject/cmake-llvm/CMakeFiles/CMakeTmp/CMakeFiles
1

Building CXX object CMakeFiles/cmTryCompileExec.dir/testCXXCompiler.cxx.o

/usr/local/bin/clang++ -o
CMakeFiles/cmTryCompileExec.dir/testCXXCompiler.cxx.o -c
/home/mdriftmeyer/DeveloperProjects/LLVMProject/cmake-llvm/CMakeFiles/CMakeTmp/testCXXCompiler.cxx

Linking CXX executable cmTryCompileExec

/usr/bin/cmake -E cmake_link_script
CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1

/usr/local/bin/clang++
CMakeFiles/cmTryCompileExec.dir/testCXXCompiler.cxx.o -o cmTryCompileExec
-rdynamic

/usr/bin/ld: error: cannot find -lstdc++

clang-3: error: linker command failed with exit code 1 (use -v to see
invocation)

make[1]: Leaving directory
`/home/mdriftmeyer/DeveloperProjects/LLVMProject/cmake-llvm/CMakeFiles/CMakeTmp’

make[1]: *** [cmTryCompileExec] Error 1

make: *** [cmTryCompileExec/fast] Error 2

CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
CMakeLists.txt:3 (project)

– Configuring incomplete, errors occurred!
mdriftmeyer@horus:~/DeveloperProjects/LLVMProject/cmake-llvm$

Now out of curriousity I change clang++ to clang-3.1 which of course has two symlinks [clang and clang++] under /usr/local/bin

If I configure and attempt to make against the following:

mdriftmeyer@horus:~/DeveloperProjects/LLVMProject/cmake-llvm$ cmake -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_CXX_COMPILER=/usr/local/bin/clang-3.1 -DCMAKE_C_COMPILER=/usr/local/bin/clang-3.1 -DCMAKE_CXX_FLAGS=’-O2’ CMAKE_C_FLAGS=’-O2’ -DLLVM_BUILD_EXAMPLES=ON -DLLVM_BUILD_TESTS=ON -DLLVM_INCLUDE_TESTS=ON -DLLVM_TARGETS_TO_BUILD=‘ARM;CppBackend;PTX;Hexagon;X86’ …/trunk/llvm/
– Target triple: x86_64-unknown-linux-gnu
– Native target architecture is X86
– Threads enabled.
– Building with -fPIC
– Constructing LLVMBuild project information
– Targeting ARM
– Targeting CppBackend
– Targeting PTX
– Targeting Hexagon
– Targeting X86
– Clang version: 3.1
– Configuring done
– Generating done
– Build files have been written to: /home/mdriftmeyer/DeveloperProjects/LLVMProject/cmake-llvm
mdriftmeyer@horus:~/DeveloperProjects/LLVMProject/cmake-llvm$

Result:

mdriftmeyer@horus:~/DeveloperProjects/LLVMProject/cmake-llvm$ make -j3
Scanning dependencies of target LLVMHello
[ 0%] Building CXX object lib/Transforms/Hello/CMakeFiles/LLVMHello.dir/Hello.cpp.o
Scanning dependencies of target profile_rt-shared
Scanning dependencies of target LLVMSupport
[ 0%] Building C object runtime/libprofile/CMakeFiles/profile_rt-shared.dir/BasicBlockTracing.c.o
In file included from /home/mdriftmeyer/DeveloperProjects/LLVMProject/trunk/llvm/lib/Transforms/Hello/Hello.cpp:16:
/home/mdriftmeyer/DeveloperProjects/LLVMProject/trunk/llvm/include/llvm/Pass.h:32:10: fatal error: 'string’
file not found
#include
^
[ 0%] Building CXX object lib/Support/CMakeFiles/LLVMSupport.dir/APFloat.cpp.o
[ 0%] Building C object runtime/libprofile/CMakeFiles/profile_rt-shared.dir/CommonProfiling.c.o
In file included from /home/mdriftmeyer/DeveloperProjects/LLVMProject/trunk/llvm/lib/Support/APFloat.cpp:15:
In file included from /home/mdriftmeyer/DeveloperProjects/LLVMProject/trunk/llvm/include/llvm/ADT/APFloat.h:104:
In file included from /home/mdriftmeyer/DeveloperProjects/LLVMProject/trunk/llvm/include/llvm/ADT/APInt.h:18:
In file included from /home/mdriftmeyer/DeveloperProjects/LLVMProject/trunk/llvm/include/llvm/ADT/ArrayRef.h:13:
In file included from /home/mdriftmeyer/DeveloperProjects/LLVMProject/trunk/llvm/include/llvm/ADT/SmallVector.h:17:
In file included from /home/mdriftmeyer/DeveloperProjects/LLVMProject/trunk/llvm/include/llvm/Support/type_traits.h:20:
/home/mdriftmeyer/DeveloperProjects/LLVMProject/cmake-llvm/include/llvm/Support/DataTypes.h:36:10: fatal error:
’cmath’ file not found
#include
^
[ 0%] Building C object runtime/libprofile/CMakeFiles/profile_rt-shared.dir/GCDAProfiling.c.o
[ 0%] Building C object runtime/libprofile/CMakeFiles/profile_rt-shared.dir/PathProfiling.c.o
1 error generated.
make[2]: *** [lib/Transforms/Hello/CMakeFiles/LLVMHello.dir/Hello.cpp.o] Error 1
make[1]: *** [lib/Transforms/Hello/CMakeFiles/LLVMHello.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs…
1 error generated.
[ 0%] make[2]: *** [lib/Support/CMakeFiles/LLVMSupport.dir/APFloat.cpp.o] Error 1
make[1]: *** [lib/Support/CMakeFiles/LLVMSupport.dir/all] Error 2
[ 0%] Building C object runtime/libprofile/CMakeFiles/profile_rt-shared.dir/EdgeProfiling.c.o
Building C object runtime/libprofile/CMakeFiles/profile_rt-shared.dir/OptimalEdgeProfiling.c.o
Linking C shared library …/…/lib/profile_rt.so
[ 0%] Built target profile_rt-shared
make: *** [all] Error 2
mdriftmeyer@horus:~/DeveloperProjects/LLVMProject/cmake-llvm$

Of course if I configure as follows:;

mdriftmeyer@horus:~/DeveloperProjects/LLVMProject/cmake-llvm$ cmake -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_CXX_FLAGS=’-O2’ CMAKE_C_FLAGS=’-O2’ -DLLVM_BUILD_EXAMPLES=ON -DLLVM_BUILD_TESTS=ON -DLLVM_INCLUDE_TESTS=ON -DLLVM_TARGETS_TO_BUILD=‘ARM;CppBackend;PTX;Hexagon;X86’ …/trunk/llvm/

Results: after rebuilding the cache and rerunning the configuration twice the end is that LLVM/Clang builds cleanly. None of the noise above about clang++ failing to be able to build a simple c++ program nor the missing string and cmath header files.

Perhaps this is just a Debian Linux issue and has to do with upgrades to LSB 4.1 [Linux Standard Base 4.1], but then I don’t know enough about LSB to know exactly how a compiler infrastructure would be impacted by it, if at all. [http://www.linuxfoundation.org/collaborate/workgroups/lsb/lsb-41-release-notes]

NOTE: (The work on Libc++ under libcxx being put under /runtime and recognized by Cmake is still not working, from what I’ve seen, though work on it around 2 weeks prior was mentioned it would get added for Linux)

  • Marc

"Marc J. Driftmeyer" <mjd@reanimality.com> writes:

mdriftmeyer@horus:~/DeveloperProjects/LLVMProject/cmake-llvm$ cmake
-DCMAKE_BUILD_TYPE=MinSizeRel
-DCMAKE_CXX_COMPILER=/usr/local/bin/clang++
-DCMAKE_C_COMPILER=/usr/local/bin/clang -DCMAKE_CXX_FLAGS='-O2'
CMAKE_C_FLAGS='-O2' -DLLVM_BUILD_EXAMPLES=ON -DLLVM_BUILD_TESTS=ON

___^

`-D' is missing there. A pasto, I guess.

[snip]

You have changed variables that require your cache to be deleted.
Configure will be re-run and you may have to reset some variables.
The following variables have changed:
CMAKE_C_COMPILER= /usr/local/bin/clang
CMAKE_CXX_COMPILER= /usr/local/bin/clang++

Make sure you follow that advice.

Can you compile a Hello World C++ programa that uses iostreams with
Clang?

My guess is that clang's heuristics for locating g++ libraries and
headers is failing on your setup.

[snip]

Resolution: After doing an strace on the clang++ executable generated from gcc builds of llvm/clang I discovered some polluted gcc-4.7 intermixed and I had yet to install libstdc++6 (4.7) to build against.

After doing so clang/clang++ worked as expected and have been doing so for well over a year of nightly builds from trunk.

Unfortunately, I have a dilemma seeing as gcc/g++/cpp are all presently configured by Debian to target gcc-4.6 and therefore should not even have polluted the includes directories with anything but libstdc++6 (4.6.3) but that is an issue for Debian who seems to update it’s libs in a mixed fashion without properly updating updates-alternatives for gcc to point to gcc-4.7 or until they have more of their distribution updated to hold both versions of libstdc++6 for 4.6.3 and a differentiated naming convention for the upcoming version, 4.7 instead of blatantly rewriting over the 4.6.3 libstdc++6 package with the 4.7 revision.

  • Marc