]> granicus.if.org Git - clang/blob - runtime/CMakeLists.txt
5c1d7deb262735b177d4227925bdf027125727b0
[clang] / runtime / CMakeLists.txt
1 # TODO: Set the install directory.
2
3 include(ExternalProject)
4
5 set(known_subdirs
6   "libcxx"
7   )
8
9 foreach (dir ${known_subdirs})
10   if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${dir}/CMakeLists.txt)
11     add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${dir})
12   endif()
13 endforeach()
14
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)
19   else()
20     set(${out_var} ${CMAKE_COMMAND} --build . --target ${target}
21                                     --config $<CONFIGURATION> PARENT_SCOPE)
22   endif()
23 endfunction()
24
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})
31 endif()
32
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
37       USES_TERMINAL_BUILD 1
38       USES_TERMINAL_INSTALL 1
39       )
40   endif()
41
42   # Add compiler-rt as an external project.
43   set(COMPILER_RT_PREFIX ${CMAKE_BINARY_DIR}/projects/compiler-rt)
44
45   set(STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/compiler-rt-stamps/)
46   set(BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/compiler-rt-bins/)
47
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"
52     )
53
54   # Find all variables that start with COMPILER_RT and populate a variable with
55   # them.
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})
62     endif()
63   endforeach()
64
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}
83     INSTALL_COMMAND ""
84     STEP_TARGETS configure build
85     ${cmake_3_4_USES_TERMINAL_OPTIONS}
86     )
87
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..."
92     DEPENDEES configure
93     DEPENDERS build
94     DEPENDS clang
95     WORKING_DIRECTORY ${BINARY_DIR}
96     )
97
98   install(CODE "execute_process\(COMMAND \${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=\${CMAKE_INSTALL_PREFIX} -P ${BINARY_DIR}/cmake_install.cmake \)"
99     COMPONENT compiler-rt)
100
101   add_custom_target(install-compiler-rt
102                     DEPENDS compiler-rt
103                     COMMAND "${CMAKE_COMMAND}"
104                              -DCMAKE_INSTALL_COMPONENT=compiler-rt
105                              -P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
106
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}
115       VERBATIM)
116   endforeach()
117
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)
122
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}
132         VERBATIM)
133     endforeach()
134
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}
141       VERBATIM)
142   endif()
143 endif()
144
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}
148                    DEPENDS ${src}
149                    COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst}
150                    COMMENT "Copying vtables blacklist")
151 add_custom_target(vtables_blacklist DEPENDS ${dst})
152 if(TARGET clang)
153   add_dependencies(clang vtables_blacklist)
154 endif()
155 install(FILES ${src} DESTINATION lib${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION})