1 # TODO: Set the install directory.
3 include(ExternalProject)
9 foreach (dir ${known_subdirs})
10 if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${dir}/CMakeLists.txt)
11 add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${dir})
15 function(get_ext_project_build_command out_var target)
16 if (CMAKE_GENERATOR MATCHES "Make")
17 # Use special command for Makefiles to support parallelism.
18 set(${out_var} "$(MAKE)" "${target}" PARENT_SCOPE)
20 set(${out_var} ${CMAKE_COMMAND} --build . --target ${target}
21 --config $<CONFIGURATION> PARENT_SCOPE)
25 set(COMPILER_RT_SRC_ROOT ${LLVM_MAIN_SRC_DIR}/projects/compiler-rt)
26 # Fallback to the external path, if the other one isn't available.
27 # This is the same behavior (try "internal", then check the LLVM_EXTERNAL_...
28 # variable) as in add_llvm_external_project
29 if(NOT EXISTS ${COMPILER_RT_SRC_ROOT})
30 set(COMPILER_RT_SRC_ROOT ${LLVM_EXTERNAL_COMPILER_RT_SOURCE_DIR})
33 if(LLVM_BUILD_EXTERNAL_COMPILER_RT AND EXISTS ${COMPILER_RT_SRC_ROOT}/)
34 if(CMAKE_VERSION VERSION_GREATER 3.3.20150708)
35 set(cmake_3_4_USES_TERMINAL_OPTIONS
36 USES_TERMINAL_CONFIGURE 1
38 USES_TERMINAL_INSTALL 1
42 # Add compiler-rt as an external project.
43 set(COMPILER_RT_PREFIX ${CMAKE_BINARY_DIR}/projects/compiler-rt)
45 set(STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/compiler-rt-stamps/)
46 set(BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/compiler-rt-bins/)
48 add_custom_target(compiler-rt-clear
49 COMMAND ${CMAKE_COMMAND} -E remove_directory ${BINARY_DIR}
50 COMMAND ${CMAKE_COMMAND} -E remove_directory ${STAMP_DIR}
51 COMMENT "Clobberring compiler-rt build and stamp directories"
54 # Find all variables that start with COMPILER_RT and populate a variable with
56 get_cmake_property(variableNames VARIABLES)
57 foreach(variableName ${variableNames})
58 if(variableName MATCHES "^COMPILER_RT")
59 string(REPLACE ";" "\;" value "${${variableName}}")
60 list(APPEND COMPILER_RT_PASSTHROUGH_VARIABLES
61 -D${variableName}=${value})
65 ExternalProject_Add(compiler-rt
66 DEPENDS llvm-config clang
67 PREFIX ${COMPILER_RT_PREFIX}
68 SOURCE_DIR ${COMPILER_RT_SRC_ROOT}
69 STAMP_DIR ${STAMP_DIR}
70 BINARY_DIR ${BINARY_DIR}
71 CMAKE_ARGS ${CLANG_COMPILER_RT_CMAKE_ARGS}
72 -DCMAKE_C_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang
73 -DCMAKE_CXX_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang++
74 -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
75 -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
76 -DLLVM_CONFIG_PATH=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-config
77 -DCOMPILER_RT_OUTPUT_DIR=${LLVM_LIBRARY_OUTPUT_INTDIR}/clang/${CLANG_VERSION}
78 -DCOMPILER_RT_EXEC_OUTPUT_DIR=${LLVM_RUNTIME_OUTPUT_INTDIR}
79 -DCOMPILER_RT_INSTALL_PATH:STRING=lib${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION}
80 -DCOMPILER_RT_INCLUDE_TESTS=${LLVM_INCLUDE_TESTS}
81 -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
82 ${COMPILER_RT_PASSTHROUGH_VARIABLES}
84 STEP_TARGETS configure build
85 ${cmake_3_4_USES_TERMINAL_OPTIONS}
88 get_ext_project_build_command(run_clean_compiler_rt clean)
89 ExternalProject_Add_Step(compiler-rt clean
90 COMMAND ${run_clean_compiler_rt}
91 COMMENT "Cleaning compiler-rt..."
95 WORKING_DIRECTORY ${BINARY_DIR}
98 install(CODE "execute_process\(COMMAND \${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=\${CMAKE_INSTALL_PREFIX} -P ${BINARY_DIR}/cmake_install.cmake \)"
99 COMPONENT compiler-rt)
101 add_custom_target(install-compiler-rt
103 COMMAND "${CMAKE_COMMAND}"
104 -DCMAKE_INSTALL_COMPONENT=compiler-rt
105 -P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
107 # Add top-level targets that build specific compiler-rt runtimes.
108 set(COMPILER_RT_RUNTIMES asan builtins dfsan lsan msan profile tsan ubsan)
109 foreach(runtime ${COMPILER_RT_RUNTIMES})
110 get_ext_project_build_command(build_runtime_cmd ${runtime})
111 add_custom_target(${runtime}
112 COMMAND ${build_runtime_cmd}
113 DEPENDS compiler-rt-configure
114 WORKING_DIRECTORY ${BINARY_DIR}
118 if(LLVM_INCLUDE_TESTS)
119 # Add binaries that compiler-rt tests depend on.
120 set(COMPILER_RT_TEST_DEPENDENCIES
121 FileCheck count not llvm-nm llvm-objdump llvm-symbolizer)
123 # Add top-level targets for various compiler-rt test suites.
124 set(COMPILER_RT_TEST_SUITES check-asan check-asan-dynamic check-dfsan
125 check-lsan check-msan check-sanitizer check-tsan check-ubsan)
126 foreach(test_suite ${COMPILER_RT_TEST_SUITES})
127 get_ext_project_build_command(run_test_suite ${test_suite})
128 add_custom_target(${test_suite}
129 COMMAND ${run_test_suite}
130 DEPENDS compiler-rt-build ${COMPILER_RT_TEST_DEPENDENCIES}
131 WORKING_DIRECTORY ${BINARY_DIR}
135 # Add special target to run all compiler-rt test suites.
136 get_ext_project_build_command(run_check_compiler_rt check-all)
137 add_custom_target(check-compiler-rt
138 COMMAND ${run_check_compiler_rt}
139 DEPENDS compiler-rt-build ${COMPILER_RT_TEST_DEPENDENCIES}
140 WORKING_DIRECTORY ${BINARY_DIR}
145 set(src "${CMAKE_CURRENT_SOURCE_DIR}/vtables_blacklist.txt")
146 set(dst "${LLVM_LIBRARY_OUTPUT_INTDIR}/clang/${CLANG_VERSION}/vtables_blacklist.txt")
147 add_custom_command(OUTPUT ${dst}
149 COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst}
150 COMMENT "Copying vtables blacklist")
151 add_custom_target(vtables_blacklist DEPENDS ${dst})
153 add_dependencies(clang vtables_blacklist)
155 install(FILES ${src} DESTINATION lib${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION})