summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitlab/os-windows.yml8
-rw-r--r--Help/cpack_gen/wix.rst8
-rw-r--r--Help/dev/review.rst1
-rw-r--r--Help/manual/cmake-buildsystem.7.rst20
-rw-r--r--Help/release/dev/cpack-wix-custom-xmlns.rst5
-rw-r--r--Modules/CMakeDependentOption.cmake33
-rw-r--r--Modules/CMakeDetermineCXXCompiler.cmake2
-rw-r--r--Modules/CMakeFindBinUtils.cmake13
-rw-r--r--Modules/ExternalProject-download.cmake.in75
-rw-r--r--Modules/ExternalProject.cmake48
-rw-r--r--Modules/FindMPI.cmake2
-rw-r--r--Modules/FindPython/Support.cmake7
-rw-r--r--Modules/Internal/CPack/WIX.template.in2
-rw-r--r--Modules/Platform/Windows-Clang.cmake2
-rw-r--r--Source/CMakeVersion.cmake2
-rw-r--r--Source/CPack/WiX/cmCPackWIXGenerator.cxx43
-rw-r--r--Source/CPack/WiX/cmCPackWIXGenerator.h7
-rw-r--r--Source/CPack/WiX/cmWIXSourceWriter.h4
-rw-r--r--Source/CursesDialog/form/CMakeLists.txt8
-rw-r--r--Source/cmGeneratorExpressionEvaluationFile.cxx48
-rw-r--r--Source/cmGeneratorExpressionEvaluationFile.h4
-rw-r--r--Tests/RunCMake/CMakeLists.txt9
-rw-r--r--Tests/RunCMake/ExternalProject/DownloadInactivityResume.cmake5
-rw-r--r--Tests/RunCMake/ExternalProject/DownloadInactivityTimeout-build-result.txt1
-rw-r--r--Tests/RunCMake/ExternalProject/DownloadInactivityTimeout-build-stdout.txt1
-rw-r--r--Tests/RunCMake/ExternalProject/DownloadInactivityTimeout.cmake5
-rw-r--r--Tests/RunCMake/ExternalProject/DownloadServer.py42
-rw-r--r--Tests/RunCMake/ExternalProject/DownloadTimeout-build-result.txt1
-rw-r--r--Tests/RunCMake/ExternalProject/DownloadTimeout-build-stderr.txt1
-rw-r--r--Tests/RunCMake/ExternalProject/DownloadTimeout.cmake5
-rw-r--r--Tests/RunCMake/ExternalProject/RunCMakeTest.cmake53
-rw-r--r--Tests/RunCMake/File_Generate/CMP0070-WARN-stderr.txt16
-rw-r--r--Tests/RunCMake/File_Generate/RunCMakeTest.cmake4
-rw-r--r--Tests/RunCMake/File_Generate/SourceProperty-CMP0070-NEW-result.txt1
-rw-r--r--Tests/RunCMake/File_Generate/SourceProperty-CMP0070-NEW-stderr.txt11
-rw-r--r--Tests/RunCMake/File_Generate/SourceProperty-CMP0070-NEW.cmake8
-rw-r--r--Tests/RunCMake/File_Generate/SourceProperty-CMP0070-OLD-result.txt1
-rw-r--r--Tests/RunCMake/File_Generate/SourceProperty-CMP0070-OLD-stderr.txt23
-rw-r--r--Tests/RunCMake/File_Generate/SourceProperty-CMP0070-OLD.cmake8
-rw-r--r--Tests/RunCMake/File_Generate/SourceProperty-stderr.txt10
-rw-r--r--Tests/RunCMake/File_Generate/SourceProperty.cmake14
41 files changed, 454 insertions, 107 deletions
diff --git a/.gitlab/os-windows.yml b/.gitlab/os-windows.yml
index 910a232..63b8758 100644
--- a/.gitlab/os-windows.yml
+++ b/.gitlab/os-windows.yml
@@ -36,7 +36,7 @@
CMAKE_CONFIGURATION: windows_vs2019_x64_ninja
VCVARSALL: "${VS160COMNTOOLS}\\..\\..\\VC\\Auxiliary\\Build\\vcvarsall.bat"
VCVARSPLATFORM: "x64"
- VCVARSVERSION: "14.26"
+ VCVARSVERSION: "14.27"
### External testing
@@ -47,7 +47,7 @@
CMAKE_CONFIGURATION: windows_vs2019_x64
CMAKE_GENERATOR: "Visual Studio 16 2019"
CMAKE_GENERATOR_PLATFORM: "x64"
- CMAKE_GENERATOR_TOOLSET: "v142,version=14.26"
+ CMAKE_GENERATOR_TOOLSET: "v142,version=14.27"
## Tags
@@ -57,7 +57,7 @@
- windows
- shell
- vs2019
- - msvc-19.25
+ - msvc-19.27
- nonconcurrent
.windows_builder_ext_tags:
@@ -66,7 +66,7 @@
- windows
- shell
- vs2019
- - msvc-19.25
+ - msvc-19.27
- concurrent
## Windows-specific scripts
diff --git a/Help/cpack_gen/wix.rst b/Help/cpack_gen/wix.rst
index 7fb5a12..5b880ba 100644
--- a/Help/cpack_gen/wix.rst
+++ b/Help/cpack_gen/wix.rst
@@ -286,3 +286,11 @@ Windows using WiX.
When unspecified CPack will try to locate a WiX Toolset
installation via the ``WIX`` environment variable instead.
+
+.. variable:: CPACK_WIX_CUSTOM_XMLNS
+
+ This variable provides a list of custom namespace declarations that are necessary
+ for using WiX extensions. Each declaration should be in the form name=url, where
+ name is the plain namespace without the usual xmlns: prefix and url is an unquoted
+ namespace url. A list of commonly known WiX schemata can be found here:
+ https://wixtoolset.org/documentation/manual/v3/xsd/
diff --git a/Help/dev/review.rst b/Help/dev/review.rst
index f2a91c0..8326e70 100644
--- a/Help/dev/review.rst
+++ b/Help/dev/review.rst
@@ -264,6 +264,7 @@ fixed, it is preferable to link to the issue instead.
If relevant, add the first release tag of CMake containing the commit after
the ``<date>``, i.e., ``commit <shorthash> (<subject>, <date>, <tag>)``.
+Or, use the output of ``git describe --contains <commit>`` as the ``<tag>``.
Alternatively, the full commit ``<hash>`` may be used.
diff --git a/Help/manual/cmake-buildsystem.7.rst b/Help/manual/cmake-buildsystem.7.rst
index cd27316..7008383 100644
--- a/Help/manual/cmake-buildsystem.7.rst
+++ b/Help/manual/cmake-buildsystem.7.rst
@@ -96,6 +96,9 @@ Apple Frameworks
A ``SHARED`` library may be marked with the :prop_tgt:`FRAMEWORK`
target property to create an macOS or iOS Framework Bundle.
+A library with the ``FRAMEWORK`` target property should also set the
+:prop_tgt:`FRAMEWORK_VERSION` target property. This property is typically
+set to the value of "A" by macOS conventions.
The ``MACOSX_FRAMEWORK_IDENTIFIER`` sets ``CFBundleIdentifier`` key
and it uniquely identifies the bundle.
@@ -104,7 +107,7 @@ and it uniquely identifies the bundle.
add_library(MyFramework SHARED MyFramework.cpp)
set_target_properties(MyFramework PROPERTIES
FRAMEWORK TRUE
- FRAMEWORK_VERSION A
+ FRAMEWORK_VERSION A # Version "A" is macOS convention
MACOSX_FRAMEWORK_IDENTIFIER org.cmake.MyFramework
)
@@ -115,7 +118,10 @@ Object Libraries
The ``OBJECT`` library type defines a non-archival collection of object files
resulting from compiling the given source files. The object files collection
-may be used as source inputs to other targets:
+may be used as source inputs to other targets by using the syntax
+``$<TARGET_OBJECTS:name>``. This is a
+:manual:`generator expression <cmake-generator-expressions(7)>` that can be
+used to supply the ``OBJECT`` library content to other targets:
.. code-block:: cmake
@@ -373,8 +379,12 @@ position-independent-code, so a diagnostic is issued.
The ``lib1`` and ``lib2`` requirements are not "compatible". One of them
requires that consumers are built as position-independent-code, while
the other requires that consumers are not built as position-independent-code.
-Because ``exe2`` links to both and they are in conflict, a diagnostic is
-issued.
+Because ``exe2`` links to both and they are in conflict, a CMake error message
+is issued::
+
+ CMake Error: The INTERFACE_POSITION_INDEPENDENT_CODE property of "lib2" does
+ not agree with the value of POSITION_INDEPENDENT_CODE already determined
+ for "exe2".
To be "compatible", the :prop_tgt:`POSITION_INDEPENDENT_CODE` property,
if set must be either the same, in a boolean sense, as the
@@ -732,7 +742,7 @@ As the value of the :prop_tgt:`POSITION_INDEPENDENT_CODE` property of
the ``exe1`` target is dependent on the linked libraries (``lib3``), and the
edge of linking ``exe1`` is determined by the same
:prop_tgt:`POSITION_INDEPENDENT_CODE` property, the dependency graph above
-contains a cycle. :manual:`cmake(1)` issues a diagnostic in this case.
+contains a cycle. :manual:`cmake(1)` issues an error message.
.. _`Output Artifacts`:
diff --git a/Help/release/dev/cpack-wix-custom-xmlns.rst b/Help/release/dev/cpack-wix-custom-xmlns.rst
new file mode 100644
index 0000000..84934cb
--- /dev/null
+++ b/Help/release/dev/cpack-wix-custom-xmlns.rst
@@ -0,0 +1,5 @@
+cpack-wix-custom-xmlns
+----------------------
+
+* The :cpack_gen:`CPack WIX Generator` gained a
+ :variable:`CPACK_WIX_CUSTOM_XMLNS` option to specify custom XML namespaces.
diff --git a/Modules/CMakeDependentOption.cmake b/Modules/CMakeDependentOption.cmake
index 99d5070..96855d2 100644
--- a/Modules/CMakeDependentOption.cmake
+++ b/Modules/CMakeDependentOption.cmake
@@ -8,21 +8,34 @@ CMakeDependentOption
Macro to provide an option dependent on other options.
This macro presents an option to the user only if a set of other
-conditions are true. When the option is not presented a default value
-is used, but any value set by the user is preserved for when the
-option is presented again. Example invocation:
+conditions are true.
+
+Usage:
+
+.. code-block:: cmake
+
+ cmake_dependent_option(<option> "<help_text>" <value> <depends> <force>)
+
+Where ``<option>`` is available to the user if ``<depends>`` is true. When
+``<option>`` is available, the given ``<help_text>`` and initial ``<value>``
+are used. If the ``<depends>`` condition is not true, ``<option>`` will not be
+presented and will always have the value given by ``<force>``. Any value set by
+the user is preserved for when the option is presented again. Each element in
+the fourth parameter is evaluated as an if-condition, so
+:ref:`Condition Syntax` can be used.
+
+Example invocation:
.. code-block:: cmake
- CMAKE_DEPENDENT_OPTION(USE_FOO "Use Foo" ON
+ cmake_dependent_option(USE_FOO "Use Foo" ON
"USE_BAR;NOT USE_ZOT" OFF)
-If USE_BAR is true and USE_ZOT is false, this provides an option
-called USE_FOO that defaults to ON. Otherwise, it sets USE_FOO to
-OFF. If the status of USE_BAR or USE_ZOT ever changes, any value for
-the USE_FOO option is saved so that when the option is re-enabled it
-retains its old value. Each element in the fourth parameter is
-evaluated as an if-condition, so :ref:`Condition Syntax` can be used.
+If ``USE_BAR`` is true and ``USE_ZOT`` is false, this provides an option called
+``USE_FOO`` that defaults to ON. Otherwise, it sets ``USE_FOO`` to OFF and
+hides the option from the user. If the status of ``USE_BAR`` or ``USE_ZOT``
+ever changes, any value for the ``USE_FOO`` option is saved so that when the
+option is re-enabled it retains its old value.
#]=======================================================================]
macro(CMAKE_DEPENDENT_OPTION option doc default depends force)
diff --git a/Modules/CMakeDetermineCXXCompiler.cmake b/Modules/CMakeDetermineCXXCompiler.cmake
index 4c2924a..2205c8f 100644
--- a/Modules/CMakeDetermineCXXCompiler.cmake
+++ b/Modules/CMakeDetermineCXXCompiler.cmake
@@ -84,7 +84,7 @@ else()
endif()
if(CMAKE_CXX_COMPILER_TARGET)
- list(PREPEND CMAKE_CXX_COPMILER_ID_TEST_FLAGS "-c --target=${CMAKE_CXX_COMPILER_TARGET}")
+ list(PREPEND CMAKE_CXX_COMPILER_ID_TEST_FLAGS "-c --target=${CMAKE_CXX_COMPILER_TARGET}")
endif()
# Build a small source file to identify the compiler.
diff --git a/Modules/CMakeFindBinUtils.cmake b/Modules/CMakeFindBinUtils.cmake
index de9ef9a..b2004f1 100644
--- a/Modules/CMakeFindBinUtils.cmake
+++ b/Modules/CMakeFindBinUtils.cmake
@@ -102,6 +102,19 @@ else()
set(_CMAKE_ADDITIONAL_ADDR2LINE_NAMES "llvm-addr2line")
endif()
+ if(NOT CMAKE_CROSSCOMPILING AND NOT "${_CMAKE_TOOLCHAIN_PREFIX}" STREQUAL "")
+ list(APPEND _CMAKE_ADDITIONAL_AR_NAMES "ar")
+ list(APPEND _CMAKE_ADDITIONAL_RANLIB_NAMES "ranlib")
+ list(APPEND _CMAKE_ADDITIONAL_STRIP_NAMES "strip")
+ list(APPEND _CMAKE_ADDITIONAL_LINKER_NAMES "ld")
+ list(APPEND _CMAKE_ADDITIONAL_NM_NAMES "nm")
+ list(APPEND _CMAKE_ADDITIONAL_OBJDUMP_NAMES "objdump")
+ list(APPEND _CMAKE_ADDITIONAL_OBJCOPY_NAMES "objcopy")
+ list(APPEND _CMAKE_ADDITIONAL_READELF_NAMES "readelf")
+ list(APPEND _CMAKE_ADDITIONAL_DLLTOOL_NAMES "dlltool")
+ list(APPEND _CMAKE_ADDITIONAL_ADDR2LINE_NAMES "addr2line")
+ endif()
+
find_program(CMAKE_AR NAMES ${_CMAKE_TOOLCHAIN_PREFIX}ar${_CMAKE_TOOLCHAIN_SUFFIX} ${_CMAKE_ADDITIONAL_AR_NAMES} HINTS ${_CMAKE_TOOLCHAIN_LOCATION})
find_program(CMAKE_RANLIB NAMES ${_CMAKE_TOOLCHAIN_PREFIX}ranlib ${_CMAKE_ADDITIONAL_RANLIB_NAMES} HINTS ${_CMAKE_TOOLCHAIN_LOCATION})
diff --git a/Modules/ExternalProject-download.cmake.in b/Modules/ExternalProject-download.cmake.in
index 99fb917..ff8c659 100644
--- a/Modules/ExternalProject-download.cmake.in
+++ b/Modules/ExternalProject-download.cmake.in
@@ -105,54 +105,65 @@ set(retry_number 5)
message(STATUS "Downloading...
dst='@LOCAL@'
- timeout='@TIMEOUT_MSG@'"
+ timeout='@TIMEOUT_MSG@'
+ inactivity timeout='@INACTIVITY_TIMEOUT_MSG@'"
)
-
+set(download_retry_codes 7 6 8 15)
+set(skip_url_list)
+set(status_code)
foreach(i RANGE ${retry_number})
- sleep_before_download(${i})
-
+ if(status_code IN_LIST download_retry_codes)
+ sleep_before_download(${i})
+ endif()
foreach(url @REMOTE@)
- message(STATUS "Using src='${url}'")
+ if(NOT url IN_LIST skip_url_list)
+ message(STATUS "Using src='${url}'")
- @TLS_VERIFY_CODE@
- @TLS_CAINFO_CODE@
- @NETRC_CODE@
- @NETRC_FILE_CODE@
+ @TLS_VERIFY_CODE@
+ @TLS_CAINFO_CODE@
+ @NETRC_CODE@
+ @NETRC_FILE_CODE@
- file(
+ file(
DOWNLOAD
"${url}" "@LOCAL@"
@SHOW_PROGRESS@
@TIMEOUT_ARGS@
+ @INACTIVITY_TIMEOUT_ARGS@
STATUS status
LOG log
@USERPWD_ARGS@
@HTTP_HEADERS_ARGS@
- )
-
- list(GET status 0 status_code)
- list(GET status 1 status_string)
-
- if(status_code EQUAL 0)
- check_file_hash(has_hash hash_is_good)
- if(has_hash AND NOT hash_is_good)
- message(STATUS "Hash mismatch, removing...")
- file(REMOVE "@LOCAL@")
+ )
+
+ list(GET status 0 status_code)
+ list(GET status 1 status_string)
+
+ if(status_code EQUAL 0)
+ check_file_hash(has_hash hash_is_good)
+ if(has_hash AND NOT hash_is_good)
+ message(STATUS "Hash mismatch, removing...")
+ file(REMOVE "@LOCAL@")
+ else()
+ message(STATUS "Downloading... done")
+ return()
+ endif()
else()
- message(STATUS "Downloading... done")
- return()
+ string(APPEND logFailedURLs "error: downloading '${url}' failed
+ status_code: ${status_code}
+ status_string: ${status_string}
+ log:
+ --- LOG BEGIN ---
+ ${log}
+ --- LOG END ---
+ "
+ )
+ if(NOT status_code IN_LIST download_retry_codes)
+ list(APPEND skip_url_list "${url}")
+ break()
endif()
- else()
- string(APPEND logFailedURLs "error: downloading '${url}' failed
- status_code: ${status_code}
- status_string: ${status_string}
- log:
- --- LOG BEGIN ---
- ${log}
- --- LOG END ---
- "
- )
endif()
+ endif()
endforeach()
endforeach()
diff --git a/Modules/ExternalProject.cmake b/Modules/ExternalProject.cmake
index aecc00b..96edbef 100644
--- a/Modules/ExternalProject.cmake
+++ b/Modules/ExternalProject.cmake
@@ -179,6 +179,9 @@ External Project Definition
``TIMEOUT <seconds>``
Maximum time allowed for file download operations.
+ ``INACTIVITY_TIMEOUT <seconds>``
+ Terminate the operation after a period of inactivity.
+
``HTTP_USERNAME <username>``
Username for the download operation if authentication is required.
@@ -747,7 +750,7 @@ control needed to implement such step-level capabilities.
``<name>`` is the same as the name passed to the original call to
:command:`ExternalProject_Add`. The specified ``<step>`` must not be one of
- the pre-defined steps (``mkdir``, ``download``, ``update``, ``skip-update``,
+ the pre-defined steps (``mkdir``, ``download``, ``update``,
``patch``, ``configure``, ``build``, ``install`` or ``test``). The supported
options are:
@@ -1300,7 +1303,7 @@ function(_ep_write_gitupdate_script script_filename git_EXECUTABLE git_tag git_r
)
endfunction()
-function(_ep_write_downloadfile_script script_filename REMOTE LOCAL timeout no_progress hash tls_verify tls_cainfo userpwd http_headers netrc netrc_file)
+function(_ep_write_downloadfile_script script_filename REMOTE LOCAL timeout inactivity_timeout no_progress hash tls_verify tls_cainfo userpwd http_headers netrc netrc_file)
if(timeout)
set(TIMEOUT_ARGS TIMEOUT ${timeout})
set(TIMEOUT_MSG "${timeout} seconds")
@@ -1308,6 +1311,14 @@ function(_ep_write_downloadfile_script script_filename REMOTE LOCAL timeout no_p
set(TIMEOUT_ARGS "# no TIMEOUT")
set(TIMEOUT_MSG "none")
endif()
+ if(inactivity_timeout)
+ set(INACTIVITY_TIMEOUT_ARGS INACTIVITY_TIMEOUT ${inactivity_timeout})
+ set(INACTIVITY_TIMEOUT_MSG "${inactivity_timeout} seconds")
+ else()
+ set(INACTIVITY_TIMEOUT_ARGS "# no INACTIVITY_TIMEOUT")
+ set(INACTIVITY_TIMEOUT_MSG "none")
+ endif()
+
if(no_progress)
set(SHOW_PROGRESS "")
@@ -2512,6 +2523,7 @@ function(_ep_add_download_command name)
string(REPLACE ";" "-" fname "${fname}")
set(file ${download_dir}/${fname})
get_property(timeout TARGET ${name} PROPERTY _EP_TIMEOUT)
+ get_property(inactivity_timeout TARGET ${name} PROPERTY _EP_INACTIVITY_TIMEOUT)
get_property(no_progress TARGET ${name} PROPERTY _EP_DOWNLOAD_NO_PROGRESS)
get_property(tls_verify TARGET ${name} PROPERTY _EP_TLS_VERIFY)
get_property(tls_cainfo TARGET ${name} PROPERTY _EP_TLS_CAINFO)
@@ -2521,7 +2533,7 @@ function(_ep_add_download_command name)
get_property(http_password TARGET ${name} PROPERTY _EP_HTTP_PASSWORD)
get_property(http_headers TARGET ${name} PROPERTY _EP_HTTP_HEADER)
set(download_script "${stamp_dir}/download-${name}.cmake")
- _ep_write_downloadfile_script("${download_script}" "${url}" "${file}" "${timeout}" "${no_progress}" "${hash}" "${tls_verify}" "${tls_cainfo}" "${http_username}:${http_password}" "${http_headers}" "${netrc}" "${netrc_file}")
+ _ep_write_downloadfile_script("${download_script}" "${url}" "${file}" "${timeout}" "${inactivity_timeout}" "${no_progress}" "${hash}" "${tls_verify}" "${tls_cainfo}" "${http_username}:${http_password}" "${http_headers}" "${netrc}" "${netrc_file}")
set(cmd ${CMAKE_COMMAND} -P "${download_script}"
COMMAND)
if (no_extract)
@@ -2762,21 +2774,6 @@ Update to Mercurial >= 2.1.1.
)"
)
- if(update_disconnected)
- _ep_get_step_stampfile(${name} skip-update skip-update_stamp_file)
- string(REPLACE "Performing" "Skipping" comment "${comment}")
- ExternalProject_Add_Step(${name} skip-update
- COMMENT ${comment}
- ALWAYS ${always}
- EXCLUDE_FROM_MAIN 1
- WORKING_DIRECTORY ${work_dir}
- DEPENDEES download
- ${log}
- ${uses_terminal}
- )
- set_property(SOURCE ${skip-update_stamp_file} PROPERTY SYMBOLIC 1)
- endif()
-
endfunction()
@@ -2801,9 +2798,9 @@ function(_ep_add_patch_command name)
_ep_get_update_disconnected(update_disconnected ${name})
if(update_disconnected)
- set(update_dep skip-update)
+ set(patch_dep download)
else()
- set(update_dep update)
+ set(patch_dep update)
endif()
set(__cmdQuoted)
@@ -2814,7 +2811,7 @@ function(_ep_add_patch_command name)
ExternalProject_Add_Step(${name} patch
COMMAND ${__cmdQuoted}
WORKING_DIRECTORY \${work_dir}
- DEPENDEES download \${update_dep}
+ DEPENDEES \${patch_dep}
${log}
)"
)
@@ -2970,13 +2967,6 @@ function(_ep_add_configure_command name)
set(uses_terminal "")
endif()
- _ep_get_update_disconnected(update_disconnected ${name})
- if(update_disconnected)
- set(update_dep skip-update)
- else()
- set(update_dep update)
- endif()
-
set(__cmdQuoted)
foreach(__item IN LISTS cmd)
string(APPEND __cmdQuoted " [==[${__item}]==]")
@@ -2985,7 +2975,7 @@ function(_ep_add_configure_command name)
ExternalProject_Add_Step(${name} configure
COMMAND ${__cmdQuoted}
WORKING_DIRECTORY \${binary_dir}
- DEPENDEES \${update_dep} patch
+ DEPENDEES patch
DEPENDS \${file_deps}
${log}
${uses_terminal}
diff --git a/Modules/FindMPI.cmake b/Modules/FindMPI.cmake
index b2526c1..b531e47 100644
--- a/Modules/FindMPI.cmake
+++ b/Modules/FindMPI.cmake
@@ -1157,7 +1157,7 @@ macro(_MPI_create_imported_target LANG)
string(REPLACE "-pthread" "$<$<COMPILE_LANG_AND_ID:CUDA,NVIDIA>:SHELL:-Xcompiler >-pthread"
_MPI_${LANG}_COMPILE_OPTIONS "${MPI_${LANG}_COMPILE_OPTIONS}")
string(REPLACE "-fexceptions" "$<$<COMPILE_LANG_AND_ID:CUDA,NVIDIA>:SHELL:-Xcompiler >-fexceptions"
- _MPI_${LANG}_COMPILE_OPTIONS "${MPI_${LANG}_COMPILE_OPTIONS}")
+ _MPI_${LANG}_COMPILE_OPTIONS "${_MPI_${LANG}_COMPILE_OPTIONS}")
set_property(TARGET MPI::MPI_${LANG} PROPERTY INTERFACE_COMPILE_OPTIONS "${_MPI_${LANG}_COMPILE_OPTIONS}")
unset(_MPI_${LANG}_COMPILE_OPTIONS)
diff --git a/Modules/FindPython/Support.cmake b/Modules/FindPython/Support.cmake
index a927a5d..1d68c44 100644
--- a/Modules/FindPython/Support.cmake
+++ b/Modules/FindPython/Support.cmake
@@ -558,18 +558,19 @@ function (_PYTHON_GET_VERSION)
if (_PGV_LIBRARY)
# retrieve version and abi from library name
if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE)
+ get_filename_component (library_name "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}" NAME)
# extract version from library name
- if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "python([23])([0-9]+)")
+ if (library_name MATCHES "python([23])([0-9]+)")
set (${_PGV_PREFIX}VERSION_MAJOR "${CMAKE_MATCH_1}" PARENT_SCOPE)
set (${_PGV_PREFIX}VERSION_MINOR "${CMAKE_MATCH_2}" PARENT_SCOPE)
set (${_PGV_PREFIX}VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}" PARENT_SCOPE)
set (${_PGV_PREFIX}ABI "" PARENT_SCOPE)
- elseif (_${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "python([23])\\.([0-9]+)([dmu]*)")
+ elseif (library_name MATCHES "python([23])\\.([0-9]+)([dmu]*)")
set (${_PGV_PREFIX}VERSION_MAJOR "${CMAKE_MATCH_1}" PARENT_SCOPE)
set (${_PGV_PREFIX}VERSION_MINOR "${CMAKE_MATCH_2}" PARENT_SCOPE)
set (${_PGV_PREFIX}VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}" PARENT_SCOPE)
set (${_PGV_PREFIX}ABI "${CMAKE_MATCH_3}" PARENT_SCOPE)
- elseif (_${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "pypy(3)?")
+ elseif (library_name MATCHES "pypy(3)?-c")
set (version "${CMAKE_MATCH_1}")
if (version EQUAL "3")
set (${_PGV_PREFIX}VERSION_MAJOR "3" PARENT_SCOPE)
diff --git a/Modules/Internal/CPack/WIX.template.in b/Modules/Internal/CPack/WIX.template.in
index c4fc83a..c0bf935 100644
--- a/Modules/Internal/CPack/WIX.template.in
+++ b/Modules/Internal/CPack/WIX.template.in
@@ -2,7 +2,7 @@
<?include "cpack_variables.wxi"?>
-<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" @CPACK_WIX_CUSTOM_XMLNS_EXPANDED@
RequiredVersion="3.6.3303.0">
<Product Id="$(var.CPACK_WIX_PRODUCT_GUID)"
diff --git a/Modules/Platform/Windows-Clang.cmake b/Modules/Platform/Windows-Clang.cmake
index 05dff9d..7a75004 100644
--- a/Modules/Platform/Windows-Clang.cmake
+++ b/Modules/Platform/Windows-Clang.cmake
@@ -142,7 +142,7 @@ if("x${CMAKE_C_SIMULATE_ID}" STREQUAL "xMSVC"
endif()
if(DEFINED CMAKE_RC_PREPROCESSOR)
set(CMAKE_DEPFILE_FLAGS_RC "-clang:-MD -clang:-MF -clang:<DEPFILE>")
- set(CMAKE_RC_COMPILE_OBJECT "${CMAKE_COMMAND} -E cmake_llvm_rc <SOURCE> <OBJECT>.pp <${CMAKE_RC_PREPROCESSOR}> <DEFINES> -DRC_INVOKED <INCLUDES> <FLAGS> -E -- <SOURCE> ++ <CMAKE_RC_COMPILER> <DEFINES> -I <SOURCE_DIR> <INCLUDES> /fo <OBJECT> <OBJECT>.pp")
+ set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_COMMAND> -E cmake_llvm_rc <SOURCE> <OBJECT>.pp <${CMAKE_RC_PREPROCESSOR}> <DEFINES> -DRC_INVOKED <INCLUDES> <FLAGS> -E -- <SOURCE> ++ <CMAKE_RC_COMPILER> <DEFINES> -I <SOURCE_DIR> <INCLUDES> /fo <OBJECT> <OBJECT>.pp")
if(CMAKE_GENERATOR STREQUAL "Ninja")
set(CMAKE_NINJA_CMCLDEPS_RC 0)
set(CMAKE_NINJA_DEP_TYPE_RC gcc)
diff --git a/Source/CMakeVersion.cmake b/Source/CMakeVersion.cmake
index bbb33d2..11555e7 100644
--- a/Source/CMakeVersion.cmake
+++ b/Source/CMakeVersion.cmake
@@ -1,7 +1,7 @@
# CMake version number components.
set(CMake_VERSION_MAJOR 3)
set(CMake_VERSION_MINOR 18)
-set(CMake_VERSION_PATCH 20200819)
+set(CMake_VERSION_PATCH 20200821)
#set(CMake_VERSION_RC 0)
set(CMake_VERSION_IS_DIRTY 0)
diff --git a/Source/CPack/WiX/cmCPackWIXGenerator.cxx b/Source/CPack/WiX/cmCPackWIXGenerator.cxx
index 72af10b..8b3644f 100644
--- a/Source/CPack/WiX/cmCPackWIXGenerator.cxx
+++ b/Source/CPack/WiX/cmCPackWIXGenerator.cxx
@@ -221,6 +221,7 @@ bool cmCPackWIXGenerator::InitializeWiXConfiguration()
this->LightExtensions.insert("WixUIExtension");
CollectExtensions("CPACK_WIX_EXTENSIONS", this->LightExtensions);
CollectExtensions("CPACK_WIX_LIGHT_EXTENSIONS", this->LightExtensions);
+ CollectXmlNamespaces("CPACK_WIX_CUSTOM_XMLNS", this->CustomXmlNamespaces);
const char* patchFilePath = GetOption("CPACK_WIX_PATCH_FILE");
if (patchFilePath) {
@@ -322,6 +323,7 @@ void cmCPackWIXGenerator::CreateWiXVariablesIncludeFile()
cmWIXSourceWriter includeFile(this->Logger, includeFilename,
this->ComponentGuidType,
cmWIXSourceWriter::INCLUDE_ELEMENT_ROOT);
+ InjectXmlNamespaces(includeFile);
CopyDefinition(includeFile, "CPACK_WIX_PRODUCT_GUID");
CopyDefinition(includeFile, "CPACK_WIX_UPGRADE_GUID");
@@ -345,6 +347,7 @@ void cmCPackWIXGenerator::CreateWiXPropertiesIncludeFile()
cmWIXSourceWriter includeFile(this->Logger, includeFilename,
this->ComponentGuidType,
cmWIXSourceWriter::INCLUDE_ELEMENT_ROOT);
+ InjectXmlNamespaces(includeFile);
std::string prefix = "CPACK_WIX_PROPERTY_";
std::vector<std::string> options = GetOptions();
@@ -393,6 +396,7 @@ void cmCPackWIXGenerator::CreateWiXProductFragmentIncludeFile()
cmWIXSourceWriter includeFile(this->Logger, includeFilename,
this->ComponentGuidType,
cmWIXSourceWriter::INCLUDE_ELEMENT_ROOT);
+ InjectXmlNamespaces(includeFile);
this->Patch->ApplyFragment("#PRODUCT", includeFile);
}
@@ -432,6 +436,7 @@ bool cmCPackWIXGenerator::CreateWiXSourceFiles()
cmWIXDirectoriesSourceWriter directoryDefinitions(
this->Logger, directoryDefinitionsFilename, this->ComponentGuidType);
+ InjectXmlNamespaces(directoryDefinitions);
directoryDefinitions.BeginElement("Fragment");
std::string installRoot;
@@ -453,6 +458,7 @@ bool cmCPackWIXGenerator::CreateWiXSourceFiles()
cmWIXFilesSourceWriter fileDefinitions(this->Logger, fileDefinitionsFilename,
this->ComponentGuidType);
+ InjectXmlNamespaces(fileDefinitions);
fileDefinitions.BeginElement("Fragment");
@@ -463,6 +469,7 @@ bool cmCPackWIXGenerator::CreateWiXSourceFiles()
cmWIXFeaturesSourceWriter featureDefinitions(
this->Logger, featureDefinitionsFilename, this->ComponentGuidType);
+ InjectXmlNamespaces(featureDefinitions);
featureDefinitions.BeginElement("Fragment");
@@ -1147,6 +1154,35 @@ void cmCPackWIXGenerator::CollectExtensions(std::string const& variableName,
extensions.insert(list.begin(), list.end());
}
+void cmCPackWIXGenerator::CollectXmlNamespaces(std::string const& variableName,
+ xmlns_map_t& namespaces)
+{
+ const char* variableContent = GetOption(variableName.c_str());
+ if (!variableContent) {
+ return;
+ }
+
+ std::vector<std::string> list = cmExpandedList(variableContent);
+ for (std::string const& str : list) {
+ auto pos = str.find('=');
+ if (pos != std::string::npos) {
+ auto name = str.substr(0, pos);
+ auto value = str.substr(pos + 1);
+ namespaces.emplace(std::make_pair(name, value));
+ } else {
+ cmCPackLogger(cmCPackLog::LOG_ERROR,
+ "Invalid element in CPACK_WIX_CUSTOM_XMLNS ignored: "
+ << "\"" << str << "\"" << std::endl);
+ }
+ }
+ std::ostringstream oss;
+ for (auto& ns : namespaces) {
+ oss << " xmlns:" << ns.first << "=\""
+ << cmWIXSourceWriter::EscapeAttributeValue(ns.second) << '"';
+ }
+ SetOption("CPACK_WIX_CUSTOM_XMLNS_EXPANDED", oss.str().c_str());
+}
+
void cmCPackWIXGenerator::AddCustomFlags(std::string const& variableName,
std::ostream& stream)
{
@@ -1172,3 +1208,10 @@ std::string cmCPackWIXGenerator::RelativePathWithoutComponentPrefix(
return path.substr(pos + 1);
}
+
+void cmCPackWIXGenerator::InjectXmlNamespaces(cmWIXSourceWriter& sourceWriter)
+{
+ for (auto& ns : this->CustomXmlNamespaces) {
+ sourceWriter.AddAttributeUnlessEmpty("xmlns:" + ns.first, ns.second);
+ }
+}
diff --git a/Source/CPack/WiX/cmCPackWIXGenerator.h b/Source/CPack/WiX/cmCPackWIXGenerator.h
index d5a16ec..b9c37e9 100644
--- a/Source/CPack/WiX/cmCPackWIXGenerator.h
+++ b/Source/CPack/WiX/cmCPackWIXGenerator.h
@@ -49,6 +49,7 @@ private:
using id_map_t = std::map<std::string, std::string>;
using ambiguity_map_t = std::map<std::string, size_t>;
using extension_set_t = std::set<std::string>;
+ using xmlns_map_t = std::map<std::string, std::string>;
enum class DefinitionType
{
@@ -147,16 +148,22 @@ private:
void CollectExtensions(std::string const& variableName,
extension_set_t& extensions);
+ void CollectXmlNamespaces(std::string const& variableName,
+ xmlns_map_t& namespaces);
+
void AddCustomFlags(std::string const& variableName, std::ostream& stream);
std::string RelativePathWithoutComponentPrefix(std::string const& path);
+ void InjectXmlNamespaces(cmWIXSourceWriter& sourceWriter);
+
std::vector<std::string> WixSources;
id_map_t PathToIdMap;
ambiguity_map_t IdAmbiguityCounter;
extension_set_t CandleExtensions;
extension_set_t LightExtensions;
+ xmlns_map_t CustomXmlNamespaces;
std::string CPackTopLevel;
diff --git a/Source/CPack/WiX/cmWIXSourceWriter.h b/Source/CPack/WiX/cmWIXSourceWriter.h
index 8cc2070..6030ea3 100644
--- a/Source/CPack/WiX/cmWIXSourceWriter.h
+++ b/Source/CPack/WiX/cmWIXSourceWriter.h
@@ -50,6 +50,8 @@ public:
std::string CreateGuidFromComponentId(std::string const& componentId);
+ static std::string EscapeAttributeValue(std::string const& value);
+
protected:
cmCPackLog* Logger;
@@ -64,8 +66,6 @@ private:
void Indent(size_t count);
- static std::string EscapeAttributeValue(std::string const& value);
-
cmsys::ofstream File;
State State;
diff --git a/Source/CursesDialog/form/CMakeLists.txt b/Source/CursesDialog/form/CMakeLists.txt
index b468f5b..21c499e 100644
--- a/Source/CursesDialog/form/CMakeLists.txt
+++ b/Source/CursesDialog/form/CMakeLists.txt
@@ -3,6 +3,14 @@
project(CMAKE_FORM)
+# Disable warnings to avoid changing 3rd party code.
+if(CMAKE_C_COMPILER_ID MATCHES
+ "^(GNU|Clang|AppleClang|XLClang|XL|VisualAge|SunPro|HP|Intel)$")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w")
+elseif(CMAKE_C_COMPILER_ID STREQUAL "PathScale")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -woffall")
+endif()
+
configure_file(cmFormConfigure.h.in "${CMAKE_CURRENT_BINARY_DIR}/cmFormConfigure.h")
add_library(cmForm
diff --git a/Source/cmGeneratorExpressionEvaluationFile.cxx b/Source/cmGeneratorExpressionEvaluationFile.cxx
index 1107adb..6647e62 100644
--- a/Source/cmGeneratorExpressionEvaluationFile.cxx
+++ b/Source/cmGeneratorExpressionEvaluationFile.cxx
@@ -54,17 +54,10 @@ void cmGeneratorExpressionEvaluationFile::Generate(
}
}
- std::string outputFileName = this->OutputFileExpr->Evaluate(
- lg, config, nullptr, nullptr, nullptr, lang);
+ const std::string outputFileName = this->GetOutputFileName(lg, config, lang);
const std::string& outputContent =
inputExpression->Evaluate(lg, config, nullptr, nullptr, nullptr, lang);
- if (cmSystemTools::FileIsFullPath(outputFileName)) {
- outputFileName = cmSystemTools::CollapseFullPath(outputFileName);
- } else {
- outputFileName = this->FixRelativePath(outputFileName, PathForOutput, lg);
- }
-
auto it = outputFiles.find(outputFileName);
if (it != outputFiles.end()) {
@@ -101,8 +94,7 @@ void cmGeneratorExpressionEvaluationFile::CreateOutputFile(
gg->GetEnabledLanguages(enabledLanguages);
for (std::string const& le : enabledLanguages) {
- std::string name = this->OutputFileExpr->Evaluate(lg, config, nullptr,
- nullptr, nullptr, le);
+ std::string const name = this->GetOutputFileName(lg, config, le);
cmSourceFile* sf = lg->GetMakefile()->GetOrCreateSource(
name, false, cmSourceFileLocationKind::Known);
// Tell TraceDependencies that the file is not expected to exist
@@ -125,12 +117,7 @@ void cmGeneratorExpressionEvaluationFile::Generate(cmLocalGenerator* lg)
if (this->InputIsContent) {
inputContent = this->Input;
} else {
- std::string inputFileName = this->Input;
- if (cmSystemTools::FileIsFullPath(inputFileName)) {
- inputFileName = cmSystemTools::CollapseFullPath(inputFileName);
- } else {
- inputFileName = this->FixRelativePath(inputFileName, PathForInput, lg);
- }
+ const std::string inputFileName = this->GetInputFileName(lg);
lg->GetMakefile()->AddCMakeDependFile(inputFileName);
cmSystemTools::GetPermissions(inputFileName.c_str(), perm);
cmsys::ifstream fin(inputFileName.c_str());
@@ -174,6 +161,35 @@ void cmGeneratorExpressionEvaluationFile::Generate(cmLocalGenerator* lg)
}
}
+std::string cmGeneratorExpressionEvaluationFile::GetInputFileName(
+ cmLocalGenerator* lg)
+{
+ std::string inputFileName = this->Input;
+
+ if (cmSystemTools::FileIsFullPath(inputFileName)) {
+ inputFileName = cmSystemTools::CollapseFullPath(inputFileName);
+ } else {
+ inputFileName = this->FixRelativePath(inputFileName, PathForInput, lg);
+ }
+
+ return inputFileName;
+}
+
+std::string cmGeneratorExpressionEvaluationFile::GetOutputFileName(
+ cmLocalGenerator* lg, const std::string& config, const std::string& lang)
+{
+ std::string outputFileName = this->OutputFileExpr->Evaluate(
+ lg, config, nullptr, nullptr, nullptr, lang);
+
+ if (cmSystemTools::FileIsFullPath(outputFileName)) {
+ outputFileName = cmSystemTools::CollapseFullPath(outputFileName);
+ } else {
+ outputFileName = this->FixRelativePath(outputFileName, PathForOutput, lg);
+ }
+
+ return outputFileName;
+}
+
std::string cmGeneratorExpressionEvaluationFile::FixRelativePath(
std::string const& relativePath, PathRole role, cmLocalGenerator* lg)
{
diff --git a/Source/cmGeneratorExpressionEvaluationFile.h b/Source/cmGeneratorExpressionEvaluationFile.h
index c3bc4c8..a258a2d 100644
--- a/Source/cmGeneratorExpressionEvaluationFile.h
+++ b/Source/cmGeneratorExpressionEvaluationFile.h
@@ -38,6 +38,10 @@ private:
cmCompiledGeneratorExpression* inputExpression,
std::map<std::string, std::string>& outputFiles, mode_t perm);
+ std::string GetInputFileName(cmLocalGenerator* lg);
+ std::string GetOutputFileName(cmLocalGenerator* lg,
+ const std::string& config,
+ const std::string& lang);
enum PathRole
{
PathForInput,
diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt
index a1b9d5b..bbb1952 100644
--- a/Tests/RunCMake/CMakeLists.txt
+++ b/Tests/RunCMake/CMakeLists.txt
@@ -366,6 +366,15 @@ function(add_RunCMake_test_try_compile)
unset(CMAKE_CXX_STANDARD_DEFAULT)
endif()
endif()
+ if(CMAKE_VERSION VERSION_LESS 3.18.20200813 AND "x${CMAKE_C_COMPILER_ID}" STREQUAL "xMSVC")
+ # Older CMake versions do not know about MSVC language standards.
+ # Approximate our logic from MSVC-C.cmake.
+ if(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 19.27)
+ set(CMAKE_C_STANDARD_DEFAULT 99)
+ else()
+ set(CMAKE_C_STANDARD_DEFAULT "")
+ endif()
+ endif()
foreach(var
CMAKE_SYSTEM_NAME
CMAKE_C_COMPILER_ID
diff --git a/Tests/RunCMake/ExternalProject/DownloadInactivityResume.cmake b/Tests/RunCMake/ExternalProject/DownloadInactivityResume.cmake
new file mode 100644
index 0000000..d34482d
--- /dev/null
+++ b/Tests/RunCMake/ExternalProject/DownloadInactivityResume.cmake
@@ -0,0 +1,5 @@
+include(ExternalProject)
+ExternalProject_Add(MyProj URL ${SERVER_URL} INACTIVITY_TIMEOUT 2 DOWNLOAD_NO_EXTRACT TRUE
+ CONFIGURE_COMMAND ""
+ BUILD_COMMAND ""
+ INSTALL_COMMAND "")
diff --git a/Tests/RunCMake/ExternalProject/DownloadInactivityTimeout-build-result.txt b/Tests/RunCMake/ExternalProject/DownloadInactivityTimeout-build-result.txt
new file mode 100644
index 0000000..d197c91
--- /dev/null
+++ b/Tests/RunCMake/ExternalProject/DownloadInactivityTimeout-build-result.txt
@@ -0,0 +1 @@
+[^0]
diff --git a/Tests/RunCMake/ExternalProject/DownloadInactivityTimeout-build-stdout.txt b/Tests/RunCMake/ExternalProject/DownloadInactivityTimeout-build-stdout.txt
new file mode 100644
index 0000000..3238147
--- /dev/null
+++ b/Tests/RunCMake/ExternalProject/DownloadInactivityTimeout-build-stdout.txt
@@ -0,0 +1 @@
+(Timeout was reached)?
diff --git a/Tests/RunCMake/ExternalProject/DownloadInactivityTimeout.cmake b/Tests/RunCMake/ExternalProject/DownloadInactivityTimeout.cmake
new file mode 100644
index 0000000..d34482d
--- /dev/null
+++ b/Tests/RunCMake/ExternalProject/DownloadInactivityTimeout.cmake
@@ -0,0 +1,5 @@
+include(ExternalProject)
+ExternalProject_Add(MyProj URL ${SERVER_URL} INACTIVITY_TIMEOUT 2 DOWNLOAD_NO_EXTRACT TRUE
+ CONFIGURE_COMMAND ""
+ BUILD_COMMAND ""
+ INSTALL_COMMAND "")
diff --git a/Tests/RunCMake/ExternalProject/DownloadServer.py b/Tests/RunCMake/ExternalProject/DownloadServer.py
new file mode 100644
index 0000000..ac0769f
--- /dev/null
+++ b/Tests/RunCMake/ExternalProject/DownloadServer.py
@@ -0,0 +1,42 @@
+from http.server import HTTPServer, BaseHTTPRequestHandler
+import argparse
+import time
+import subprocess
+import sys
+import os
+args = None
+outerthread = None
+
+class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
+ def do_GET(self):
+ self.send_response(200)
+ self.end_headers()
+ data = b'D'
+
+ if args.speed_limit:
+ slow_deadline = time.time()+args.limit_duration
+
+ while time.time() < slow_deadline:
+ self.wfile.write(data)
+ if args.speed_limit:
+ time.sleep(1.1)
+
+ data = data * 100
+ self.wfile.write(data)
+ self.close_connection = True
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--speed_limit', help='transfer rate limitation', action='store_true',default=False)
+ parser.add_argument('--limit_duration', help='duration of the transfer rate limitation',default=1, type=float)
+ parser.add_argument('--file', help='file to write the url to connect to')
+ parser.add_argument('--subprocess', action='store_true')
+ args = parser.parse_args()
+ if not args.subprocess:
+ subprocess.Popen([sys.executable]+sys.argv+['--subprocess'],stdin=subprocess.DEVNULL, stderr=subprocess.DEVNULL,stdout=subprocess.DEVNULL)
+ else:
+ httpd = HTTPServer(('localhost', 0), SimpleHTTPRequestHandler)
+ with open(args.file,"w") as f:
+ f.write('http://localhost:{}/test'.format(httpd.socket.getsockname()[1]))
+ httpd.handle_request()
+ os.remove(args.file)
diff --git a/Tests/RunCMake/ExternalProject/DownloadTimeout-build-result.txt b/Tests/RunCMake/ExternalProject/DownloadTimeout-build-result.txt
new file mode 100644
index 0000000..c20fd86
--- /dev/null
+++ b/Tests/RunCMake/ExternalProject/DownloadTimeout-build-result.txt
@@ -0,0 +1 @@
+^[^0]
diff --git a/Tests/RunCMake/ExternalProject/DownloadTimeout-build-stderr.txt b/Tests/RunCMake/ExternalProject/DownloadTimeout-build-stderr.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/ExternalProject/DownloadTimeout-build-stderr.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/ExternalProject/DownloadTimeout.cmake b/Tests/RunCMake/ExternalProject/DownloadTimeout.cmake
new file mode 100644
index 0000000..c90b4ba
--- /dev/null
+++ b/Tests/RunCMake/ExternalProject/DownloadTimeout.cmake
@@ -0,0 +1,5 @@
+include(ExternalProject)
+set(source_dir "${CMAKE_CURRENT_BINARY_DIR}/DownloadTimeout")
+file(REMOVE_RECURSE "${source_dir}")
+file(MAKE_DIRECTORY "${source_dir}")
+ExternalProject_Add(MyProj URL "http://cmake.org/invalid_file.tar.gz")
diff --git a/Tests/RunCMake/ExternalProject/RunCMakeTest.cmake b/Tests/RunCMake/ExternalProject/RunCMakeTest.cmake
index 0d1da26..c2c77e0 100644
--- a/Tests/RunCMake/ExternalProject/RunCMakeTest.cmake
+++ b/Tests/RunCMake/ExternalProject/RunCMakeTest.cmake
@@ -1,5 +1,11 @@
+cmake_minimum_required(VERSION 3.12)
include(RunCMake)
+# We do not contact any remote URLs, but may use a local one.
+# Remove any proxy configuration that may change behavior.
+unset(ENV{http_proxy})
+unset(ENV{https_proxy})
+
run_cmake(IncludeScope-Add)
run_cmake(IncludeScope-Add_Step)
run_cmake(NoOptions)
@@ -27,6 +33,50 @@ function(__ep_test_with_build testName)
run_cmake_command(${testName}-build ${CMAKE_COMMAND} --build .)
endfunction()
+find_package(Python3)
+function(__ep_test_with_build_with_server testName)
+ if(NOT Python3_EXECUTABLE)
+ return()
+ endif()
+ set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${testName}-build)
+ set(RunCMake_TEST_NO_CLEAN 1)
+ set(RunCMake_TEST_TIMEOUT 20)
+ set(RunCMake_TEST_OUTPUT_MERGE TRUE)
+ file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
+ file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
+ set(URL_FILE ${RunCMake_BINARY_DIR}/${testName}.url)
+ if(EXISTS "${URL_FILE}")
+ file(REMOVE "${URL_FILE}")
+ endif()
+ execute_process(
+ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/DownloadServer.py --file "${URL_FILE}" ${ARGN}
+ OUTPUT_FILE ${RunCMake_BINARY_DIR}/${testName}-python.txt
+ ERROR_FILE ${RunCMake_BINARY_DIR}/${testName}-python.txt
+ RESULT_VARIABLE result
+ TIMEOUT 30
+ )
+ if(NOT result EQUAL 0)
+ message(FATAL_ERROR "Failed to start download server:\n ${result}")
+ endif()
+
+ foreach(i RANGE 1 8)
+ if(EXISTS ${URL_FILE})
+ break()
+ endif()
+ execute_process(COMMAND ${CMAKE_COMMAND} -E sleep ${i})
+ endforeach()
+
+ if(NOT EXISTS ${URL_FILE})
+ message(FATAL_ERROR "Failed to load download server URL from:\n ${URL_FILE}")
+ endif()
+
+ file(READ ${URL_FILE} SERVER_URL)
+ message(STATUS "URL : ${URL_FILE} - ${SERVER_URL}")
+ run_cmake_with_options(${testName} ${CMAKE_COMMAND} -DSERVER_URL=${SERVER_URL} )
+ run_cmake_command(${testName}-clean ${CMAKE_COMMAND} --build . --target clean)
+ run_cmake_command(${testName}-build ${CMAKE_COMMAND} --build .)
+endfunction()
+
__ep_test_with_build(MultiCommand)
set(RunCMake_TEST_OUTPUT_MERGE 1)
@@ -38,6 +88,9 @@ set(RunCMake_TEST_OUTPUT_MERGE 0)
if(NOT RunCMake_GENERATOR MATCHES "Visual Studio")
__ep_test_with_build(LogOutputOnFailure)
__ep_test_with_build(LogOutputOnFailureMerged)
+ __ep_test_with_build(DownloadTimeout)
+ __ep_test_with_build_with_server(DownloadInactivityTimeout --speed_limit --limit_duration 40)
+ __ep_test_with_build_with_server(DownloadInactivityResume --speed_limit --limit_duration 1)
endif()
# We can't test the substitution when using the old MSYS due to
diff --git a/Tests/RunCMake/File_Generate/CMP0070-WARN-stderr.txt b/Tests/RunCMake/File_Generate/CMP0070-WARN-stderr.txt
index dbabaa9..a7a231b 100644
--- a/Tests/RunCMake/File_Generate/CMP0070-WARN-stderr.txt
+++ b/Tests/RunCMake/File_Generate/CMP0070-WARN-stderr.txt
@@ -1,4 +1,18 @@
-^CMake Warning \(dev\) in CMakeLists.txt:
+^(CMake Warning \(dev\) in CMakeLists.txt:
+ Policy CMP0070 is not set: Define file\(GENERATE\) behavior for relative
+ paths. Run "cmake --help-policy CMP0070" for policy details. Use the
+ cmake_policy command to set the policy and suppress this warning.
+
+ file\(GENERATE\) given relative OUTPUT path:
+
+ relative-output-WARN.txt
+
+ This is not defined behavior unless CMP0070 is set to NEW. For
+ compatibility with older versions of CMake, the previous undefined behavior
+ will be used.
+This warning is for project developers. Use -Wno-dev to suppress it.
++)+
+CMake Warning \(dev\) in CMakeLists.txt:
Policy CMP0070 is not set: Define file\(GENERATE\) behavior for relative
paths. Run "cmake --help-policy CMP0070" for policy details. Use the
cmake_policy command to set the policy and suppress this warning.
diff --git a/Tests/RunCMake/File_Generate/RunCMakeTest.cmake b/Tests/RunCMake/File_Generate/RunCMakeTest.cmake
index 5987417..770fc6e 100644
--- a/Tests/RunCMake/File_Generate/RunCMakeTest.cmake
+++ b/Tests/RunCMake/File_Generate/RunCMakeTest.cmake
@@ -4,6 +4,10 @@ run_cmake(CMP0070-NEW)
run_cmake(CMP0070-OLD)
run_cmake(CMP0070-WARN)
+run_cmake(SourceProperty)
+run_cmake(SourceProperty-CMP0070-NEW)
+run_cmake(SourceProperty-CMP0070-OLD)
+
run_cmake(CommandConflict)
if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
run_cmake(OutputConflict)
diff --git a/Tests/RunCMake/File_Generate/SourceProperty-CMP0070-NEW-result.txt b/Tests/RunCMake/File_Generate/SourceProperty-CMP0070-NEW-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/File_Generate/SourceProperty-CMP0070-NEW-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/File_Generate/SourceProperty-CMP0070-NEW-stderr.txt b/Tests/RunCMake/File_Generate/SourceProperty-CMP0070-NEW-stderr.txt
new file mode 100644
index 0000000..2c385c4
--- /dev/null
+++ b/Tests/RunCMake/File_Generate/SourceProperty-CMP0070-NEW-stderr.txt
@@ -0,0 +1,11 @@
+^CMake Error at SourceProperty-CMP0070-NEW.cmake:[0-9]+ \(add_library\):
+ Cannot find source file:
+
+.*\/relative-output-NEW\.c
+
+ Tried extensions \.c \.C.*
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)
+
+
+CMake Generate step failed. Build files cannot be regenerated correctly.$
diff --git a/Tests/RunCMake/File_Generate/SourceProperty-CMP0070-NEW.cmake b/Tests/RunCMake/File_Generate/SourceProperty-CMP0070-NEW.cmake
new file mode 100644
index 0000000..d2b3e0c
--- /dev/null
+++ b/Tests/RunCMake/File_Generate/SourceProperty-CMP0070-NEW.cmake
@@ -0,0 +1,8 @@
+enable_language(C)
+add_library(foo)
+
+cmake_policy(SET CMP0070 NEW)
+file(GENERATE OUTPUT relative-output-NEW.c CONTENT "")
+target_sources(foo PRIVATE
+ "${CMAKE_CURRENT_SOURCE_DIR}/relative-output-NEW.c"
+)
diff --git a/Tests/RunCMake/File_Generate/SourceProperty-CMP0070-OLD-result.txt b/Tests/RunCMake/File_Generate/SourceProperty-CMP0070-OLD-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/File_Generate/SourceProperty-CMP0070-OLD-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/File_Generate/SourceProperty-CMP0070-OLD-stderr.txt b/Tests/RunCMake/File_Generate/SourceProperty-CMP0070-OLD-stderr.txt
new file mode 100644
index 0000000..fcb53a7
--- /dev/null
+++ b/Tests/RunCMake/File_Generate/SourceProperty-CMP0070-OLD-stderr.txt
@@ -0,0 +1,23 @@
+^CMake Deprecation Warning at SourceProperty-CMP0070-OLD.cmake:[0-9]+ \(cmake_policy\):
+ The OLD behavior for policy CMP0070 will be removed from a future version
+ of CMake.
+
+ The cmake-policies\(7\) manual explains that the OLD behaviors of all
+ policies are deprecated and that a policy should be set to OLD only under
+ specific short-term circumstances. Projects should be ported to the NEW
+ behavior and not rely on setting a policy to OLD.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)
+
+
+CMake Error at SourceProperty-CMP0070-OLD.cmake:[0-9]+ \(add_library\):
+ Cannot find source file:
+
+.*\/relative-output-OLD\.c
+
+ Tried extensions \.c \.C.*
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)
+
+
+CMake Generate step failed. Build files cannot be regenerated correctly.$
diff --git a/Tests/RunCMake/File_Generate/SourceProperty-CMP0070-OLD.cmake b/Tests/RunCMake/File_Generate/SourceProperty-CMP0070-OLD.cmake
new file mode 100644
index 0000000..48eae1e
--- /dev/null
+++ b/Tests/RunCMake/File_Generate/SourceProperty-CMP0070-OLD.cmake
@@ -0,0 +1,8 @@
+enable_language(C)
+add_library(foo)
+
+cmake_policy(SET CMP0070 OLD)
+file(GENERATE OUTPUT relative-output-OLD.c CONTENT "")
+target_sources(foo PRIVATE
+ "${CMAKE_CURRENT_BINARY_DIR}/relative-output-OLD.c"
+)
diff --git a/Tests/RunCMake/File_Generate/SourceProperty-stderr.txt b/Tests/RunCMake/File_Generate/SourceProperty-stderr.txt
new file mode 100644
index 0000000..47ec651
--- /dev/null
+++ b/Tests/RunCMake/File_Generate/SourceProperty-stderr.txt
@@ -0,0 +1,10 @@
+^CMake Deprecation Warning at SourceProperty.cmake:[0-9]+ \(cmake_policy\):
+ The OLD behavior for policy CMP0070 will be removed from a future version
+ of CMake.
+
+ The cmake-policies\(7\) manual explains that the OLD behaviors of all
+ policies are deprecated and that a policy should be set to OLD only under
+ specific short-term circumstances. Projects should be ported to the NEW
+ behavior and not rely on setting a policy to OLD.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)$
diff --git a/Tests/RunCMake/File_Generate/SourceProperty.cmake b/Tests/RunCMake/File_Generate/SourceProperty.cmake
new file mode 100644
index 0000000..231c670
--- /dev/null
+++ b/Tests/RunCMake/File_Generate/SourceProperty.cmake
@@ -0,0 +1,14 @@
+enable_language(C)
+add_library(SourceProperty)
+
+cmake_policy(SET CMP0070 OLD)
+file(GENERATE OUTPUT relative-output-OLD.c CONTENT "")
+target_sources(SourceProperty PRIVATE
+ "${CMAKE_CURRENT_SOURCE_DIR}/relative-output-OLD.c"
+)
+
+cmake_policy(SET CMP0070 NEW)
+file(GENERATE OUTPUT relative-output-NEW.c CONTENT "")
+target_sources(SourceProperty PRIVATE
+ "${CMAKE_CURRENT_BINARY_DIR}/relative-output-NEW.c"
+)