|
|
@@ -1,6 +1,8 @@
|
|
|
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
|
# file Copyright.txt or https://cmake.org/licensing for details.
|
|
|
|
|
|
+include_guard(GLOBAL)
|
|
|
+
|
|
|
#[=======================================================================[.rst:
|
|
|
ExternalProject
|
|
|
---------------
|
|
|
@@ -1111,60 +1113,37 @@ cmake_policy(PUSH)
|
|
|
cmake_policy(SET CMP0054 NEW) # if() quoted variables not dereferenced
|
|
|
cmake_policy(SET CMP0057 NEW) # if() supports IN_LIST
|
|
|
|
|
|
-# Pre-compute a regex to match documented keywords for each command.
|
|
|
-math(EXPR _ep_documentation_line_count "${CMAKE_CURRENT_LIST_LINE} - 4")
|
|
|
-file(STRINGS "${CMAKE_CURRENT_LIST_FILE}" lines
|
|
|
- LIMIT_COUNT ${_ep_documentation_line_count}
|
|
|
- REGEX "^\\.\\. command:: [A-Za-z0-9_]+|^ +``[A-Z0-9_]+ [^`]*``$")
|
|
|
-foreach(line IN LISTS lines)
|
|
|
- if("${line}" MATCHES "^\\.\\. command:: ([A-Za-z0-9_]+)")
|
|
|
- if(_ep_func)
|
|
|
- string(APPEND _ep_keywords_${_ep_func} ")$")
|
|
|
- endif()
|
|
|
- set(_ep_func "${CMAKE_MATCH_1}")
|
|
|
- #message("function [${_ep_func}]")
|
|
|
- set(_ep_keywords_${_ep_func} "^(")
|
|
|
- set(_ep_keyword_sep)
|
|
|
- elseif("${line}" MATCHES "^ +``([A-Z0-9_]+) [^`]*``$")
|
|
|
- set(_ep_key "${CMAKE_MATCH_1}")
|
|
|
- # COMMAND should never be included as a keyword,
|
|
|
- # for ExternalProject_Add(), as it is treated as a
|
|
|
- # special case by argument parsing as an extension
|
|
|
- # of a previous ..._COMMAND
|
|
|
- if("x${_ep_key}x" STREQUAL "xCOMMANDx" AND
|
|
|
- "x${_ep_func}x" STREQUAL "xExternalProject_Addx")
|
|
|
- continue()
|
|
|
- endif()
|
|
|
- #message(" keyword [${_ep_key}]")
|
|
|
- string(APPEND _ep_keywords_${_ep_func}
|
|
|
- "${_ep_keyword_sep}${_ep_key}")
|
|
|
- set(_ep_keyword_sep "|")
|
|
|
- endif()
|
|
|
-endforeach()
|
|
|
-if(_ep_func)
|
|
|
- string(APPEND _ep_keywords_${_ep_func} ")$")
|
|
|
-endif()
|
|
|
-
|
|
|
-# Save regex matching supported hash algorithm names.
|
|
|
-set(_ep_hash_algos "MD5|SHA1|SHA224|SHA256|SHA384|SHA512|SHA3_224|SHA3_256|SHA3_384|SHA3_512")
|
|
|
-set(_ep_hash_regex "^(${_ep_hash_algos})=([0-9A-Fa-f]+)$")
|
|
|
+macro(_ep_get_hash_algos out_var)
|
|
|
+ set(${out_var}
|
|
|
+ MD5
|
|
|
+ SHA1
|
|
|
+ SHA224
|
|
|
+ SHA256
|
|
|
+ SHA384
|
|
|
+ SHA512
|
|
|
+ SHA3_224
|
|
|
+ SHA3_256
|
|
|
+ SHA3_384
|
|
|
+ SHA3_512
|
|
|
+ )
|
|
|
+endmacro()
|
|
|
|
|
|
-set(_ExternalProject_SELF "${CMAKE_CURRENT_LIST_FILE}")
|
|
|
-get_filename_component(_ExternalProject_SELF_DIR "${_ExternalProject_SELF}" PATH)
|
|
|
+macro(_ep_get_hash_regex out_var)
|
|
|
+ _ep_get_hash_algos(${out_var})
|
|
|
+ list(JOIN ${out_var} "|" ${out_var})
|
|
|
+ set(${out_var} "^(${${out_var}})=([0-9A-Fa-f]+)$")
|
|
|
+endmacro()
|
|
|
|
|
|
-function(_ep_parse_arguments f name ns args)
|
|
|
+function(_ep_parse_arguments f keywords name ns args)
|
|
|
# Transfer the arguments to this function into target properties for the
|
|
|
# new custom target we just added so that we can set up all the build steps
|
|
|
# correctly based on target properties.
|
|
|
#
|
|
|
- # We loop through ARGN and consider the namespace starting with an
|
|
|
+ # Because some keywords can be repeated, we can't use cmake_parse_arguments().
|
|
|
+ # Instead, we loop through ARGN and consider the namespace starting with an
|
|
|
# upper-case letter followed by at least two more upper-case letters,
|
|
|
# numbers or underscores to be keywords.
|
|
|
|
|
|
- if(NOT DEFINED _ExternalProject_SELF)
|
|
|
- message(FATAL_ERROR "error: ExternalProject module must be explicitly included before using ${f} function")
|
|
|
- endif()
|
|
|
-
|
|
|
set(key)
|
|
|
|
|
|
foreach(arg IN LISTS args)
|
|
|
@@ -1173,7 +1152,7 @@ function(_ep_parse_arguments f name ns args)
|
|
|
if(arg MATCHES "^[A-Z][A-Z0-9_][A-Z0-9_]+$" AND
|
|
|
NOT (("x${arg}x" STREQUAL "x${key}x") AND ("x${key}x" STREQUAL "xCOMMANDx")) AND
|
|
|
NOT arg MATCHES "^(TRUE|FALSE)$")
|
|
|
- if(_ep_keywords_${f} AND arg MATCHES "${_ep_keywords_${f}}")
|
|
|
+ if(arg IN_LIST keywords)
|
|
|
set(is_value 0)
|
|
|
endif()
|
|
|
endif()
|
|
|
@@ -1198,9 +1177,6 @@ function(_ep_parse_arguments f name ns args)
|
|
|
endif()
|
|
|
else()
|
|
|
set(key "${arg}")
|
|
|
- if(key MATCHES GIT)
|
|
|
- get_property(have_key TARGET ${name} PROPERTY ${ns}${key} SET)
|
|
|
- endif()
|
|
|
endif()
|
|
|
endforeach()
|
|
|
endfunction()
|
|
|
@@ -1432,7 +1408,7 @@ function(_ep_write_gitupdate_script script_filename git_EXECUTABLE git_tag git_r
|
|
|
endif()
|
|
|
|
|
|
configure_file(
|
|
|
- "${_ExternalProject_SELF_DIR}/ExternalProject-gitupdate.cmake.in"
|
|
|
+ "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/ExternalProject-gitupdate.cmake.in"
|
|
|
"${script_filename}"
|
|
|
@ONLY
|
|
|
)
|
|
|
@@ -1461,6 +1437,7 @@ function(_ep_write_downloadfile_script script_filename REMOTE LOCAL timeout inac
|
|
|
set(SHOW_PROGRESS "SHOW_PROGRESS")
|
|
|
endif()
|
|
|
|
|
|
+ _ep_get_hash_regex(_ep_hash_regex)
|
|
|
if("${hash}" MATCHES "${_ep_hash_regex}")
|
|
|
set(ALGO "${CMAKE_MATCH_1}")
|
|
|
string(TOLOWER "${CMAKE_MATCH_2}" EXPECT_VALUE)
|
|
|
@@ -1541,13 +1518,14 @@ function(_ep_write_downloadfile_script script_filename REMOTE LOCAL timeout inac
|
|
|
# * USERPWD_ARGS
|
|
|
# * HTTP_HEADERS_ARGS
|
|
|
configure_file(
|
|
|
- "${_ExternalProject_SELF_DIR}/ExternalProject-download.cmake.in"
|
|
|
+ "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/ExternalProject-download.cmake.in"
|
|
|
"${script_filename}"
|
|
|
@ONLY
|
|
|
)
|
|
|
endfunction()
|
|
|
|
|
|
function(_ep_write_verifyfile_script script_filename LOCAL hash)
|
|
|
+ _ep_get_hash_regex(_ep_hash_regex)
|
|
|
if("${hash}" MATCHES "${_ep_hash_regex}")
|
|
|
set(ALGO "${CMAKE_MATCH_1}")
|
|
|
string(TOLOWER "${CMAKE_MATCH_2}" EXPECT_VALUE)
|
|
|
@@ -1561,7 +1539,7 @@ function(_ep_write_verifyfile_script script_filename LOCAL hash)
|
|
|
# * EXPECT_VALUE
|
|
|
# * LOCAL
|
|
|
configure_file(
|
|
|
- "${_ExternalProject_SELF_DIR}/ExternalProject-verify.cmake.in"
|
|
|
+ "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/ExternalProject-verify.cmake.in"
|
|
|
"${script_filename}"
|
|
|
@ONLY
|
|
|
)
|
|
|
@@ -2250,7 +2228,21 @@ function(ExternalProject_Add_Step name step)
|
|
|
_ep_get_complete_stampfile(${name} complete_stamp_file)
|
|
|
_ep_get_step_stampfile(${name} ${step} stamp_file)
|
|
|
|
|
|
- _ep_parse_arguments(ExternalProject_Add_Step
|
|
|
+ set(keywords
|
|
|
+ COMMAND
|
|
|
+ COMMENT
|
|
|
+ DEPENDEES
|
|
|
+ DEPENDERS
|
|
|
+ DEPENDS
|
|
|
+ INDEPENDENT
|
|
|
+ BYPRODUCTS
|
|
|
+ ALWAYS
|
|
|
+ EXCLUDE_FROM_MAIN
|
|
|
+ WORKING_DIRECTORY
|
|
|
+ LOG
|
|
|
+ USES_TERMINAL
|
|
|
+ )
|
|
|
+ _ep_parse_arguments(ExternalProject_Add_Step "${keywords}"
|
|
|
${name} _EP_${step}_ "${ARGN}")
|
|
|
|
|
|
get_property(independent TARGET ${name} PROPERTY _EP_${step}_INDEPENDENT)
|
|
|
@@ -2747,7 +2739,10 @@ function(_ep_add_download_command name)
|
|
|
elseif(url)
|
|
|
get_filename_component(work_dir "${source_dir}" PATH)
|
|
|
get_property(hash TARGET ${name} PROPERTY _EP_URL_HASH)
|
|
|
+ _ep_get_hash_regex(_ep_hash_regex)
|
|
|
if(hash AND NOT "${hash}" MATCHES "${_ep_hash_regex}")
|
|
|
+ _ep_get_hash_algos(_ep_hash_algos)
|
|
|
+ list(JOIN _ep_hash_algos "|" _ep_hash_algos)
|
|
|
message(FATAL_ERROR "URL_HASH is set to\n ${hash}\n"
|
|
|
"but must be ALGO=value where ALGO is\n ${_ep_hash_algos}\n"
|
|
|
"and value is a hex string.")
|
|
|
@@ -3505,7 +3500,136 @@ function(ExternalProject_Add name)
|
|
|
|
|
|
set_property(TARGET ${name} PROPERTY _EP_CMP0114 "${cmp0114}")
|
|
|
|
|
|
- _ep_parse_arguments(ExternalProject_Add ${name} _EP_ "${ARGN}")
|
|
|
+ set(keywords
|
|
|
+ #
|
|
|
+ # Directory options
|
|
|
+ #
|
|
|
+ PREFIX
|
|
|
+ TMP_DIR
|
|
|
+ STAMP_DIR
|
|
|
+ LOG_DIR
|
|
|
+ DOWNLOAD_DIR
|
|
|
+ SOURCE_DIR
|
|
|
+ BINARY_DIR
|
|
|
+ INSTALL_DIR
|
|
|
+ #
|
|
|
+ # Download step options
|
|
|
+ #
|
|
|
+ DOWNLOAD_COMMAND
|
|
|
+ #
|
|
|
+ URL
|
|
|
+ URL_HASH
|
|
|
+ URL_MD5
|
|
|
+ DOWNLOAD_NAME
|
|
|
+ DOWNLOAD_NO_EXTRACT
|
|
|
+ DOWNLOAD_NO_PROGRESS
|
|
|
+ TIMEOUT
|
|
|
+ INACTIVITY_TIMEOUT
|
|
|
+ HTTP_USERNAME
|
|
|
+ HTTP_PASSWORD
|
|
|
+ HTTP_HEADER
|
|
|
+ TLS_VERIFY # Also used for git clone operations
|
|
|
+ TLS_CAINFO
|
|
|
+ NETRC
|
|
|
+ NETRC_FILE
|
|
|
+ #
|
|
|
+ GIT_REPOSITORY
|
|
|
+ GIT_TAG
|
|
|
+ GIT_REMOTE_NAME
|
|
|
+ GIT_SUBMODULES
|
|
|
+ GIT_SUBMODULES_RECURSE
|
|
|
+ GIT_SHALLOW
|
|
|
+ GIT_PROGRESS
|
|
|
+ GIT_CONFIG
|
|
|
+ GIT_REMOTE_UPDATE_STRATEGY
|
|
|
+ #
|
|
|
+ SVN_REPOSITORY
|
|
|
+ SVN_REVISION
|
|
|
+ SVN_USERNAME
|
|
|
+ SVN_PASSWORD
|
|
|
+ SVN_TRUST_CERT
|
|
|
+ #
|
|
|
+ HG_REPOSITORY
|
|
|
+ HG_TAG
|
|
|
+ #
|
|
|
+ CVS_REPOSITORY
|
|
|
+ CVS_MODULE
|
|
|
+ CVS_TAG
|
|
|
+ #
|
|
|
+ # Update step options
|
|
|
+ #
|
|
|
+ UPDATE_COMMAND
|
|
|
+ UPDATE_DISCONNECTED
|
|
|
+ #
|
|
|
+ # Patch step options
|
|
|
+ #
|
|
|
+ PATCH_COMMAND
|
|
|
+ #
|
|
|
+ # Configure step options
|
|
|
+ #
|
|
|
+ CONFIGURE_COMMAND
|
|
|
+ CMAKE_COMMAND
|
|
|
+ CMAKE_GENERATOR
|
|
|
+ CMAKE_GENERATOR_PLATFORM
|
|
|
+ CMAKE_GENERATOR_TOOLSET
|
|
|
+ CMAKE_GENERATOR_INSTANCE
|
|
|
+ CMAKE_ARGS
|
|
|
+ CMAKE_CACHE_ARGS
|
|
|
+ CMAKE_CACHE_DEFAULT_ARGS
|
|
|
+ SOURCE_SUBDIR
|
|
|
+ CONFIGURE_HANDLED_BY_BUILD
|
|
|
+ #
|
|
|
+ # Build step options
|
|
|
+ #
|
|
|
+ BUILD_COMMAND
|
|
|
+ BUILD_IN_SOURCE
|
|
|
+ BUILD_ALWAYS
|
|
|
+ BUILD_BYPRODUCTS
|
|
|
+ #
|
|
|
+ # Install step options
|
|
|
+ #
|
|
|
+ INSTALL_COMMAND
|
|
|
+ #
|
|
|
+ # Test step options
|
|
|
+ #
|
|
|
+ TEST_COMMAND
|
|
|
+ TEST_BEFORE_INSTALL
|
|
|
+ TEST_AFTER_INSTALL
|
|
|
+ TEST_EXCLUDE_FROM_MAIN
|
|
|
+ #
|
|
|
+ # Logging options
|
|
|
+ #
|
|
|
+ LOG_DOWNLOAD
|
|
|
+ LOG_UPDATE
|
|
|
+ LOG_PATCH
|
|
|
+ LOG_CONFIGURE
|
|
|
+ LOG_BUILD
|
|
|
+ LOG_INSTALL
|
|
|
+ LOG_TEST
|
|
|
+ LOG_MERGED_STDOUTERR
|
|
|
+ LOG_OUTPUT_ON_FAILURE
|
|
|
+ #
|
|
|
+ # Terminal access options
|
|
|
+ #
|
|
|
+ USES_TERMINAL_DOWNLOAD
|
|
|
+ USES_TERMINAL_UPDATE
|
|
|
+ USES_TERMINAL_CONFIGURE
|
|
|
+ USES_TERMINAL_BUILD
|
|
|
+ USES_TERMINAL_INSTALL
|
|
|
+ USES_TERMINAL_TEST
|
|
|
+ #
|
|
|
+ # Target options
|
|
|
+ #
|
|
|
+ DEPENDS
|
|
|
+ EXCLUDE_FROM_ALL
|
|
|
+ STEP_TARGETS
|
|
|
+ INDEPENDENT_STEP_TARGETS
|
|
|
+ #
|
|
|
+ # Miscellaneous options
|
|
|
+ #
|
|
|
+ LIST_SEPARATOR
|
|
|
+ )
|
|
|
+ _ep_parse_arguments(ExternalProject_Add "${keywords}" ${name} _EP_ "${ARGN}")
|
|
|
_ep_set_directories(${name})
|
|
|
_ep_get_step_stampfile(${name} "done" done_stamp_file)
|
|
|
_ep_get_step_stampfile(${name} "install" install_stamp_file)
|