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})
# 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)
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)
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})
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)
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)
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.
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()