summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitlab-ci.yml9
-rw-r--r--CMakeLists.txt3
-rw-r--r--Modules/CMakeDetermineCUDACompiler.cmake39
-rw-r--r--Modules/FindOpenSSL.cmake9
-rw-r--r--Modules/Internal/CPack/CPackDeb.cmake10
-rw-r--r--Source/CMakeVersion.cmake2
-rw-r--r--Source/cmLocalGenerator.cxx240
-rw-r--r--Source/cmLocalGenerator.h5
-rw-r--r--Tests/CPackComponentsDEB/MyLibCPackConfig-components-description1.cmake.in2
-rw-r--r--Tests/RunCMake/CPack/tests/DEB_DESCRIPTION/VerifyResult.cmake12
-rw-r--r--Utilities/cmThirdPartyChecks.cmake300
11 files changed, 512 insertions, 119 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index a8b31da..a5dde59 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -17,13 +17,13 @@
image: "kitware/cmake:ci-fedora31-x86_64-2020-05-08"
variables:
- GIT_CLONE_PATH: "$CI_BUILDS_DIR/gitlab-kitware-cmake ci"
+ GIT_CLONE_PATH: "$CI_BUILDS_DIR/cmake ci"
.debian10: &debian10
image: "kitware/cmake:ci-debian10-x86_64-2020-04-27"
variables:
- GIT_CLONE_PATH: "$CI_BUILDS_DIR/gitlab-kitware-cmake ci"
+ GIT_CLONE_PATH: "$CI_BUILDS_DIR/cmake ci"
.debian10_iwyu: &debian10_iwyu
extends: .debian10
@@ -72,7 +72,7 @@
# change between the build and test stages which CMake doesn't support.
# Even if we could, it could change if other runners on the machine
# could run at the same time, so we drop it.
- GIT_CLONE_PATH: "$CI_BUILDS_DIR/gitlab-kitware-cmake ci"
+ GIT_CLONE_PATH: "$CI_BUILDS_DIR/cmake ci"
.macos_ninja: &macos_ninja
extends: .macos
@@ -96,8 +96,7 @@
# change between the build and test stages which CMake doesn't support.
# Even if we could, it could change if other runners on the machine
# could run at the same time, so we drop it.
- # Blocked on https://gitlab.com/gitlab-org/gitlab-runner/-/merge_requests/2122
- #GIT_CLONE_PATH: "$CI_BUILDS_DIR\\gitlab-kitware-cmake ci"
+ GIT_CLONE_PATH: "$CI_BUILDS_DIR\\cmake ci"
.windows_ninja: &windows_ninja
extends: .windows
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 35531c6..15dbcd3 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -337,6 +337,9 @@ endmacro()
macro (CMAKE_BUILD_UTILITIES)
find_package(Threads)
+ # Suppress unnecessary checks in third-party code.
+ include(Utilities/cmThirdPartyChecks.cmake)
+
#---------------------------------------------------------------------
# Create the kwsys library for CMake.
set(KWSYS_NAMESPACE cmsys)
diff --git a/Modules/CMakeDetermineCUDACompiler.cmake b/Modules/CMakeDetermineCUDACompiler.cmake
index 4a8a268..ed37d28 100644
--- a/Modules/CMakeDetermineCUDACompiler.cmake
+++ b/Modules/CMakeDetermineCUDACompiler.cmake
@@ -80,12 +80,23 @@ if(NOT CMAKE_CUDA_COMPILER_ID_RUN)
set(clang_test_flags)
endif()
+ # First try with the user-specified architectures.
+ if(CMAKE_CUDA_ARCHITECTURES)
+ set(clang_archs "${clang_test_flags}")
+
+ foreach(arch ${CMAKE_CUDA_ARCHITECTURES})
+ # Strip specifiers as PTX vs binary doesn't matter.
+ string(REGEX MATCH "[0-9]+" arch_name "${arch}")
+ string(APPEND clang_archs " --cuda-gpu-arch=sm_${arch_name}")
+ endforeach()
+
+ list(APPEND CMAKE_CUDA_COMPILER_ID_TEST_FLAGS_FIRST "${clang_archs}")
+ endif()
+
# Clang doesn't automatically select an architecture supported by the SDK.
# Try in reverse order of deprecation with the most recent at front (i.e. the most likely to work for new setups).
- foreach(arch ${CMAKE_CUDA_ARCHITECTURES} "20" "30" "52")
- # Strip specifiers.
- string(REGEX MATCH "[0-9]+" arch_name "${arch}")
- list(APPEND CMAKE_CUDA_COMPILER_ID_TEST_FLAGS_FIRST "${clang_test_flags} --cuda-gpu-arch=sm_${arch_name}")
+ foreach(arch "20" "30" "52")
+ list(APPEND CMAKE_CUDA_COMPILER_ID_TEST_FLAGS_FIRST "${clang_test_flags} --cuda-gpu-arch=sm_${arch}")
endforeach()
# Finally also try the default.
@@ -127,13 +138,29 @@ if(${CMAKE_GENERATOR} MATCHES "Visual Studio")
set(_SET_CMAKE_CUDA_RUNTIME_LIBRARY_DEFAULT
"set(CMAKE_CUDA_RUNTIME_LIBRARY_DEFAULT \"${CMAKE_CUDA_RUNTIME_LIBRARY_DEFAULT}\")")
elseif(CMAKE_CUDA_COMPILER_ID STREQUAL "Clang")
- # Parse default CUDA architecture.
if(NOT CMAKE_CUDA_ARCHITECTURES)
+ # Find the architecture that we successfully compiled using and set it as the default.
string(REGEX MATCH "-target-cpu sm_([0-9]+)" dont_care "${CMAKE_CUDA_COMPILER_PRODUCED_OUTPUT}")
set(CMAKE_CUDA_ARCHITECTURES "${CMAKE_MATCH_1}" CACHE STRING "CUDA architectures")
if(NOT CMAKE_CUDA_ARCHITECTURES)
- message(FATAL_ERROR "Failed to find default CUDA architecture.")
+ message(FATAL_ERROR "Failed to find a working CUDA architecture.")
+ endif()
+ else()
+ string(REGEX MATCHALL "-target-cpu sm_([0-9]+)" target_cpus "${CMAKE_CUDA_COMPILER_PRODUCED_OUTPUT}")
+
+ foreach(cpu ${target_cpus})
+ string(REGEX MATCH "-target-cpu sm_([0-9]+)" dont_care "${cpu}")
+ list(APPEND architectures "${CMAKE_MATCH_1}")
+ endforeach()
+
+ if(NOT "${architectures}" STREQUAL "${CMAKE_CUDA_ARCHITECTURES}")
+ message(FATAL_ERROR
+ "The CMAKE_CUDA_ARCHITECTURES:\n"
+ " ${CMAKE_CUDA_ARCHITECTURES}\n"
+ "do not all work with this compiler. Try:\n"
+ " ${architectures}\n"
+ "instead.")
endif()
endif()
diff --git a/Modules/FindOpenSSL.cmake b/Modules/FindOpenSSL.cmake
index a813ab5..8ddd78e 100644
--- a/Modules/FindOpenSSL.cmake
+++ b/Modules/FindOpenSSL.cmake
@@ -440,6 +440,15 @@ if(OPENSSL_INCLUDE_DIR AND EXISTS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h")
endif ()
set(OPENSSL_VERSION "${OPENSSL_VERSION_MAJOR}.${OPENSSL_VERSION_MINOR}.${OPENSSL_VERSION_FIX}${OPENSSL_VERSION_PATCH_STRING}")
+ else ()
+ # Since OpenSSL 3.0.0, the new version format is MAJOR.MINOR.PATCH and
+ # a new OPENSSL_VERSION_STR macro contains exactly that
+ file(STRINGS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h" OPENSSL_VERSION_STR
+ REGEX "^#[\t ]*define[\t ]+OPENSSL_VERSION_STR[\t ]+\"([0-9])+\.([0-9])+\.([0-9])+\".*")
+ string(REGEX REPLACE "^.*OPENSSL_VERSION_STR[\t ]+\"([0-9]+\.[0-9]+\.[0-9]+)\".*$"
+ "\\1" OPENSSL_VERSION_STR "${OPENSSL_VERSION_STR}")
+
+ set(OPENSSL_VERSION "${OPENSSL_VERSION_STR}")
endif ()
endif ()
diff --git a/Modules/Internal/CPack/CPackDeb.cmake b/Modules/Internal/CPack/CPackDeb.cmake
index 14bb104..db35e3a 100644
--- a/Modules/Internal/CPack/CPackDeb.cmake
+++ b/Modules/Internal/CPack/CPackDeb.cmake
@@ -83,6 +83,16 @@ function(cpack_deb_format_package_description TEXT OUTPUT_VAR)
string(REPLACE "\n" ";" _lines "${_text}")
list(POP_FRONT _lines _summary)
+ # If the description ends with a newline (e.g. typically if it was read
+ # from a file) the last line will be empty. We drop it here, otherwise
+ # it would be replaced by a `.` which would lead to the package violating
+ # the extended-description-contains-empty-paragraph debian policy
+ list(POP_BACK _lines _last_line)
+ string(STRIP "${_last_line}" _last_line_strip)
+ if(_last_line_strip)
+ list(APPEND _lines "${_last_line_strip}")
+ endif()
+
# Check if reformatting required
cpack_deb_check_description("${_summary}" "${_lines}" _result)
if(_result)
diff --git a/Source/CMakeVersion.cmake b/Source/CMakeVersion.cmake
index 60846d4..d343276 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 17)
-set(CMake_VERSION_PATCH 20200527)
+set(CMake_VERSION_PATCH 20200528)
#set(CMake_VERSION_RC 0)
set(CMake_VERSION_IS_DIRTY 0)
diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx
index e42eb58..ff05024 100644
--- a/Source/cmLocalGenerator.cxx
+++ b/Source/cmLocalGenerator.cxx
@@ -2569,6 +2569,8 @@ void cmLocalGenerator::AddPchDependencies(cmGeneratorTarget* target)
std::vector<cmSourceFile*> sources;
target->GetSourceFiles(sources, config);
+ const std::string configUpper = cmSystemTools::UpperCase(config);
+
for (const std::string& lang : { "C", "CXX", "OBJC", "OBJCXX" }) {
auto langSources = std::count_if(
sources.begin(), sources.end(), [lang](cmSourceFile* sf) {
@@ -2642,106 +2644,45 @@ void cmLocalGenerator::AddPchDependencies(cmGeneratorTarget* target)
if (this->Makefile->IsOn("CMAKE_PCH_COPY_COMPILE_PDB")) {
- const std::string pdb_prefix =
- this->GetGlobalGenerator()->IsMultiConfig()
- ? cmStrCat(this->GlobalGenerator->GetCMakeCFGIntDir(), "/")
- : "";
-
- const std::string target_compile_pdb_dir = cmStrCat(
- target->GetLocalGenerator()->GetCurrentBinaryDirectory(),
- "/", target->GetName(), ".dir/");
-
- const std::string copy_script =
- cmStrCat(target_compile_pdb_dir, "copy_idb_pdb.cmake");
- cmGeneratedFileStream file(copy_script);
-
- file << "# CMake generated file\n";
- for (auto extension : { ".pdb", ".idb" }) {
- const std::string from_file =
- cmStrCat(reuseTarget->GetLocalGenerator()
- ->GetCurrentBinaryDirectory(),
- "/", *ReuseFrom, ".dir/${PDB_PREFIX}", *ReuseFrom,
- extension);
-
- const std::string to_dir = cmStrCat(
- target->GetLocalGenerator()->GetCurrentBinaryDirectory(),
- "/", target->GetName(), ".dir/${PDB_PREFIX}");
-
- const std::string to_file =
- cmStrCat(to_dir, *ReuseFrom, extension);
-
- std::string dest_file = to_file;
-
- std::string const& prefix =
- target->GetSafeProperty("PREFIX");
- if (!prefix.empty()) {
- dest_file =
- cmStrCat(to_dir, prefix, *ReuseFrom, extension);
- }
-
- file << "if (EXISTS \"" << from_file << "\" AND \""
- << from_file << "\" IS_NEWER_THAN \"" << dest_file
- << "\")\n";
- file << " file(COPY \"" << from_file << "\""
- << " DESTINATION \"" << to_dir << "\")\n";
- if (!prefix.empty()) {
- file << " file(REMOVE \"" << dest_file << "\")\n";
- file << " file(RENAME \"" << to_file << "\" \""
- << dest_file << "\")\n";
- }
- file << "endif()\n";
- }
+ const std::string compilerId =
+ this->Makefile->GetSafeDefinition(
+ cmStrCat("CMAKE_", lang, "_COMPILER_ID"));
- bool stdPipesUTF8 = true;
- cmCustomCommandLines commandLines = cmMakeSingleCommandLine(
- { cmSystemTools::GetCMakeCommand(),
- cmStrCat("-DPDB_PREFIX=", pdb_prefix), "-P",
- copy_script });
-
- const std::string no_main_dependency;
- const std::vector<std::string> no_deps;
- const char* no_message = "";
- const char* no_current_dir = nullptr;
- std::vector<std::string> no_byproducts;
-
- std::vector<std::string> outputs;
- outputs.push_back(cmStrCat(target_compile_pdb_dir, pdb_prefix,
- *ReuseFrom, ".pdb"));
-
- if (this->GetGlobalGenerator()->IsVisualStudio()) {
- this->AddCustomCommandToTarget(
- target->GetName(), outputs, no_deps, commandLines,
- cmCustomCommandType::PRE_BUILD, no_message, no_current_dir,
- true, false, "", "", false,
- cmObjectLibraryCommands::Reject, stdPipesUTF8);
- } else {
- cmImplicitDependsList no_implicit_depends;
- cmSourceFile* copy_rule = this->AddCustomCommandToOutput(
- outputs, no_byproducts, no_deps, no_main_dependency,
- no_implicit_depends, commandLines, no_message,
- no_current_dir, false, true, false, false, "", "",
- stdPipesUTF8);
-
- if (copy_rule) {
- target->AddSource(copy_rule->ResolveFullPath());
- }
- }
+ const std::string compilerVersion =
+ this->Makefile->GetSafeDefinition(
+ cmStrCat("CMAKE_", lang, "_COMPILER_VERSION"));
- target->Target->SetProperty("COMPILE_PDB_OUTPUT_DIRECTORY",
- target_compile_pdb_dir);
+ const std::string langFlags =
+ this->Makefile->GetSafeDefinition(
+ cmStrCat("CMAKE_", lang, "_FLAGS_", configUpper));
+
+ // MSVC 2008 is producing both .pdb and .idb files with /Zi.
+ if ((langFlags.find("/ZI") != std::string::npos ||
+ langFlags.find("-ZI") != std::string::npos) ||
+ (cmSystemTools::VersionCompare(cmSystemTools::OP_LESS,
+ compilerVersion.c_str(),
+ "16.0") &&
+ compilerId == "MSVC")) {
+ CopyPchCompilePdb(config, target, *ReuseFrom, reuseTarget,
+ { ".pdb", ".idb" });
+ } else if ((langFlags.find("/Zi") != std::string::npos ||
+ langFlags.find("-Zi") != std::string::npos)) {
+ CopyPchCompilePdb(config, target, *ReuseFrom, reuseTarget,
+ { ".pdb" });
+ }
}
- std::string pchSourceObj =
- reuseTarget->GetPchFileObject(config, lang, arch);
-
- const std::string configUpper = cmSystemTools::UpperCase(config);
+ if (reuseTarget->GetType() != cmStateEnums::OBJECT_LIBRARY) {
+ std::string pchSourceObj =
+ reuseTarget->GetPchFileObject(config, lang, arch);
- // Link to the pch object file
- target->Target->AppendProperty(
- cmStrCat("LINK_FLAGS_", configUpper),
- cmStrCat(" ",
- this->ConvertToOutputFormat(pchSourceObj, SHELL)),
- true);
+ // Link to the pch object file
+ target->Target->AppendProperty(
+ cmStrCat("LINK_FLAGS_", configUpper),
+ cmStrCat(" ",
+ this->ConvertToOutputFormat(pchSourceObj, SHELL)),
+ true);
+ }
}
} else {
pch_sf->SetProperty("PCH_EXTENSION", pchExtension.c_str());
@@ -2765,6 +2706,115 @@ void cmLocalGenerator::AddPchDependencies(cmGeneratorTarget* target)
}
}
+void cmLocalGenerator::CopyPchCompilePdb(
+ const std::string& config, cmGeneratorTarget* target,
+ const std::string& ReuseFrom, cmGeneratorTarget* reuseTarget,
+ const std::vector<std::string>& extensions)
+{
+ const std::string pdb_prefix =
+ this->GetGlobalGenerator()->IsMultiConfig() ? cmStrCat(config, "/") : "";
+
+ const std::string target_compile_pdb_dir =
+ cmStrCat(target->GetLocalGenerator()->GetCurrentBinaryDirectory(), "/",
+ target->GetName(), ".dir/");
+
+ const std::string copy_script =
+ cmStrCat(target_compile_pdb_dir, "copy_idb_pdb.cmake");
+ cmGeneratedFileStream file(copy_script);
+
+ file << "# CMake generated file\n";
+
+ file << "# The compiler generated pdb file needs to be written to disk\n"
+ << "# by mspdbsrv. The foreach retry loop is needed to make sure\n"
+ << "# the pdb file is ready to be copied.\n\n";
+
+ for (auto const& extension : extensions) {
+ const std::string from_file =
+ cmStrCat(reuseTarget->GetLocalGenerator()->GetCurrentBinaryDirectory(),
+ "/", ReuseFrom, ".dir/${PDB_PREFIX}", ReuseFrom, extension);
+
+ const std::string to_dir =
+ cmStrCat(target->GetLocalGenerator()->GetCurrentBinaryDirectory(), "/",
+ target->GetName(), ".dir/${PDB_PREFIX}");
+
+ const std::string to_file = cmStrCat(to_dir, ReuseFrom, extension);
+
+ std::string dest_file = to_file;
+
+ std::string const& prefix = target->GetSafeProperty("PREFIX");
+ if (!prefix.empty()) {
+ dest_file = cmStrCat(to_dir, prefix, ReuseFrom, extension);
+ }
+
+ file << "foreach(retry RANGE 1 30)\n";
+ file << " if (EXISTS \"" << from_file << "\" AND \"" << from_file
+ << " \" IS_NEWER_THAN \"" << dest_file << "\")\n";
+ file << " execute_process(COMMAND ${CMAKE_COMMAND} -E copy";
+ file << " \"" << from_file << "\""
+ << " \"" << to_dir << "\" RESULT_VARIABLE result "
+ << " ERROR_QUIET)\n";
+ file << " if (NOT result EQUAL 0)\n"
+ << " execute_process(COMMAND ${CMAKE_COMMAND}"
+ << " -E sleep 1)\n"
+ << " else()\n";
+ if (!prefix.empty()) {
+ file << " file(REMOVE \"" << dest_file << "\")\n";
+ file << " file(RENAME \"" << to_file << "\" \"" << dest_file << "\")\n";
+ }
+ file << " break()\n"
+ << " endif()\n";
+ file << " else()\n"
+ << " execute_process(COMMAND ${CMAKE_COMMAND}"
+ << " -E sleep 1)\n"
+ << " endif()\n";
+ file << "endforeach()\n";
+ }
+
+ bool stdPipesUTF8 = true;
+
+ auto configGenex = [&](cm::string_view expr) -> std::string {
+ if (this->GetGlobalGenerator()->IsVisualStudio()) {
+ return cmStrCat("$<$<CONFIG:", config, ">:", expr, ">");
+ }
+ return std::string(expr);
+ };
+
+ cmCustomCommandLines commandLines = cmMakeSingleCommandLine(
+ { configGenex(cmSystemTools::GetCMakeCommand()),
+ configGenex(cmStrCat("-DPDB_PREFIX=", pdb_prefix)), configGenex("-P"),
+ configGenex(copy_script) });
+
+ const std::string no_main_dependency;
+ const std::vector<std::string> no_deps;
+ const char* no_message = "";
+ const char* no_current_dir = nullptr;
+ std::vector<std::string> no_byproducts;
+
+ std::vector<std::string> outputs;
+ outputs.push_back(
+ cmStrCat(target_compile_pdb_dir, pdb_prefix, ReuseFrom, ".pdb"));
+
+ if (this->GetGlobalGenerator()->IsVisualStudio()) {
+ this->AddCustomCommandToTarget(
+ target->GetName(), outputs, no_deps, commandLines,
+ cmCustomCommandType::PRE_BUILD, no_message, no_current_dir, true, false,
+ "", "", false, cmObjectLibraryCommands::Reject, stdPipesUTF8);
+ } else {
+ cmImplicitDependsList no_implicit_depends;
+ cmSourceFile* copy_rule = this->AddCustomCommandToOutput(
+ outputs, no_byproducts, no_deps, no_main_dependency, no_implicit_depends,
+ commandLines, no_message, no_current_dir, false, true, false, false, "",
+ "", stdPipesUTF8);
+
+ if (copy_rule) {
+ target->AddSource(copy_rule->ResolveFullPath());
+ }
+ }
+
+ target->Target->SetProperty("COMPILE_PDB_OUTPUT_DIRECTORY",
+ target_compile_pdb_dir);
+}
+
namespace {
inline void RegisterUnitySources(cmGeneratorTarget* target, cmSourceFile* sf,
diff --git a/Source/cmLocalGenerator.h b/Source/cmLocalGenerator.h
index 9beae61..f2d9145 100644
--- a/Source/cmLocalGenerator.h
+++ b/Source/cmLocalGenerator.h
@@ -540,6 +540,11 @@ private:
void ComputeObjectMaxPath();
bool AllAppleArchSysrootsAreTheSame(const std::vector<std::string>& archs,
const char* sysroot);
+
+ void CopyPchCompilePdb(const std::string& config, cmGeneratorTarget* target,
+ const std::string& ReuseFrom,
+ cmGeneratorTarget* reuseTarget,
+ std::vector<std::string> const& extensions);
};
#if !defined(CMAKE_BOOTSTRAP)
diff --git a/Tests/CPackComponentsDEB/MyLibCPackConfig-components-description1.cmake.in b/Tests/CPackComponentsDEB/MyLibCPackConfig-components-description1.cmake.in
index 67b108b..fb973ad 100644
--- a/Tests/CPackComponentsDEB/MyLibCPackConfig-components-description1.cmake.in
+++ b/Tests/CPackComponentsDEB/MyLibCPackConfig-components-description1.cmake.in
@@ -16,7 +16,7 @@ set(CPACK_COMPONENTS_IGNORE_GROUPS 1)
# overriding previous descriptions
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "main description") # This become a summary line (the first one) of all descriptions
-set(CPACK_COMPONENT_APPLICATIONS_DESCRIPTION "applications_description")
+set(CPACK_COMPONENT_APPLICATIONS_DESCRIPTION "applications_description\n")
set(CPACK_COMPONENT_HEADERS_DESCRIPTION "headers_description")
# libraries does not have any description and should inherit from CPACK_PACKAGE_DESCRIPTION_SUMMARY
# plus content of the `CPACK_PACKAGE_DESCRIPTION_FILE`.
diff --git a/Tests/RunCMake/CPack/tests/DEB_DESCRIPTION/VerifyResult.cmake b/Tests/RunCMake/CPack/tests/DEB_DESCRIPTION/VerifyResult.cmake
index bfe2059..70ad48b 100644
--- a/Tests/RunCMake/CPack/tests/DEB_DESCRIPTION/VerifyResult.cmake
+++ b/Tests/RunCMake/CPack/tests/DEB_DESCRIPTION/VerifyResult.cmake
@@ -46,17 +46,7 @@ set(_expected_description [[ Description: This is the summary line
.
See also: https://www.debian.org/doc/debian-policy/ch-controlfields.html#description]])
-# ATTENTION The code in `cmCPackGenerator.cxx` to read `CPACK_PACKAGE_DESCRIPTION_FILE`
-# has a BUG: it appends the `\n` character to every line of the
-# input, even if there was no EOL (e.g. at the last line of the file).
-# That is WHY for this sub-test the one more pre-formatted "empty"
-# line required!
-# NOTE For component based installers content of the file gonna read by
-# `CPackDeb` module and the `file(READ...)` command so no the mentioned
-# workaround required!
-if(RunCMake_SUBTEST_SUFFIX STREQUAL "CPACK_PACKAGE_DESCRIPTION_FILE" AND PACKAGING_TYPE STREQUAL "MONOLITHIC")
- string(APPEND _expected_description "\n ." )
-elseif(RunCMake_SUBTEST_SUFFIX STREQUAL "CPACK_NO_PACKAGE_DESCRIPTION")
+if(RunCMake_SUBTEST_SUFFIX STREQUAL "CPACK_NO_PACKAGE_DESCRIPTION")
set(_expected_description [[ Description: This is the summary line]])
elseif(RunCMake_SUBTEST_SUFFIX STREQUAL "CPACK_COMPONENT_COMP_DESCRIPTION")
set(_expected_description [[ Description: One line description]])
diff --git a/Utilities/cmThirdPartyChecks.cmake b/Utilities/cmThirdPartyChecks.cmake
new file mode 100644
index 0000000..e3ce469
--- /dev/null
+++ b/Utilities/cmThirdPartyChecks.cmake
@@ -0,0 +1,300 @@
+# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+# Hard-code third-party try_compile checks where we know the answer.
+
+# Results for builds targeting all supported platforms.
+set(HAVE_ASSERT_H 1)
+set(HAVE__CrtSetReportMode 0) # unused anyway
+set(HAVE_CTYPE_H 1)
+set(HAVE_LOCALE_H 1)
+set(HAVE_MEMMOVE 1)
+set(HAVE_SETLOCALE 1)
+set(HAVE_STDDEF_H 1)
+set(HAVE_STDIO_H 1)
+set(HAVE_STDLIB_H 1)
+set(HAVE_STRCHR 1)
+set(HAVE_STRDUP 1)
+set(HAVE_STRFTIME 1)
+set(HAVE_STRING_H 1)
+set(HAVE_STRRCHR 1)
+set(HAVE_WCHAR_H 1)
+set(SIZEOF_INT 4)
+set(SIZEOF_LONG_LONG 8)
+set(SIZEOF_SHORT 2)
+
+if(WIN32)
+ # Results for builds targeting Windows platforms.
+ # This covers both MSVC-ABI and GNU-ABI toolchains.
+
+ set(HAVE_ALARM 0)
+ set(HAVE_ARC4RANDOM 0)
+ set(HAVE_ARC4RANDOM_BUF 0)
+ set(HAVE_ARPA_TFTP_H 0)
+ set(HAVE_BSWAP_16 0)
+ set(HAVE_BSWAP_32 0)
+ set(HAVE_BSWAP_64 0)
+ set(HAVE_BUILTIN_AVAILABLE 0)
+ set(HAVE_BYTESWAP_H 0)
+ set(HAVE_CHFLAGS 0)
+ set(HAVE_CHOWN 0)
+ set(HAVE_CHROOT 0)
+ set(HAVE_COPYFILE_H 0)
+ set(HAVE_CRYPTO_H 0)
+ set(HAVE__CTIME64_S 1)
+ set(HAVE_CTIME_R 0)
+ set(HAVE_CYGWIN_CONV_PATH 0)
+ set(HAVE_DES_H 0)
+ set(HAVE_DIRECT_H 1)
+ set(HAVE_DIRFD 0)
+ set(HAVE_DLFCN_H 0)
+ set(HAVE_D_MD_ORDER 0)
+ set(HAVE_EFTYPE 0)
+ set(HAVE_EILSEQ 1)
+ set(HAVE_ERR_H 0)
+ set(HAVE_ERRNO_H 1)
+ set(HAVE_EXT2FS_EXT2_FS_H 0)
+ set(HAVE_FCHDIR 0)
+ set(HAVE_FCHFLAGS 0)
+ set(HAVE_FCHMOD 0)
+ set(HAVE_FCHOWN 0)
+ set(HAVE_FCNTL 0)
+ set(HAVE_FCNTL_H 1)
+ set(HAVE_FCNTL_O_NONBLOCK 0)
+ set(HAVE_FDOPENDIR 0)
+ set(HAVE_FORK 0)
+ set(HAVE_FREEADDRINFO 1)
+ set(HAVE_FREEIFADDRS 0)
+ set(HAVE__FSEEKI64 1)
+ set(HAVE_FSETXATTR 0)
+ set(HAVE_FSTAT 1)
+ set(HAVE_FSTATAT 0)
+ set(HAVE_FSTATFS 0)
+ set(HAVE_FSTATVFS 0)
+ set(HAVE_FTRUNCATE 0)
+ set(HAVE_FUTIMENS 0)
+ set(HAVE_FUTIMES 0)
+ set(HAVE_FUTIMESAT 0)
+ set(HAVE_GETEUID 0)
+ set(HAVE_GETGRGID_R 0)
+ set(HAVE_GETGRNAM_R 0)
+ set(HAVE_GETHOSTBYNAME 1)
+ set(HAVE_GETPAGESIZE 0)
+ set(HAVE_GETPEERNAME 1)
+ set(HAVE_GETPID 1)
+ set(HAVE_GETPROTOBYNAME 1)
+ set(HAVE_GETPWNAM_R 0)
+ set(HAVE_GETPWUID_R 0)
+ set(HAVE_GETRANDOM 0)
+ set(HAVE_GETRLIMIT 0)
+ set(HAVE_GETSOCKNAME 1)
+ set(HAVE_GETVFSBYNAME 0)
+ set(HAVE_GLIBC_STRERROR_R 0)
+ set(HAVE__GMTIME64_S 1)
+ set(HAVE_GMTIME_R 0)
+ set(HAVE_GRP_H 0)
+ set(HAVE_IDN2_H 0)
+ set(HAVE_IFADDRS_H 0)
+ set(HAVE_IF_NAMETOINDEX 0)
+ set(HAVE_INTTYPES_H 1)
+ set(HAVE_IOCTL 0)
+ set(HAVE_IOCTL_FIONBIO 0)
+ set(HAVE_IOCTL_SIOCGIFADDR 0)
+ set(HAVE_IOCTLSOCKET 1)
+ set(HAVE_IOCTLSOCKET_CAMEL 0)
+ set(HAVE_IOCTLSOCKET_CAMEL_FIONBIO 1)
+ set(HAVE_IOCTLSOCKET_FIONBIO 1)
+ set(HAVE_IO_H 1)
+ set(HAVE_KRB_H 0)
+ set(HAVE_LANGINFO_H 0)
+ set(HAVE_LCHFLAGS 0)
+ set(HAVE_LCHMOD 0)
+ set(HAVE_LCHOWN 0)
+ set(HAVE_LIBIDN2 0)
+ set(HAVE_LIBNETWORK 0)
+ set(HAVE_LIBWINMM 1)
+ set(HAVE_LIBWS2_32 1)
+ set(HAVE_LIMITS_H 1)
+ set(HAVE_LINK 0)
+ set(HAVE_LINUX_FIEMAP_H 0)
+ set(HAVE_LINUX_FS_H 0)
+ set(HAVE_LINUX_MAGIC_H 0)
+ set(HAVE_LINUX_TYPES_H 0)
+ set(HAVE__LOCALTIME64_S 1)
+ set(HAVE_LOCALTIME_R 0)
+ set(HAVE_LSTAT 0)
+ set(HAVE_LUTIMES 0)
+ set(HAVE_MACH_ABSOLUTE_TIME 0)
+ set(HAVE_MBRTOWC 1)
+ set(HAVE_MEMBERSHIP_H 0)
+ set(HAVE_MEMORY_H 1)
+ set(HAVE_MKDIR 1)
+ set(HAVE_MKFIFO 0)
+ set(HAVE__MKGMTIME64 1)
+ set(HAVE_MKNOD 0)
+ set(HAVE_MMAP 0)
+ set(HAVE_MSG_NOSIGNAL 0)
+ set(HAVE_NETINET_TCP_H 0)
+ set(HAVE_NL_LANGINFO 0)
+ set(HAVE_OPENAT 0)
+ set(HAVE_PATHS_H 0)
+ set(HAVE_PEM_H 0)
+ set(HAVE_PIPE 0)
+ set(HAVE_POLL 0)
+ set(HAVE_POLL_FINE 0)
+ set(HAVE_POLL_H 0)
+ set(HAVE_POSIX_SPAWNP 0)
+ set(HAVE_POSIX_STRERROR_R 0)
+ set(HAVE_PROCESS_H 1)
+ set(HAVE_PWD_H 0)
+ set(HAVE_READDIR_R 0)
+ set(HAVE_READLINK 0)
+ set(HAVE_READLINKAT 0)
+ set(HAVE_READPASSPHRASE 0)
+ set(HAVE_READPASSPHRASE 0)
+ set(HAVE_REGEX_H 0)
+ set(HAVE_RSA_H 0)
+ set(HAVE_SELECT 0)
+ set(HAVE_SETENV 0)
+ set(HAVE_SETMODE 1)
+ set(HAVE_SETRLIMIT 0)
+ set(HAVE_SETSOCKOPT 1)
+ set(HAVE_SETSOCKOPT_SO_NONBLOCK 0)
+ set(HAVE_SIGACTION 0)
+ set(HAVE_SIG_ATOMIC_T_NOT_VOLATILE 1)
+ set(HAVE_SIGINTERRUPT 0)
+ set(HAVE_SIGNAL_H 1)
+ set(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 0)
+ set(HAVE_SPAWN_H 0)
+ set(HAVE_SSL_H 0)
+ set(HAVE_STATFS 0)
+ set(HAVE_STATVFS 0)
+ set(HAVE_STDARG_H 1)
+ set(HAVE_STDBOOL_H 1)
+ set(HAVE_STDINT_H 1)
+ set(HAVE_STRERROR 1)
+ set(HAVE_STRERROR_R 0)
+ set(HAVE_STRNCMPI 0)
+ set(HAVE_STRNCPY_S 1)
+ set(HAVE_STROPTS_H 0)
+ set(HAVE__STRTOI64 1)
+ set(HAVE_STRTOLL 1)
+ set(HAVE_STRUCT_STATFS_F_NAMEMAX 0)
+ set(HAVE_STRUCT_STAT_ST_BIRTHTIME 0)
+ set(HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC 0)
+ set(HAVE_STRUCT_STAT_ST_BLKSIZE 0)
+ set(HAVE_STRUCT_STAT_ST_FLAGS 0)
+ set(HAVE_STRUCT_STAT_ST_MTIME_N 0)
+ set(HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC 0)
+ set(HAVE_STRUCT_STAT_ST_MTIME_USEC 0)
+ set(HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC 0)
+ set(HAVE_STRUCT_STAT_ST_UMTIME 0)
+ set(HAVE_STRUCT_TIMEVAL 1)
+ set(HAVE_STRUCT_TM___TM_GMTOFF 0)
+ set(HAVE_STRUCT_TM_TM_GMTOFF 0)
+ set(HAVE_STRUCT_VFSCONF 0)
+ set(HAVE_STRUCT_XVFSCONF 0)
+ set(HAVE_SYMLINK 0)
+ set(HAVE_SYS_ACL_H 0)
+ set(HAVE_SYSCALL_GETRANDOM 0)
+ set(HAVE_SYS_EXTATTR_H 0)
+ set(HAVE_SYS_FILIO_H 0)
+ set(HAVE_SYS_IOCTL_H 0)
+ set(HAVE_SYS_MKDEV_H 0)
+ set(HAVE_SYS_MOUNT_H 0)
+ set(HAVE_SYS_POLL_H 0)
+ set(HAVE_SYS_RESOURCE_H 0)
+ set(HAVE_SYS_RICHACL_H 0)
+ set(HAVE_SYS_SELECT_H 0)
+ set(HAVE_SYS_STATFS_H 0)
+ set(HAVE_SYS_STAT_H 1)
+ set(HAVE_SYS_STATVFS_H 0)
+ set(HAVE_SYS_SYSCTL_H 0)
+ set(HAVE_SYS_SYSMACROS_H 0)
+ set(HAVE_SYS_UIO_H 0)
+ set(HAVE_SYS_UN_H 0)
+ set(HAVE_SYS_UTSNAME_H 0)
+ set(HAVE_SYS_VFS_H 0)
+ set(HAVE_SYS_WAIT_H 0)
+ set(HAVE_SYS_XATTR_H 0)
+ set(HAVE_TIMEGM 0)
+ set(HAVE_TZSET 1)
+ set(HAVE_UNLINKAT 0)
+ set(HAVE_USLEEP 0)
+ set(HAVE_UTIMENSAT 0)
+ set(HAVE_UTIMES 0)
+ set(HAVE_VFORK 0)
+ set(HAVE_WORKING_EXT2_IOC_GETFLAGS 0)
+ set(HAVE_WORKING_FS_IOC_GETFLAGS 0)
+
+ # Some POSIX headers are available on Windows.
+ set(HAVE_SYS_TYPES_H 1)
+ set(HAVE_SYS_UTIME_H 1)
+ set(HAVE_TIME_H 1)
+ set(HAVE_UTIME 1)
+
+ # Wide character APIs are available on Windows.
+ set(HAVE_WCRTOMB 1)
+ set(HAVE_WCSCMP 1)
+ set(HAVE_WCSCPY 1)
+ set(HAVE_WCSLEN 1)
+ set(HAVE_WCTOMB 1)
+ set(HAVE_WCTYPE_H 1)
+
+ # Windows APIs are available on Windows.
+ set(HAVE_WINCRYPT_H 1)
+ set(HAVE_WINDOWS_H 1)
+ set(HAVE_WINIOCTL_H 1)
+ set(HAVE_WINSOCK2_H 1)
+ set(HAVE_WINSOCK_H 1)
+ set(HAVE_WS2TCPIP_H 1)
+
+ # UNIX integer id types do not exist on Windows.
+ set(HAVE_ID_T 0)
+ set(HAVE_GID_T 0)
+ set(HAVE_UID_T 0)
+ set(ID_T "")
+ set(GID_T "")
+ set(UID_T "")
+
+ # curl and expat: stdlib.h, stdarg.h, string.h, float.h
+ set(STDC_HEADERS 1)
+
+ # FIXME: Teach libarchive to use #if instead of configure-time checks.
+ set(HAVE_DECL_INT32_MAX 1)
+ set(HAVE_DECL_INT32_MIN 1)
+ set(HAVE_DECL_INT64_MAX 1)
+ set(HAVE_DECL_INT64_MIN 1)
+ set(HAVE_DECL_INTMAX_MAX 1)
+ set(HAVE_DECL_INTMAX_MIN 1)
+ set(HAVE_DECL_SIZE_MAX 1)
+ set(HAVE_DECL_UINT32_MAX 1)
+ set(HAVE_DECL_UINT64_MAX 1)
+ set(HAVE_DECL_UINTMAX_MAX 1)
+
+ # libarchive looks for external hash implementations.
+ set(ARCHIVE_CRYPTO_MD5_LIBC 0)
+ set(ARCHIVE_CRYPTO_MD5_LIBMD 0)
+ set(ARCHIVE_CRYPTO_MD5_LIBSYSTEM 0)
+ set(ARCHIVE_CRYPTO_MD5_WIN 1)
+ set(ARCHIVE_CRYPTO_RMD160_LIBC 0)
+ set(ARCHIVE_CRYPTO_RMD160_LIBMD 0)
+ set(ARCHIVE_CRYPTO_SHA1_LIBC 0)
+ set(ARCHIVE_CRYPTO_SHA1_LIBMD 0)
+ set(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM 0)
+ set(ARCHIVE_CRYPTO_SHA1_WIN 1)
+ set(ARCHIVE_CRYPTO_SHA256_LIBC 0)
+ set(ARCHIVE_CRYPTO_SHA256_LIBC2 0)
+ set(ARCHIVE_CRYPTO_SHA256_LIBC3 0)
+ set(ARCHIVE_CRYPTO_SHA256_LIBMD 0)
+ set(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM 0)
+ set(ARCHIVE_CRYPTO_SHA384_LIBC 0)
+ set(ARCHIVE_CRYPTO_SHA384_LIBC2 0)
+ set(ARCHIVE_CRYPTO_SHA384_LIBC3 0)
+ set(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM 0)
+ set(ARCHIVE_CRYPTO_SHA512_LIBC 0)
+ set(ARCHIVE_CRYPTO_SHA512_LIBC2 0)
+ set(ARCHIVE_CRYPTO_SHA512_LIBC3 0)
+ set(ARCHIVE_CRYPTO_SHA512_LIBMD 0)
+ set(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM 0)
+endif()