diff options
-rw-r--r-- | .gitlab-ci.yml | 9 | ||||
-rw-r--r-- | CMakeLists.txt | 3 | ||||
-rw-r--r-- | Modules/CMakeDetermineCUDACompiler.cmake | 39 | ||||
-rw-r--r-- | Modules/FindOpenSSL.cmake | 9 | ||||
-rw-r--r-- | Modules/Internal/CPack/CPackDeb.cmake | 10 | ||||
-rw-r--r-- | Source/CMakeVersion.cmake | 2 | ||||
-rw-r--r-- | Source/cmLocalGenerator.cxx | 240 | ||||
-rw-r--r-- | Source/cmLocalGenerator.h | 5 | ||||
-rw-r--r-- | Tests/CPackComponentsDEB/MyLibCPackConfig-components-description1.cmake.in | 2 | ||||
-rw-r--r-- | Tests/RunCMake/CPack/tests/DEB_DESCRIPTION/VerifyResult.cmake | 12 | ||||
-rw-r--r-- | Utilities/cmThirdPartyChecks.cmake | 300 |
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() |