Trouble cross compiling clang/llvm using clang/llvm

Hi all,

Long time fan, first time caller.

I’m trying to generate an arm->arm clang using the instructions here:

http://llvm.org/docs/HowToCrossCompileLLVM.html

I’ve had to make some minor modifications for my environment

CC=‘clang’ \

CXX=‘clang++’ \

cmake -G Ninja \

…/llvm \

-DCMAKE_CROSSCOMPILING=True \

-DCMAKE_INSTALL_PREFIX:PATH=$ROOT_DIR/install \

-DLLVM_TABLEGEN=$HOME/bin/llvm-tblgen \

-DCLANG_TABLEGEN=$HOME/bin/clang-tblgen \

-DLLVM_DEFAULT_TARGET_TRIPLE=arm-linux-gnueabihf \

-DLLVM_TARGET_ARCH=ARM \

-DLLVM_TARGETS_TO_BUILD=ARM \

-DCMAKE_CXX_FLAGS=‘-target arm-linux-gnueabihf -mcpu=cortex-a9 -I/usr/arm-linux-gnueabihf/include/c++/4.7.3/arm-linux-gnueabihf/ -I/usr/arm-linux-gnueabihf/include/c++/4.7.3/ -I/usr/arm-linux-gnueabihf/include/ -mfloat-abi=hard -ccc-gcc-name arm-linux-gnueabihf-gcc-4.7’ \

-DCMAKE_BUILD_TYPE=Release \

-DLLVM_ENABLE_PIC=False \

-Wno-dev

I’ve tried clang 3.5, clang tot
I’ve tried arm-linux-gnueabihf 4.7.3 (ubuntu) and 4.9.2 (Linaro)

I’m getting this error:

– Performing Test LLVM_NO_OLD_LIBSTDCXX

– Performing Test LLVM_NO_OLD_LIBSTDCXX - Failed

CMake Error at cmake/modules/HandleLLVMOptions.cmake:38 (message):

Host Clang must be able to find libstdc++4.7 or newer!

Call Stack (most recent call first):

CMakeLists.txt:339 (include)

Checking into the cmake logs, it’s trying to compile this program, which I can build just fine:

vharron@tifa:~/ll/cross/build$ cat test.cpp
#include
std::atomic x(0.0f);
int main() { return (float)x; }

vharron@tifa:~/ll/cross/build$ clang++ -std=c++0x test.cpp -target arm-linux-gnueabihf -mcpu=cortex-a9 -I/usr/arm-linux-gnueabihf/include/c++/4.7.3/arm-linux-gnueabihf/ -I/usr/arm-linux-gnueabihf/include/c++/4.7.3/ -I/usr/arm-linux-gnueabihf/include/ -mfloat-abi=hard -ccc-gcc-name arm-linux-gnueabihf-gcc-4.7

vharron@tifa:~/ll/cross/build$ file a.out
a.out: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=c998b71c4d3a063e0f8804f24b47303455318cf2, not stripped

The docs for check_cxx_source_compiles
http://www.cmake.org/cmake/help/v3.0/module/CheckCXXSourceCompiles.html

say that you can modify the way check is run by setting CMAKE_REQUIRED_FLAGS
so I tried that, but it didn’t help.

How can I figure out what command line check_cxx_source_compiles is using?

diff --git a/cmake/modules/HandleLLVMOptions.cmake b/cmake/modules/HandleLLVMOptions.cmake
index 2ee0dd5…c949f5d 100644
— a/cmake/modules/HandleLLVMOptions.cmake
+++ b/cmake/modules/HandleLLVMOptions.cmake
@@ -28,7 +28,8 @@ if(NOT LLVM_FORCE_USE_OLD_TOOLCHAIN)
if(NOT LLVM_ENABLE_LIBCXX)
set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
set(OLD_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})

  • set(CMAKE_REQUIRED_FLAGS “-std=c++0x”)
  • set(CMAKE_REQUIRED_FLAGS "-std=c++0x " ${CMAKE_CXX_FLAGS} )
  • message( CMAKE_REQUIRED_FLAGS = ${CMAKE_REQUIRED_FLAGS} )
    check_cxx_source_compiles("
    #include
    std::atomic x(0.0f);

There are several more check_cxx_source_compiles failures. I can get past them if I hack them all out but I’m looking for the “right” way.

Thanks,

Vince

Hi Vince,

You have a -std=c++0x in your compile argument but not on the CMAKE flags.
Are you sure it's being added by default?

cheers,
--renato