Index: runtimes/CMakeLists.txt =================================================================== --- runtimes/CMakeLists.txt +++ runtimes/CMakeLists.txt @@ -15,6 +15,25 @@ endif() endforeach() +# Side-by-side subprojects layout. +set(LLVM_ALL_RUNTIMES "libcxx;libcxxabi;libunwind;compiler-rt") +set(LLVM_ENABLE_RUNTIMES "" CACHE STRING + "Semicolon-separated list of runtimes to build (${LLVM_ALL_RUNTIMES}), or \"all\".") +if(LLVM_ENABLE_RUNTIMES STREQUAL "all" ) + set(LLVM_ENABLE_RUNTIMES ${LLVM_ALL_RUNTIMES}) +endif() +foreach(proj ${LLVM_ENABLE_RUNTIMES}) + set(proj_dir "${CMAKE_CURRENT_SOURCE_DIR}/../../${proj}") + if(IS_DIRECTORY ${proj_dir} AND EXISTS ${proj_dir}/CMakeLists.txt) + list(APPEND runtimes ${proj_dir}) + else() + message(FATAL_ERROR "LLVM_ENABLE_RUNTIMES requests ${proj} but directory not found: ${proj_dir}") + endif() + string(TOUPPER "${proj}" canon_name) + STRING(REGEX REPLACE "-" "_" canon_name ${canon_name}) + set(LLVM_EXTERNAL_${canon_name}_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../${proj}") +endforeach() + # If this file is acting as a top-level CMake invocation, this code path is # triggered by the external project call for the runtimes target below. if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}) @@ -100,7 +119,7 @@ set(${canon_name}_STANDALONE_BUILD On) if(LLVM_RUNTIMES_TARGET) - if(NOT "${entry}" MATCHES "compiler-rt") + if(NOT "${projName}" MATCHES "compiler-rt") set(${canon_name}_INSTALL_PREFIX "lib/${LLVM_RUNTIMES_PREFIX}/" CACHE STRING "" FORCE) endif() endif() @@ -120,7 +139,7 @@ get_filename_component(projName ${entry} NAME) if(LLVM_RUNTIMES_TARGET) - if(NOT "${entry}" MATCHES "compiler-rt") + if(NOT "${projName}" MATCHES "compiler-rt") set(LLVM_BINARY_DIR "${LLVM_LIBRARY_DIR}/${LLVM_RUNTIMES_PREFIX}") set(LLVM_LIBDIR_SUFFIX "${LLVM_RUNTIMES_LIBDIR_SUFFIX}") set(LLVM_LIBRARY_OUTPUT_INTDIR "${LLVM_LIBRARY_DIR}/${LLVM_RUNTIMES_PREFIX}lib${LLVM_RUNTIMES_LIBDIR_SUFFIX}") @@ -134,7 +153,7 @@ set_property(GLOBAL PROPERTY LLVM_LIT_DEPENDS) set_property(GLOBAL PROPERTY LLVM_LIT_EXTRA_ARGS) - add_subdirectory(${projName}) + add_subdirectory(${entry} ${projName}) get_property(LLVM_LIT_TESTSUITES GLOBAL PROPERTY LLVM_LIT_TESTSUITES) get_property(LLVM_LIT_PARAMS GLOBAL PROPERTY LLVM_LIT_PARAMS) @@ -147,7 +166,7 @@ list(APPEND RUNTIMES_LIT_EXTRA_ARGS ${LLVM_LIT_EXTRA_ARGS}) if(LLVM_RUNTIMES_TARGET) - if(NOT "${entry}" MATCHES "compiler-rt") + if(NOT "${projName}" 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}") @@ -207,7 +226,7 @@ function(builtin_default_target) llvm_ExternalProject_Add(builtins - ${CMAKE_CURRENT_SOURCE_DIR}/compiler-rt/lib/builtins + ${LLVM_EXTERNAL_COMPILER_RT_SOURCE_DIR}/lib/builtins CMAKE_ARGS -DLLVM_LIBRARY_OUTPUT_INTDIR=${LLVM_LIBRARY_DIR} -DLLVM_RUNTIME_OUTPUT_INTDIR=${LLVM_TOOLS_BINARY_DIR} -DCMAKE_C_COMPILER_TARGET=${TARGET_TRIPLE} @@ -237,7 +256,7 @@ endforeach() llvm_ExternalProject_Add(builtins-${target} - ${CMAKE_CURRENT_SOURCE_DIR}/compiler-rt/lib/builtins + ${LLVM_EXTERNAL_COMPILER_RT_SOURCE_DIR}/lib/builtins CMAKE_ARGS -DLLVM_LIBRARY_OUTPUT_INTDIR=${LLVM_LIBRARY_DIR} -DLLVM_RUNTIME_OUTPUT_INTDIR=${LLVM_TOOLS_BINARY_DIR} -DCMAKE_C_COMPILER_TARGET=${target} @@ -254,7 +273,7 @@ # If compiler-rt is present we need to build the builtin libraries first. This # is required because the other runtimes need the builtin libraries present # before the just-built compiler can pass the configuration tests. - if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/compiler-rt) + if(EXISTS ${LLVM_EXTERNAL_COMPILER_RT_SOURCE_DIR}) if(NOT LLVM_BUILTIN_TARGETS) builtin_default_target() else() @@ -326,7 +345,8 @@ -DCMAKE_C_COMPILER_WORKS=ON -DCMAKE_CXX_COMPILER_WORKS=ON -DCMAKE_ASM_COMPILER_WORKS=ON - PASSTHROUGH_PREFIXES ${ARG_PREFIXES} + PASSTHROUGH_PREFIXES LLVM_ENABLE_RUNTIMES + ${ARG_PREFIXES} EXTRA_TARGETS ${extra_targets} ${test_targets} ${SUB_COMPONENTS} @@ -399,6 +419,7 @@ -DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON -DLLVM_RUNTIMES_TARGET=${name} ${${name}_extra_args} + PASSTHROUGH_PREFIXES LLVM_ENABLE_RUNTIMES TOOLCHAIN_TOOLS clang lld llvm-ar llvm-ranlib EXTRA_TARGETS ${${name}_extra_targets} ${${name}_test_targets}