# 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-asan-dynamic 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()