diff options
Diffstat (limited to 'cmake/modules/LLVMExternalProjectUtils.cmake')
-rw-r--r-- | cmake/modules/LLVMExternalProjectUtils.cmake | 90 |
1 files changed, 44 insertions, 46 deletions
diff --git a/cmake/modules/LLVMExternalProjectUtils.cmake b/cmake/modules/LLVMExternalProjectUtils.cmake index c2d9f530c200e..3e7355d4d6b2c 100644 --- a/cmake/modules/LLVMExternalProjectUtils.cmake +++ b/cmake/modules/LLVMExternalProjectUtils.cmake @@ -2,12 +2,12 @@ include(ExternalProject) # llvm_ExternalProject_BuildCmd(out_var target) # Utility function for constructing command lines for external project targets -function(llvm_ExternalProject_BuildCmd out_var target) +function(llvm_ExternalProject_BuildCmd out_var target bin_dir) if (CMAKE_GENERATOR MATCHES "Make") # Use special command for Makefiles to support parallelism. - set(${out_var} "$(MAKE)" "${target}" PARENT_SCOPE) + set(${out_var} "$(MAKE)" "-C" "${BINARY_DIR}" "${target}" PARENT_SCOPE) else() - set(${out_var} ${CMAKE_COMMAND} --build . --target ${target} + set(${out_var} ${CMAKE_COMMAND} --build ${bin_dir} --target ${target} --config $<CONFIGURATION> PARENT_SCOPE) endif() endfunction() @@ -19,6 +19,8 @@ endfunction() # Exclude this project from the all target # NO_INSTALL # Don't generate install targets for this project +# ALWAYS_CLEAN +# Always clean the sub-project before building # CMAKE_ARGS arguments... # Optional cmake arguments to pass when configuring the project # TOOLCHAIN_TOOLS targets... @@ -27,11 +29,15 @@ endfunction() # Targets that this project depends on # EXTRA_TARGETS targets... # Extra targets in the subproject to generate targets for +# PASSTHROUGH_PREFIXES prefix... +# Extra variable prefixes (name is always included) to pass down # ) function(llvm_ExternalProject_Add name source_dir) - cmake_parse_arguments(ARG "USE_TOOLCHAIN;EXCLUDE_FROM_ALL;NO_INSTALL" + cmake_parse_arguments(ARG + "USE_TOOLCHAIN;EXCLUDE_FROM_ALL;NO_INSTALL;ALWAYS_CLEAN" "SOURCE_DIR" - "CMAKE_ARGS;TOOLCHAIN_TOOLS;RUNTIME_LIBRARIES;DEPENDS;EXTRA_TARGETS" ${ARGN}) + "CMAKE_ARGS;TOOLCHAIN_TOOLS;RUNTIME_LIBRARIES;DEPENDS;EXTRA_TARGETS;PASSTHROUGH_PREFIXES" + ${ARGN}) canonicalize_tool_name(${name} nameCanon) if(NOT ARG_TOOLCHAIN_TOOLS) set(ARG_TOOLCHAIN_TOOLS clang lld) @@ -52,6 +58,10 @@ function(llvm_ExternalProject_Add name source_dir) endif() endforeach() + if(ARG_ALWAYS_CLEAN) + set(always_clean clean) + endif() + list(FIND TOOLCHAIN_TOOLS clang FOUND_CLANG) if(FOUND_CLANG GREATER -1) set(CLANG_IN_TOOLCHAIN On) @@ -61,23 +71,6 @@ function(llvm_ExternalProject_Add name source_dir) list(APPEND TOOLCHAIN_BINS ${RUNTIME_LIBRARIES}) endif() - if(CMAKE_VERSION VERSION_GREATER 3.1.0) - set(cmake_3_1_EXCLUDE_FROM_ALL EXCLUDE_FROM_ALL 1) - endif() - - if(CMAKE_VERSION VERSION_GREATER 3.3.20150708) - set(cmake_3_4_USES_TERMINAL_OPTIONS - USES_TERMINAL_CONFIGURE 1 - USES_TERMINAL_BUILD 1 - USES_TERMINAL_INSTALL 1 - ) - set(cmake_3_4_USES_TERMINAL USES_TERMINAL 1) - endif() - - if(CMAKE_VERSION VERSION_GREATER 3.1.20141116) - set(cmake_3_2_USES_TERMINAL USES_TERMINAL) - endif() - set(STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/${name}-stamps/) set(BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${name}-bins/) @@ -85,18 +78,21 @@ function(llvm_ExternalProject_Add name source_dir) COMMAND ${CMAKE_COMMAND} -E remove_directory ${BINARY_DIR} COMMAND ${CMAKE_COMMAND} -E remove_directory ${STAMP_DIR} COMMENT "Clobbering ${name} build and stamp directories" - ${cmake_3_2_USES_TERMINAL} + USES_TERMINAL ) - # Find all variables that start with COMPILER_RT and populate a variable with - # them. + # Find all variables that start with a prefix and propagate them through get_cmake_property(variableNames VARIABLES) - foreach(variableName ${variableNames}) - if(variableName MATCHES "^${nameCanon}") - string(REPLACE ";" "\;" value "${${variableName}}") - list(APPEND PASSTHROUGH_VARIABLES - -D${variableName}=${value}) - endif() + + list(APPEND ARG_PASSTHROUGH_PREFIXES ${nameCanon}) + foreach(prefix ${ARG_PASSTHROUGH_PREFIXES}) + foreach(variableName ${variableNames}) + if(variableName MATCHES "^${prefix}") + string(REPLACE ";" "\;" value "${${variableName}}") + list(APPEND PASSTHROUGH_VARIABLES + -D${variableName}=${value}) + endif() + endforeach() endforeach() if(ARG_USE_TOOLCHAIN) @@ -120,7 +116,7 @@ function(llvm_ExternalProject_Add name source_dir) DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${name}-clobber-stamp) if(ARG_EXCLUDE_FROM_ALL) - set(exclude ${cmake_3_1_EXCLUDE_FROM_ALL}) + set(exclude EXCLUDE_FROM_ALL 1) endif() ExternalProject_Add(${name} @@ -134,33 +130,35 @@ function(llvm_ExternalProject_Add name source_dir) CMAKE_ARGS ${${nameCanon}_CMAKE_ARGS} ${compiler_args} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} + -DLLVM_BINARY_DIR=${PROJECT_BINARY_DIR} + -DLLVM_CONFIG_PATH=$<TARGET_FILE:llvm-config> + -DLLVM_ENABLE_WERROR=${LLVM_ENABLE_WERROR} + -DPACKAGE_VERSION=${PACKAGE_VERSION} + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} ${ARG_CMAKE_ARGS} ${PASSTHROUGH_VARIABLES} INSTALL_COMMAND "" STEP_TARGETS configure build - ${cmake_3_4_USES_TERMINAL_OPTIONS} + BUILD_ALWAYS 1 + USES_TERMINAL_CONFIGURE 1 + USES_TERMINAL_BUILD 1 + USES_TERMINAL_INSTALL 1 ) if(ARG_USE_TOOLCHAIN) - ExternalProject_Add_Step(${name} force-rebuild - COMMENT "Forcing rebuild becaues tools have changed" - DEPENDERS configure - DEPENDS ${TOOLCHAIN_BINS} - ${cmake_3_4_USES_TERMINAL} ) - endif() - - if(ARG_USE_TOOLCHAIN) set(force_deps DEPENDS ${TOOLCHAIN_BINS}) endif() - llvm_ExternalProject_BuildCmd(run_clean clean) + llvm_ExternalProject_BuildCmd(run_clean clean ${BINARY_DIR}) ExternalProject_Add_Step(${name} clean COMMAND ${run_clean} COMMENT "Cleaning ${name}..." DEPENDEES configure ${force_deps} WORKING_DIRECTORY ${BINARY_DIR} - ${cmake_3_4_USES_TERMINAL} + EXCLUDE_FROM_MAIN 1 + USES_TERMINAL 1 ) ExternalProject_Add_StepTargets(${name} clean) @@ -179,17 +177,17 @@ function(llvm_ExternalProject_Add name source_dir) COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=${name} -P "${CMAKE_BINARY_DIR}/cmake_install.cmake" - ${cmake_3_2_USES_TERMINAL}) + USES_TERMINAL) endif() # Add top-level targets foreach(target ${ARG_EXTRA_TARGETS}) - llvm_ExternalProject_BuildCmd(build_runtime_cmd ${target}) + llvm_ExternalProject_BuildCmd(build_runtime_cmd ${target} ${BINARY_DIR}) add_custom_target(${target} COMMAND ${build_runtime_cmd} DEPENDS ${name}-configure WORKING_DIRECTORY ${BINARY_DIR} VERBATIM - ${cmake_3_2_USES_TERMINAL}) + USES_TERMINAL) endforeach() endfunction() |