]>
Commit | Line | Data |
---|---|---|
92a42be0 SL |
1 | # On Windows, CMAKE_*_FLAGS are built for MSVC but we use the GCC clang.exe, |
2 | # which uses completely different flags. Translate some common flag types, and | |
3 | # drop the rest. | |
4 | function(translate_msvc_cflags out_flags msvc_flags) | |
5 | # Insert an empty string in the list to simplify processing. | |
6 | set(msvc_flags ";${msvc_flags}") | |
7 | ||
8 | # Canonicalize /flag to -flag. | |
9 | string(REPLACE ";/" ";-" msvc_flags "${msvc_flags}") | |
10 | ||
11 | # Make space separated -D and -U flags into joined flags. | |
12 | string(REGEX REPLACE ";-\([DU]\);" ";-\\1" msvc_flags "${msvc_flags}") | |
13 | ||
14 | set(clang_flags "") | |
15 | foreach(flag ${msvc_flags}) | |
16 | if ("${flag}" MATCHES "^-[DU]") | |
17 | # Pass through basic command line macro definitions (-DNDEBUG). | |
18 | list(APPEND clang_flags "${flag}") | |
19 | elseif ("${flag}" MATCHES "^-O[2x]") | |
20 | # Canonicalize normal optimization flags to -O2. | |
21 | list(APPEND clang_flags "-O2") | |
22 | endif() | |
23 | endforeach() | |
24 | set(${out_flags} "${clang_flags}" PARENT_SCOPE) | |
25 | endfunction() | |
26 | ||
1a4d82fc JJ |
27 | # Compile a source into an object file with COMPILER_RT_TEST_COMPILER using |
28 | # a provided compile flags and dependenices. | |
29 | # clang_compile(<object> <source> | |
30 | # CFLAGS <list of compile flags> | |
31 | # DEPS <list of dependencies>) | |
32 | macro(clang_compile object_file source) | |
92a42be0 | 33 | cmake_parse_arguments(SOURCE "" "" "CFLAGS;DEPS" ${ARGN}) |
1a4d82fc JJ |
34 | get_filename_component(source_rpath ${source} REALPATH) |
35 | if(NOT COMPILER_RT_STANDALONE_BUILD) | |
92a42be0 SL |
36 | list(APPEND SOURCE_DEPS clang compiler-rt-headers) |
37 | endif() | |
38 | if (TARGET CompilerRTUnitTestCheckCxx) | |
39 | list(APPEND SOURCE_DEPS CompilerRTUnitTestCheckCxx) | |
1a4d82fc JJ |
40 | endif() |
41 | string(REGEX MATCH "[.](cc|cpp)$" is_cxx ${source_rpath}) | |
42 | if(is_cxx) | |
43 | string(REPLACE " " ";" global_flags "${CMAKE_CXX_FLAGS}") | |
44 | else() | |
45 | string(REPLACE " " ";" global_flags "${CMAKE_C_FLAGS}") | |
46 | endif() | |
92a42be0 SL |
47 | |
48 | if (MSVC) | |
49 | translate_msvc_cflags(global_flags "${global_flags}") | |
50 | endif() | |
51 | ||
52 | if (APPLE) | |
53 | set(global_flags ${OSX_SYSROOT_FLAG} ${global_flags}) | |
54 | endif() | |
55 | ||
1a4d82fc JJ |
56 | # Ignore unknown warnings. CMAKE_CXX_FLAGS may contain GCC-specific options |
57 | # which are not supported by Clang. | |
58 | list(APPEND global_flags -Wno-unknown-warning-option) | |
59 | set(compile_flags ${global_flags} ${SOURCE_CFLAGS}) | |
60 | add_custom_command( | |
61 | OUTPUT ${object_file} | |
92a42be0 SL |
62 | COMMAND ${COMPILER_RT_TEST_COMPILER} ${compile_flags} -c |
63 | -o "${object_file}" | |
1a4d82fc JJ |
64 | ${source_rpath} |
65 | MAIN_DEPENDENCY ${source} | |
66 | DEPENDS ${SOURCE_DEPS}) | |
67 | endmacro() | |
92a42be0 SL |
68 | |
69 | # On Darwin, there are no system-wide C++ headers and the just-built clang is | |
70 | # therefore not able to compile C++ files unless they are copied/symlinked into | |
71 | # ${LLVM_BINARY_DIR}/include/c++ | |
72 | # The just-built clang is used to build compiler-rt unit tests. Let's detect | |
73 | # this before we try to build the tests and print out a suggestion how to fix | |
74 | # it. | |
75 | # On other platforms, this is currently not an issue. | |
76 | macro(clang_compiler_add_cxx_check) | |
77 | if (APPLE) | |
78 | set(CMD | |
79 | "echo '#include <iostream>' | ${COMPILER_RT_TEST_COMPILER} ${OSX_SYSROOT_FLAG} -E -x c++ - > /dev/null" | |
80 | "if [ $? != 0 ] " | |
81 | " then echo" | |
82 | " echo 'Your just-built clang cannot find C++ headers, which are needed to build and run compiler-rt tests.'" | |
83 | " echo 'You should copy or symlink your system C++ headers into ${LLVM_BINARY_DIR}/include/c++'" | |
84 | " if [ -d $(dirname $(dirname $(xcrun -f clang)))/include/c++ ]" | |
85 | " then echo 'e.g. with:'" | |
86 | " echo ' cp -r' $(dirname $(dirname $(xcrun -f clang)))/include/c++ '${LLVM_BINARY_DIR}/include/'" | |
87 | " elif [ -d $(dirname $(dirname $(xcrun -f clang)))/lib/c++ ]" | |
88 | " then echo 'e.g. with:'" | |
89 | " echo ' cp -r' $(dirname $(dirname $(xcrun -f clang)))/lib/c++ '${LLVM_BINARY_DIR}/include/'" | |
90 | " fi" | |
91 | " echo 'This can also be fixed by checking out the libcxx project from llvm.org and installing the headers'" | |
92 | " echo 'into your build directory:'" | |
5bcae85e SL |
93 | " echo ' cd ${LLVM_MAIN_SRC_DIR}/projects && svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx'" |
94 | " echo ' cd ${LLVM_BINARY_DIR} && make -C ${LLVM_MAIN_SRC_DIR}/projects/libcxx installheaders HEADER_DIR=${LLVM_BINARY_DIR}/include'" | |
92a42be0 SL |
95 | " echo" |
96 | " false" | |
97 | "fi" | |
98 | ) | |
99 | add_custom_target(CompilerRTUnitTestCheckCxx | |
100 | COMMAND bash -c "${CMD}" | |
101 | COMMENT "Checking that just-built clang can find C++ headers..." | |
102 | VERBATIM) | |
103 | if (TARGET clang) | |
104 | ADD_DEPENDENCIES(CompilerRTUnitTestCheckCxx clang) | |
105 | endif() | |
106 | endif() | |
107 | endmacro() |