Index: llvm/trunk/cmake/modules/LLVMExternalProjectUtils.cmake =================================================================== --- llvm/trunk/cmake/modules/LLVMExternalProjectUtils.cmake +++ llvm/trunk/cmake/modules/LLVMExternalProjectUtils.cmake @@ -195,8 +195,16 @@ # Add top-level targets foreach(target ${ARG_EXTRA_TARGETS}) + string(REPLACE ":" ";" target_list ${target}) + list(GET target_list 0 target) + list(LENGTH target_list target_list_len) + if(${target_list_len} GREATER 1) + list(GET target_list 1 target_name) + else() + set(target_name "${target}") + endif() llvm_ExternalProject_BuildCmd(build_runtime_cmd ${target} ${BINARY_DIR}) - add_custom_target(${target} + add_custom_target(${target_name} COMMAND ${build_runtime_cmd} DEPENDS ${name}-configure WORKING_DIRECTORY ${BINARY_DIR} Index: llvm/trunk/runtimes/CMakeLists.txt =================================================================== --- llvm/trunk/runtimes/CMakeLists.txt +++ llvm/trunk/runtimes/CMakeLists.txt @@ -62,7 +62,7 @@ set(LLVM_MAIN_SRC_DIR ${LLVM_BUILD_MAIN_SRC_DIR}) if(APPLE) - set(LLVM_ENABLE_LIBCXX ON CACHE BOOL "") + set(LLVM_ENABLE_LIBCXX ON CACHE BOOL "") endif() set(SAFE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) @@ -96,15 +96,33 @@ # The subdirectories need to treat this as standalone builds set(${canon_name}_STANDALONE_BUILD On) + if(LLVM_RUNTIMES_TARGET) + if(NOT "${entry}" MATCHES "compiler-rt") + set(${canon_name}_INSTALL_PREFIX "lib/${LLVM_RUNTIMES_TARGET}/" CACHE STRING "" FORCE) + endif() + endif() + # Setting a variable to let sub-projects detect which other projects # will be included under here. set(HAVE_${canon_name} On) endforeach() + set(SAFE_LLVM_BINARY_DIR ${LLVM_BINARY_DIR}) + set(SAFE_LLVM_LIBRARY_OUTPUT_INTDIR ${LLVM_LIBRARY_OUTPUT_INTDIR}) + set(SAFE_LLVM_RUNTIMES_OUTPUT_INTDIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) + # We do this in two loops so that HAVE_* is set for each runtime before the # other runtimes are added. foreach(entry ${runtimes}) get_filename_component(projName ${entry} NAME) + + if(LLVM_RUNTIMES_TARGET) + if(NOT "${entry}" MATCHES "compiler-rt") + set(LLVM_BINARY_DIR "${LLVM_LIBRARY_DIR}/${LLVM_RUNTIMES_TARGET}") + set(LLVM_LIBRARY_OUTPUT_INTDIR "${LLVM_LIBRARY_DIR}/${LLVM_RUNTIMES_TARGET}/lib") + set(LLVM_RUNTIME_OUTPUT_INTDIR "${LLVM_TOOLS_BINARY_DIR}/${LLVM_RUNTIMES_TARGET}") + endif() + endif() # Between each sub-project we want to cache and clear the LIT properties set_property(GLOBAL PROPERTY LLVM_LIT_TESTSUITES) @@ -123,6 +141,14 @@ list(APPEND RUNTIMES_LIT_PARAMS ${LLVM_LIT_PARAMS}) list(APPEND RUNTIMES_LIT_DEPENDS ${LLVM_LIT_DEPENDS}) list(APPEND RUNTIMES_LIT_EXTRA_ARGS ${LLVM_LIT_EXTRA_ARGS}) + + if(LLVM_RUNTIMES_TARGET) + if(NOT "${entry}" MATCHES "compiler-rt") + set(LLVM_BINARY_DIR "${SAFE_LLVM_BINARY_DIR}") + set(LLVM_LIBRARY_OUTPUT_INTDIR "${SAFE_LLVM_LIBRARY_OUTPUT_INTDIR}") + set(LLVM_RUNTIME_OUTPUT_INTDIR "${SAFE_LLVM_RUNTIME_OUTPUT_INTDIR}") + endif() + endif() endforeach() if(LLVM_INCLUDE_TESTS) @@ -147,9 +173,9 @@ message(SEND_ERROR "Missing target for runtime component ${component}!") continue() endif() - if(LLVM_INCLUDE_TESTS AND NOT TARGET check-${component}) - message(SEND_ERROR "Missing check target for runtime component ${component}!") - continue() + + if(TARGET check-${component}) + list(APPEND SUB_CHECK_TARGETS check-${component}) endif() if(TARGET install-${component}) @@ -157,14 +183,18 @@ endif() endforeach() - configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/Components.cmake.in - ${LLVM_BINARY_DIR}/runtimes/Components.cmake) + if(LLVM_RUNTIMES_TARGET) + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/Components.cmake.in + ${LLVM_BINARY_DIR}/runtimes/${LLVM_RUNTIMES_TARGET}/Components.cmake) + else() + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/Components.cmake.in + ${LLVM_BINARY_DIR}/runtimes/Components.cmake) + endif() endif() else() # if this is included from LLVM's CMake - include(${LLVM_BINARY_DIR}/runtimes/Components.cmake OPTIONAL) - set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${LLVM_BINARY_DIR}/runtimes/Components.cmake) include(LLVMExternalProjectUtils) if(NOT LLVM_BUILD_RUNTIMES) @@ -190,6 +220,10 @@ add_custom_target(builtins) add_custom_target(install-builtins) foreach(target ${LLVM_BUILTIN_TARGETS}) + if(target STREQUAL "default") + set(target ${LLVM_DEFAULT_TARGET_TRIPLE}) + endif() + string(REPLACE "-" ";" builtin_target_list ${target}) foreach(item ${builtin_target_list}) string(TOLOWER "${item}" item_lower) @@ -246,42 +280,137 @@ list(APPEND runtime_names ${projName}) endforeach() - if(runtimes) + # runtime_register_target(target) + # Utility function to register external runtime target. + function(runtime_register_target target) + if(target STREQUAL LLVM_DEFAULT_TARGET_TRIPLE) + include(${LLVM_BINARY_DIR}/runtimes/Components.cmake OPTIONAL) + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${LLVM_BINARY_DIR}/runtimes/Components.cmake) + else() + include(${LLVM_BINARY_DIR}/runtimes/${target}/Components.cmake OPTIONAL) + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${LLVM_BINARY_DIR}/runtimes/${target}/Components.cmake) + endif() foreach(runtime_name ${runtime_names}) - list(APPEND extra_targets - ${runtime_name} - install-${runtime_name}) + list(APPEND ${target}_extra_targets + ${runtime_name}-${target} + install-${runtime_name}-${target}) if(LLVM_INCLUDE_TESTS) - list(APPEND test_targets check-${runtime_name}) + list(APPEND ${target}_test_targets check-${runtime_name}-${target}) endif() endforeach() + foreach(name IN LISTS SUB_COMPONENTS SUB_INSTALL_TARGETS) + list(APPEND ${target}_extra_targets "${name}:${name}-${target}") + endforeach() + if(LLVM_INCLUDE_TESTS) - list(APPEND test_targets runtimes-test-depends check-runtimes) - foreach(component ${SUB_COMPONENTS}) - list(APPEND SUB_COMPONENT_CHECK_TARGETS check-${component}) + list(APPEND ${target}_test_targets runtimes-test-depends-${target} check-runtimes-${target}) + foreach(name IN LISTS SUB_CHECK_TARGETS) + list(APPEND ${target}_test_targets "${name}:${name}-${target}") + list(APPEND test_targets ${name}-${target}) endforeach() + set(test_targets "${test_targets}" PARENT_SCOPE) endif() - # Create a runtimes target that uses this file as its top-level CMake file. - # The runtimes target is a configuration of all the runtime libraries - # together in a single CMake invocaiton. - llvm_ExternalProject_Add(runtimes + get_cmake_property(variableNames VARIABLES) + foreach(variableName ${variableNames}) + if(variableName MATCHES "^RUNTIMES_${target}") + string(REPLACE "RUNTIMES_${target}_" "" new_name ${variableName}) + list(APPEND ${target}_extra_args "-D${new_name}=${${variableName}}") + endif() + endforeach() + + if(NOT target STREQUAL LLVM_DEFAULT_TARGET_TRIPLE) + list(APPEND ${target}_extra_args "-DLLVM_RUNTIMES_TARGET=${target}") + endif() + + llvm_ExternalProject_Add(runtimes-${target} ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${deps} # Builtins were built separately above CMAKE_ARGS -DCOMPILER_RT_BUILD_BUILTINS=Off -DLLVM_INCLUDE_TESTS=${LLVM_INCLUDE_TESTS} + -DCMAKE_C_COMPILER_TARGET=${target} + -DCMAKE_CXX_COMPILER_TARGET=${target} + -DCMAKE_ASM_COMPILER_TARGET=${target} + -DCMAKE_C_COMPILER_WORKS=ON + -DCMAKE_CXX_COMPILER_WORKS=ON + -DCMAKE_ASM_COMPILER_WORKS=ON + -DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON + ${${target}_extra_args} PASSTHROUGH_PREFIXES ${prefixes} - EXTRA_TARGETS ${extra_targets} - ${test_targets} - ${SUB_COMPONENTS} - ${SUB_COMPONENT_CHECK_TARGETS} - ${SUB_INSTALL_TARGETS} + EXTRA_TARGETS ${${target}_extra_targets} + ${${target}_test_targets} USE_TOOLCHAIN ${EXTRA_ARGS}) - + endfunction() + + if(runtimes) + # Create a runtimes target that uses this file as its top-level CMake file. + # The runtimes target is a configuration of all the runtime libraries + # together in a single CMake invocaiton. + if(NOT LLVM_RUNTIME_TARGETS) + include(${LLVM_BINARY_DIR}/runtimes/Components.cmake OPTIONAL) + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${LLVM_BINARY_DIR}/runtimes/Components.cmake) + + foreach(runtime_name ${runtime_names}) + list(APPEND extra_targets + ${runtime_name} + install-${runtime_name}) + if(LLVM_INCLUDE_TESTS) + list(APPEND test_targets check-${runtime_name}) + endif() + endforeach() + + if(LLVM_INCLUDE_TESTS) + list(APPEND test_targets runtimes-test-depends check-runtimes) + foreach(component ${SUB_COMPONENTS}) + list(APPEND SUB_CHECK_TARGETS check-${component}) + endforeach() + endif() + + llvm_ExternalProject_Add(runtimes + ${CMAKE_CURRENT_SOURCE_DIR} + DEPENDS ${deps} + # Builtins were built separately above + CMAKE_ARGS -DCOMPILER_RT_BUILD_BUILTINS=Off + -DLLVM_INCLUDE_TESTS=${LLVM_INCLUDE_TESTS} + PASSTHROUGH_PREFIXES ${prefixes} + EXTRA_TARGETS ${extra_targets} + ${test_targets} + ${SUB_COMPONENTS} + ${SUB_CHECK_TARGETS} + ${SUB_INSTALL_TARGETS} + USE_TOOLCHAIN + ${EXTRA_ARGS}) + else() + add_custom_target(runtimes) + add_custom_target(runtimes-configure) + add_custom_target(install-runtimes) + if(LLVM_INCLUDE_TESTS) + add_custom_target(check-runtimes) + add_custom_target(runtimes-test-depends) + set(test_targets "") + endif() + + foreach(target ${LLVM_RUNTIME_TARGETS}) + if(target STREQUAL "default") + set(target ${LLVM_DEFAULT_TARGET_TRIPLE}) + endif() + + runtime_register_target(${target}) + + add_dependencies(runtimes runtimes-${target}) + add_dependencies(runtimes-configure runtimes-${target}-configure) + add_dependencies(install-runtimes install-runtimes-${target}) + if(LLVM_INCLUDE_TESTS) + add_dependencies(check-runtimes check-runtimes-${target}) + add_dependencies(runtimes-test-depends runtimes-test-depends-${target}) + endif() + endforeach() + endif() + # TODO: This is a hack needed because the libcxx headers are copied into the # build directory during configuration. Without that step the clang in the # build directory cannot find the C++ headers in certain configurations. @@ -306,7 +435,7 @@ sancov sanstats ) - foreach(target ${test_targets} ${SUB_COMPONENT_CHECK_TARGETS}) + foreach(target ${test_targets} ${SUB_CHECK_TARGETS}) add_dependencies(${target} ${RUNTIMES_TEST_DEPENDS}) endforeach() endif() Index: llvm/trunk/runtimes/Components.cmake.in =================================================================== --- llvm/trunk/runtimes/Components.cmake.in +++ llvm/trunk/runtimes/Components.cmake.in @@ -1,2 +1,3 @@ set(SUB_COMPONENTS @SUB_COMPONENTS@) +set(SUB_CHECK_TARGETS @SUB_CHECK_TARGETS@) set(SUB_INSTALL_TARGETS @SUB_INSTALL_TARGETS@)