| # TODO: Set the install directory. |
| |
| include(ExternalProject) |
| |
| set(known_subdirs |
| "libcxx" |
| ) |
| |
| foreach (dir ${known_subdirs}) |
| if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${dir}/CMakeLists.txt) |
| add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${dir}) |
| endif() |
| endforeach() |
| |
| function(get_ext_project_build_command out_var target) |
| if (CMAKE_GENERATOR MATCHES "Make") |
| # Use special command for Makefiles to support parallelism. |
| set(${out_var} "$(MAKE)" "${target}" PARENT_SCOPE) |
| else() |
| set(${out_var} ${CMAKE_COMMAND} --build . --target ${target} |
| --config $<CONFIGURATION> PARENT_SCOPE) |
| endif() |
| endfunction() |
| |
| set(COMPILER_RT_SRC_ROOT ${LLVM_MAIN_SRC_DIR}/projects/compiler-rt) |
| if(LLVM_BUILD_EXTERNAL_COMPILER_RT AND EXISTS ${COMPILER_RT_SRC_ROOT}/) |
| if(CMAKE_GENERATOR MATCHES "Ninja") |
| message(FATAL_ERROR |
| "Ninja generator can't build compiler-rt as ExternalProject." |
| "Unset LLVM_BUILD_EXTERNAL_COMPILER_RT, or don't use Ninja." |
| "See http://www.cmake.org/Bug/view.php?id=14771") |
| endif() |
| |
| # Add compiler-rt as an external project. |
| set(COMPILER_RT_PREFIX ${CMAKE_BINARY_DIR}/projects/compiler-rt) |
| |
| ExternalProject_Add(compiler-rt |
| PREFIX ${COMPILER_RT_PREFIX} |
| SOURCE_DIR ${COMPILER_RT_SRC_ROOT} |
| CMAKE_ARGS -DCMAKE_C_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang |
| -DCMAKE_CXX_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang++ |
| -DCMAKE_BUILD_TYPE=Release |
| -DLLVM_CONFIG_PATH=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-config |
| -DCOMPILER_RT_OUTPUT_DIR=${LLVM_LIBRARY_OUTPUT_INTDIR}/clang/${CLANG_VERSION} |
| -DCOMPILER_RT_EXEC_OUTPUT_DIR=${LLVM_RUNTIME_OUTPUT_INTDIR} |
| -DCOMPILER_RT_INSTALL_PATH=lib${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION} |
| -DCOMPILER_RT_INCLUDE_TESTS=${LLVM_INCLUDE_TESTS} |
| -DCOMPILER_RT_ENABLE_WERROR=ON |
| INSTALL_COMMAND "" |
| STEP_TARGETS configure build |
| ) |
| # Due to a bug, DEPENDS in ExternalProject_Add doesn't work |
| # in CMake 2.8.9 and 2.8.10. |
| add_dependencies(compiler-rt llvm-config clang) |
| |
| # Add a custom step to always re-configure compiler-rt (in case some of its |
| # sources have changed). |
| ExternalProject_Add_Step(compiler-rt force-reconfigure |
| DEPENDERS configure |
| ALWAYS 1 |
| ) |
| |
| ExternalProject_Add_Step(compiler-rt clobber |
| COMMAND ${CMAKE_COMMAND} -E remove_directory <BINARY_DIR> |
| COMMAND ${CMAKE_COMMAND} -E make_directory <BINARY_DIR> |
| COMMENT "Clobberring compiler-rt build directory..." |
| DEPENDERS configure |
| DEPENDS ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang |
| ) |
| |
| ExternalProject_Get_Property(compiler-rt BINARY_DIR) |
| set(COMPILER_RT_BINARY_DIR ${BINARY_DIR}) |
| |
| # Add top-level targets that build specific compiler-rt runtimes. |
| set(COMPILER_RT_RUNTIMES asan builtins dfsan lsan msan profile tsan ubsan) |
| foreach(runtime ${COMPILER_RT_RUNTIMES}) |
| get_ext_project_build_command(build_runtime_cmd ${runtime}) |
| add_custom_target(${runtime} |
| COMMAND ${build_runtime_cmd} |
| DEPENDS compiler-rt-configure |
| WORKING_DIRECTORY ${COMPILER_RT_BINARY_DIR} |
| VERBATIM) |
| endforeach() |
| |
| # Add binaries that compiler-rt tests depend on. |
| set(COMPILER_RT_TEST_DEPENDENCIES |
| FileCheck count not llvm-nm llvm-symbolizer) |
| |
| # Add top-level targets for various compiler-rt test suites. |
| set(COMPILER_RT_TEST_SUITES check-asan check-dfsan check-lsan check-msan |
| check-sanitizer check-tsan check-ubsan) |
| foreach(test_suite ${COMPILER_RT_TEST_SUITES}) |
| get_ext_project_build_command(run_test_suite ${test_suite}) |
| add_custom_target(${test_suite} |
| COMMAND ${run_test_suite} |
| DEPENDS compiler-rt-build ${COMPILER_RT_TEST_DEPENDENCIES} |
| WORKING_DIRECTORY ${COMPILER_RT_BINARY_DIR} |
| VERBATIM) |
| endforeach() |
| |
| # Add special target to run all compiler-rt test suites. |
| get_ext_project_build_command(run_check_compiler_rt check-all) |
| add_custom_target(check-compiler-rt |
| COMMAND ${run_check_compiler_rt} |
| DEPENDS compiler-rt-build ${COMPILER_RT_TEST_DEPENDENCIES} |
| WORKING_DIRECTORY ${COMPILER_RT_BINARY_DIR} |
| VERBATIM) |
| endif() |