summaryrefslogtreecommitdiff
path: root/cmake/modules/LLVMExternalProjectUtils.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/modules/LLVMExternalProjectUtils.cmake')
-rw-r--r--cmake/modules/LLVMExternalProjectUtils.cmake90
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()