diff options
51 files changed, 625 insertions, 58 deletions
diff --git a/Help/command/if.rst b/Help/command/if.rst index c51d2bc..5dabe00 100644 --- a/Help/command/if.rst +++ b/Help/command/if.rst @@ -119,9 +119,10 @@ File Operations ``if(EXISTS path-to-file-or-directory)`` True if the named file or directory exists. Behavior is well-defined - only for full paths. Resolves symbolic links, i.e. if the named file or - directory is a symbolic link, returns true if the target of the - symbolic link exists. + only for explicit full paths (a leading ``~/`` is not expanded as + a home directory and is considered a relative path). + Resolves symbolic links, i.e. if the named file or directory is a + symbolic link, returns true if the target of the symbolic link exists. ``if(file1 IS_NEWER_THAN file2)`` True if ``file1`` is newer than ``file2`` or if one of the two files doesn't diff --git a/Help/cpack_gen/archive.rst b/Help/cpack_gen/archive.rst index 98b24ea..b941812 100644 --- a/Help/cpack_gen/archive.rst +++ b/Help/cpack_gen/archive.rst @@ -80,6 +80,8 @@ CPack generators which are essentially archives at their core. These include: not all compression modes support threading in all environments. Currently, only the XZ compression may support it. + See also the :variable:`CPACK_THREADS` variable. + .. note:: Official CMake binaries available on ``cmake.org`` ship with a ``liblzma`` diff --git a/Help/cpack_gen/deb.rst b/Help/cpack_gen/deb.rst index 7cae613..42b8392 100644 --- a/Help/cpack_gen/deb.rst +++ b/Help/cpack_gen/deb.rst @@ -329,12 +329,36 @@ List of CPack DEB generator specific variables: may fail to find your own shared libs. See https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/RPATH-handling + .. note:: + + You can also set :variable:`CPACK_DEBIAN_PACKAGE_SHLIBDEPS_PRIVATE_DIRS` + to an appropriate value if you use this feature, in order to please + ``dpkg-shlibdeps``. However, you should only do this for private + shared libraries that could not get resolved otherwise. + .. versionadded:: 3.3 Per-component ``CPACK_DEBIAN_<COMPONENT>_PACKAGE_SHLIBDEPS`` variables. .. versionadded:: 3.6 Correct handling of ``$ORIGIN`` in :variable:`CMAKE_INSTALL_RPATH`. +.. variable:: CPACK_DEBIAN_PACKAGE_SHLIBDEPS_PRIVATE_DIRS + + .. versionadded:: 3.20 + + May be set to a list of directories that will be given to ``dpkg-shlibdeps`` + via its ``-d`` option. These will be searched by ``dpkg-shlibdeps`` in order + to find private shared library dependencies. + + * Mandatory : NO + * Default : + + .. note:: + + You should prefer to set :variable:`CMAKE_INSTALL_RPATH` to an appropriate + value if you use ``dpkg-shlibdeps``. The current option is really only + needed for private shared library dependencies. + .. variable:: CPACK_DEBIAN_PACKAGE_DEBUG May be set when invoking cpack in order to trace debug information diff --git a/Help/prop_gbl/GENERATOR_IS_MULTI_CONFIG.rst b/Help/prop_gbl/GENERATOR_IS_MULTI_CONFIG.rst index 6f1a9e1..761a1dd 100644 --- a/Help/prop_gbl/GENERATOR_IS_MULTI_CONFIG.rst +++ b/Help/prop_gbl/GENERATOR_IS_MULTI_CONFIG.rst @@ -5,7 +5,11 @@ GENERATOR_IS_MULTI_CONFIG Read-only property that is true on multi-configuration generators. -True when using a multi-configuration generator -(such as :ref:`Visual Studio Generators` or :generator:`Xcode`). +True when using a multi-configuration generator such as: + +* :generator:`Ninja Multi-Config` +* :ref:`Visual Studio Generators` +* :generator:`Xcode` + Multi-config generators use :variable:`CMAKE_CONFIGURATION_TYPES` as the set of configurations and ignore :variable:`CMAKE_BUILD_TYPE`. diff --git a/Help/release/dev/cpack-compression-threads.rst b/Help/release/dev/cpack-compression-threads.rst new file mode 100644 index 0000000..214e1e7 --- /dev/null +++ b/Help/release/dev/cpack-compression-threads.rst @@ -0,0 +1,6 @@ +cpack-compression-threads +------------------------- + +* :module:`CPack` gained the :variable:`CPACK_THREADS` variable to + control the number of threads used for parallelized operations, + such as compressing the installer package. diff --git a/Help/release/dev/cpack-deb-shlibdeps-private-search-dirs.rst b/Help/release/dev/cpack-deb-shlibdeps-private-search-dirs.rst new file mode 100644 index 0000000..c4a4797 --- /dev/null +++ b/Help/release/dev/cpack-deb-shlibdeps-private-search-dirs.rst @@ -0,0 +1,8 @@ +cpack-deb-shlibdeps-resolving-private-dependencies +-------------------------------------------------- + +* The :module:`CPackDeb` module learned a new + :variable:`CPACK_DEBIAN_PACKAGE_SHLIBDEPS_PRIVATE_DIRS` + variable to specify additional search directories for + resolving private library dependencies when using + ``dpkg-shlibdeps``. diff --git a/Help/variable/CMAKE_SYSTEM_PROCESSOR.rst b/Help/variable/CMAKE_SYSTEM_PROCESSOR.rst index 8ad89f1..ce16215 100644 --- a/Help/variable/CMAKE_SYSTEM_PROCESSOR.rst +++ b/Help/variable/CMAKE_SYSTEM_PROCESSOR.rst @@ -1,8 +1,13 @@ CMAKE_SYSTEM_PROCESSOR ---------------------- -The name of the CPU CMake is building for. +When not cross-compiling, this variable has the same value as the +:variable:`CMAKE_HOST_SYSTEM_PROCESSOR` variable. In many cases, +this will correspond to the target architecture for the build, but +this is not guaranteed. (E.g. on Windows, the host may be ``AMD64`` +even when using a MSVC ``cl`` compiler with a 32-bit target.) -This variable is the same as :variable:`CMAKE_HOST_SYSTEM_PROCESSOR` if -you build for the host system instead of the target system when -cross compiling. +When cross-compiling, a :variable:`CMAKE_TOOLCHAIN_FILE` should set +the ``CMAKE_SYSTEM_PROCESSOR`` variable to match target architecture +that it specifies (via :variable:`CMAKE_<LANG>_COMPILER` and perhaps +:variable:`CMAKE_<LANG>_COMPILER_TARGET`). diff --git a/Modules/CPack.cmake b/Modules/CPack.cmake index eb1d43b..ef5a7d5 100644 --- a/Modules/CPack.cmake +++ b/Modules/CPack.cmake @@ -282,6 +282,28 @@ installers. The most commonly-used variables are: received by the cpack program. Defaults to ``FALSE`` for backwards compatibility. +.. variable:: CPACK_THREADS + + .. versionadded:: 3.20 + + Number of threads to use when performing parallelized operations, such + as compressing the installer package. + + Some compression methods used by CPack generators such as Debian or Archive + may take advantage of multiple CPU cores to speed up compression. + ``CPACK_THREADS`` can be set to positive integer to specify how many threads + will be used for compression. If it is set to 0, CPack will set it so that + all available CPU cores are used. + By default ``CPACK_THREADS`` is set to ``1``. + + Currently only ``xz`` compression *may* take advantage of multiple cores. Other + compression methods ignore this value and use only one thread. + + .. note:: + + Official CMake binaries available on ``cmake.org`` ship with a ``liblzma`` + that does not support parallel compression. + Variables for Source Package Generators ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -746,6 +768,7 @@ _cpack_set_default(CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR};${CMAKE_PROJECT_NAME};ALL;/") _cpack_set_default(CPACK_CMAKE_GENERATOR "${CMAKE_GENERATOR}") _cpack_set_default(CPACK_TOPLEVEL_TAG "${CPACK_SYSTEM_NAME}") +_cpack_set_default(CPACK_THREADS 1) # if the user has set CPACK_NSIS_DISPLAY_NAME remember it if(DEFINED CPACK_NSIS_DISPLAY_NAME) set(CPACK_NSIS_DISPLAY_NAME_SET TRUE) diff --git a/Modules/InstallRequiredSystemLibraries.cmake b/Modules/InstallRequiredSystemLibraries.cmake index 6ecdb9c..a39393dc 100644 --- a/Modules/InstallRequiredSystemLibraries.cmake +++ b/Modules/InstallRequiredSystemLibraries.cmake @@ -101,16 +101,18 @@ endforeach() if(MSVC) file(TO_CMAKE_PATH "$ENV{SYSTEMROOT}" SYSTEMROOT) - if(CMAKE_CL_64) - if(MSVC_VERSION GREATER 1599) - # VS 10 and later: - set(CMAKE_MSVC_ARCH x64) - else() + if(MSVC_C_ARCHITECTURE_ID) + string(TOLOWER "${MSVC_C_ARCHITECTURE_ID}" CMAKE_MSVC_ARCH) + elseif(MSVC_CXX_ARCHITECTURE_ID) + string(TOLOWER "${MSVC_CXX_ARCHITECTURE_ID}" CMAKE_MSVC_ARCH) + else() + set(CMAKE_MSVC_ARCH x86) + endif() + if(CMAKE_MSVC_ARCH STREQUAL "x64") + if(MSVC_VERSION LESS 1600) # VS 9 and earlier: set(CMAKE_MSVC_ARCH amd64) endif() - else() - set(CMAKE_MSVC_ARCH x86) endif() get_filename_component(devenv_dir "${CMAKE_MAKE_PROGRAM}" PATH) diff --git a/Modules/Internal/CPack/CPackDeb.cmake b/Modules/Internal/CPack/CPackDeb.cmake index 48d451a..2ef0489 100644 --- a/Modules/Internal/CPack/CPackDeb.cmake +++ b/Modules/Internal/CPack/CPackDeb.cmake @@ -310,10 +310,23 @@ function(cpack_deb_prepare_package_vars) set(IGNORE_MISSING_INFO_FLAG "--ignore-missing-info") endif() + if(CPACK_DEBIAN_PACKAGE_SHLIBDEPS_PRIVATE_DIRS) + unset(PRIVATE_SEARCH_DIR_OPTIONS) + # Add -l option if the tool supports it + if(DEFINED SHLIBDEPS_EXECUTABLE_VERSION AND SHLIBDEPS_EXECUTABLE_VERSION VERSION_GREATER_EQUAL 1.17.0) + foreach(dir IN LISTS CPACK_DEBIAN_PACKAGE_SHLIBDEPS_PRIVATE_DIRS) + list(APPEND PRIVATE_SEARCH_DIR_OPTIONS "-l${dir}") + endforeach() + else() + message(WARNING "CPackDeb: dkpg-shlibdeps is too old. \"CPACK_DEBIAN_PACKAGE_SHLIBDEPS_PRIVATE_DIRS\" is therefore ignored.") + endif() + endif() + # Execute dpkg-shlibdeps # --ignore-missing-info : allow dpkg-shlibdeps to run even if some libs do not belong to a package + # -l<dir>: make dpkg-shlibdeps also search in this directory for (private) shared library dependencies # -O : print to STDOUT - execute_process(COMMAND ${SHLIBDEPS_EXECUTABLE} ${IGNORE_MISSING_INFO_FLAG} -O ${CPACK_DEB_BINARY_FILES} + execute_process(COMMAND ${SHLIBDEPS_EXECUTABLE} ${PRIVATE_SEARCH_DIR_OPTIONS} ${IGNORE_MISSING_INFO_FLAG} -O ${CPACK_DEB_BINARY_FILES} WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}" OUTPUT_VARIABLE SHLIBDEPS_OUTPUT RESULT_VARIABLE SHLIBDEPS_RESULT @@ -325,7 +338,7 @@ function(cpack_deb_prepare_package_vars) endif() if(NOT SHLIBDEPS_RESULT EQUAL 0) message(FATAL_ERROR "CPackDeb: dpkg-shlibdeps: '${SHLIBDEPS_ERROR}';\n" - "executed command: '${SHLIBDEPS_EXECUTABLE} ${IGNORE_MISSING_INFO_FLAG} -O ${CPACK_DEB_BINARY_FILES}';\n" + "executed command: '${SHLIBDEPS_EXECUTABLE} ${PRIVATE_SEARCH_DIR_OPTIONS} ${IGNORE_MISSING_INFO_FLAG} -O ${CPACK_DEB_BINARY_FILES}';\n" "found files: '${INSTALL_FILE_}';\n" "files info: '${CPACK_DEB_INSTALL_FILES}';\n" "binary files: '${CPACK_DEB_BINARY_FILES}'") diff --git a/Modules/Platform/Linux-Intel-Fortran.cmake b/Modules/Platform/Linux-Intel-Fortran.cmake index d8e94d0..a99e793 100644 --- a/Modules/Platform/Linux-Intel-Fortran.cmake +++ b/Modules/Platform/Linux-Intel-Fortran.cmake @@ -1,4 +1,4 @@ include(Platform/Linux-Intel) __linux_compiler_intel(Fortran) -string(APPEND CMAKE_SHARED_LIBRARY_CREATE_Fortran_FLAGS " -nofor_main") +string(APPEND CMAKE_SHARED_LIBRARY_CREATE_Fortran_FLAGS " -nofor-main") set(CMAKE_SHARED_LIBRARY_LINK_Fortran_FLAGS "") diff --git a/Source/CMakeVersion.cmake b/Source/CMakeVersion.cmake index 51f63fc..2480380 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 19) -set(CMake_VERSION_PATCH 20210124) +set(CMake_VERSION_PATCH 20210127) #set(CMake_VERSION_RC 0) set(CMake_VERSION_IS_DIRTY 0) diff --git a/Source/CPack/cmCPackArchiveGenerator.cxx b/Source/CPack/cmCPackArchiveGenerator.cxx index 5348f86..7fd12dd 100644 --- a/Source/CPack/cmCPackArchiveGenerator.cxx +++ b/Source/CPack/cmCPackArchiveGenerator.cxx @@ -353,8 +353,12 @@ bool cmCPackArchiveGenerator::SetArchiveOptions(cmArchiveWrite* archive) // cause spurious errors to be raised from `strtoull`. if (this->Compress == cmArchiveWrite::CompressXZ) { const char* threads = "1"; + + // CPACK_ARCHIVE_THREADS overrides CPACK_THREADS if (this->IsSet("CPACK_ARCHIVE_THREADS")) { threads = this->GetOption("CPACK_ARCHIVE_THREADS"); + } else if (this->IsSet("CPACK_THREADS")) { + threads = this->GetOption("CPACK_THREADS"); } if (!archive->SetFilterOption("xz", "threads", threads)) { diff --git a/Source/CPack/cmCPackDebGenerator.cxx b/Source/CPack/cmCPackDebGenerator.cxx index 1220514..e7bcfac 100644 --- a/Source/CPack/cmCPackDebGenerator.cxx +++ b/Source/CPack/cmCPackDebGenerator.cxx @@ -2,6 +2,7 @@ file Copyright.txt or https://cmake.org/licensing for details. */ #include "cmCPackDebGenerator.h" +#include <cstdlib> #include <cstring> #include <map> #include <ostream> @@ -28,7 +29,7 @@ class DebGenerator public: DebGenerator(cmCPackLog* logger, std::string outputName, std::string workDir, std::string topLevelDir, std::string temporaryDir, - const char* debianCompressionType, + const char* debianCompressionType, const char* numThreads, const char* debianArchiveType, std::map<std::string, std::string> controlValues, bool genShLibs, std::string shLibsFilename, bool genPostInst, @@ -53,6 +54,7 @@ private: const std::string TopLevelDir; const std::string TemporaryDir; const char* DebianArchiveType; + int NumThreads; const std::map<std::string, std::string> ControlValues; const bool GenShLibs; const std::string ShLibsFilename; @@ -69,7 +71,8 @@ private: DebGenerator::DebGenerator( cmCPackLog* logger, std::string outputName, std::string workDir, std::string topLevelDir, std::string temporaryDir, - const char* debianCompressionType, const char* debianArchiveType, + const char* debianCompressionType, const char* numThreads, + const char* debianArchiveType, std::map<std::string, std::string> controlValues, bool genShLibs, std::string shLibsFilename, bool genPostInst, std::string postInst, bool genPostRm, std::string postRm, const char* controlExtra, @@ -115,6 +118,23 @@ DebGenerator::DebGenerator( "Error unrecognized compression type: " << debianCompressionType << std::endl); } + + if (numThreads == nullptr) { + numThreads = "1"; + } + + char* endptr; + this->NumThreads = static_cast<int>(strtol(numThreads, &endptr, 10)); + if (numThreads != endptr && *endptr != '\0') { + cmCPackLogger(cmCPackLog::LOG_ERROR, + "Unrecognized number of threads: " << numThreads + << std::endl); + } + + if (this->NumThreads < 0) { + cmCPackLogger(cmCPackLog::LOG_ERROR, + "Number of threads cannot be negative" << std::endl); + } } bool DebGenerator::generate() const @@ -173,7 +193,7 @@ bool DebGenerator::generateDataTar() const return false; } cmArchiveWrite data_tar(fileStream_data_tar, this->TarCompressionType, - this->DebianArchiveType); + this->DebianArchiveType, 0, this->NumThreads); data_tar.Open(); // uid/gid should be the one of the root user, and this root user has @@ -807,6 +827,7 @@ int cmCPackDebGenerator::createDeb() this->GetOption("CPACK_TOPLEVEL_DIRECTORY"), this->GetOption("CPACK_TEMPORARY_DIRECTORY"), this->GetOption("GEN_CPACK_DEBIAN_COMPRESSION_TYPE"), + this->GetOption("CPACK_THREADS"), this->GetOption("GEN_CPACK_DEBIAN_ARCHIVE_TYPE"), controlValues, gen_shibs, shlibsfilename, this->IsOn("GEN_CPACK_DEBIAN_GENERATE_POSTINST"), postinst, this->IsOn("GEN_CPACK_DEBIAN_GENERATE_POSTRM"), postrm, @@ -864,6 +885,7 @@ int cmCPackDebGenerator::createDbgsymDDeb() this->GetOption("CPACK_TOPLEVEL_DIRECTORY"), this->GetOption("CPACK_TEMPORARY_DIRECTORY"), this->GetOption("GEN_CPACK_DEBIAN_COMPRESSION_TYPE"), + this->GetOption("CPACK_THREADS"), this->GetOption("GEN_CPACK_DEBIAN_ARCHIVE_TYPE"), controlValues, false, "", false, "", false, "", nullptr, this->IsSet("GEN_CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION"), diff --git a/Source/cmArchiveWrite.cxx b/Source/cmArchiveWrite.cxx index 356089b..b685b73 100644 --- a/Source/cmArchiveWrite.cxx +++ b/Source/cmArchiveWrite.cxx @@ -2,6 +2,7 @@ file Copyright.txt or https://cmake.org/licensing for details. */ #include "cmArchiveWrite.h" +#include <cstdio> #include <cstring> #include <ctime> #include <iostream> @@ -81,7 +82,8 @@ struct cmArchiveWrite::Callback }; cmArchiveWrite::cmArchiveWrite(std::ostream& os, Compress c, - std::string const& format, int compressionLevel) + std::string const& format, int compressionLevel, + int numThreads) : Stream(os) , Archive(archive_write_new()) , Disk(archive_read_disk_new()) @@ -142,6 +144,18 @@ cmArchiveWrite::cmArchiveWrite(std::ostream& os, Compress c, cm_archive_error_string(this->Archive)); return; } + { + char sNumThreads[8]; + snprintf(sNumThreads, sizeof(sNumThreads), "%d", numThreads); + sNumThreads[7] = '\0'; // for safety + if (archive_write_set_filter_option(this->Archive, "xz", "threads", + sNumThreads) != ARCHIVE_OK) { + this->Error = cmStrCat("archive_compressor_xz_options: ", + cm_archive_error_string(this->Archive)); + return; + } + } + break; case CompressZstd: if (archive_write_add_filter_zstd(this->Archive) != ARCHIVE_OK) { diff --git a/Source/cmArchiveWrite.h b/Source/cmArchiveWrite.h index 168d30e..34aafe9 100644 --- a/Source/cmArchiveWrite.h +++ b/Source/cmArchiveWrite.h @@ -54,7 +54,8 @@ public: /** Construct with output stream to which to write archive. */ cmArchiveWrite(std::ostream& os, Compress c = CompressNone, - std::string const& format = "paxr", int compressionLevel = 0); + std::string const& format = "paxr", int compressionLevel = 0, + int numThreads = 1); ~cmArchiveWrite(); diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 86eddc2..a6d898d 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -2768,17 +2768,32 @@ inline void RegisterUnitySources(cmGeneratorTarget* target, cmSourceFile* sf, target->AddSourceFileToUnityBatch(sf->ResolveFullPath()); sf->SetProperty("UNITY_SOURCE_FILE", filename.c_str()); } +} -inline void IncludeFileInUnitySources(cmGeneratedFileStream& unity_file, - std::string const& sf_full_path, - cmProp beforeInclude, - cmProp afterInclude, cmProp uniqueIdName) +void cmLocalGenerator::IncludeFileInUnitySources( + cmGeneratedFileStream& unity_file, std::string const& sf_full_path, + cmProp beforeInclude, cmProp afterInclude, cmProp uniqueIdName) { - if (uniqueIdName && !uniqueIdName->empty()) { - unity_file << "#undef " << *uniqueIdName << "\n" + std::string pathToHash; + auto PathEqOrSubDir = [](std::string const& a, std::string const& b) { + return (cmSystemTools::ComparePath(a, b) || + cmSystemTools::IsSubDirectory(a, b)); + }; + const auto path = cmSystemTools::GetFilenamePath(sf_full_path); + if (PathEqOrSubDir(path, this->GetBinaryDirectory())) { + pathToHash = "BLD_" + + cmSystemTools::RelativePath(this->GetBinaryDirectory(), sf_full_path); + } else if (PathEqOrSubDir(path, this->GetSourceDirectory())) { + pathToHash = "SRC_" + + cmSystemTools::RelativePath(this->GetSourceDirectory(), sf_full_path); + } else { + pathToHash = "ABS_" + sf_full_path; + } + unity_file << "/* " << pathToHash << " */\n" + << "#undef " << *uniqueIdName << "\n" << "#define " << *uniqueIdName << " unity_" - << cmSystemTools::ComputeStringMD5(sf_full_path) << "\n"; + << cmSystemTools::ComputeStringMD5(pathToHash) << "\n"; } if (beforeInclude) { @@ -2790,9 +2805,10 @@ inline void IncludeFileInUnitySources(cmGeneratedFileStream& unity_file, if (afterInclude) { unity_file << *afterInclude << "\n"; } + unity_file << "\n"; } -std::vector<std::string> AddUnityFilesModeAuto( +std::vector<std::string> cmLocalGenerator::AddUnityFilesModeAuto( cmGeneratorTarget* target, std::string const& lang, std::vector<cmSourceFile*> const& filtered_sources, cmProp beforeInclude, cmProp afterInclude, std::string const& filename_base, size_t batchSize) @@ -2835,7 +2851,7 @@ std::vector<std::string> AddUnityFilesModeAuto( return unity_files; } -std::vector<std::string> AddUnityFilesModeGroup( +std::vector<std::string> cmLocalGenerator::AddUnityFilesModeGroup( cmGeneratorTarget* target, std::string const& lang, std::vector<cmSourceFile*> const& filtered_sources, cmProp beforeInclude, cmProp afterInclude, std::string const& filename_base) @@ -2883,7 +2899,6 @@ std::vector<std::string> AddUnityFilesModeGroup( return unity_files; } -} void cmLocalGenerator::AddUnityBuild(cmGeneratorTarget* target) { diff --git a/Source/cmLocalGenerator.h b/Source/cmLocalGenerator.h index 91dd8ae..a3610fd 100644 --- a/Source/cmLocalGenerator.h +++ b/Source/cmLocalGenerator.h @@ -4,6 +4,7 @@ #include "cmConfigure.h" // IWYU pragma: keep +#include <cstddef> #include <iosfwd> #include <map> #include <memory> @@ -27,6 +28,7 @@ class cmComputeLinkInformation; class cmCustomCommand; class cmCustomCommandGenerator; class cmCustomCommandLines; +class cmGeneratedFileStream; class cmGeneratorTarget; class cmGlobalGenerator; class cmImplicitDependsList; @@ -651,6 +653,18 @@ private: const std::string& ReuseFrom, cmGeneratorTarget* reuseTarget, std::vector<std::string> const& extensions); + void IncludeFileInUnitySources(cmGeneratedFileStream& unity_file, + std::string const& sf_full_path, + cmProp beforeInclude, cmProp afterInclude, + cmProp uniqueIdName); + std::vector<std::string> AddUnityFilesModeAuto( + cmGeneratorTarget* target, std::string const& lang, + std::vector<cmSourceFile*> const& filtered_sources, cmProp beforeInclude, + cmProp afterInclude, std::string const& filename_base, size_t batchSize); + std::vector<std::string> AddUnityFilesModeGroup( + cmGeneratorTarget* target, std::string const& lang, + std::vector<cmSourceFile*> const& filtered_sources, cmProp beforeInclude, + cmProp afterInclude, std::string const& filename_base); }; #if !defined(CMAKE_BOOTSTRAP) diff --git a/Source/cmNinjaUtilityTargetGenerator.cxx b/Source/cmNinjaUtilityTargetGenerator.cxx index 3995624..a18ca20 100644 --- a/Source/cmNinjaUtilityTargetGenerator.cxx +++ b/Source/cmNinjaUtilityTargetGenerator.cxx @@ -35,6 +35,11 @@ cmNinjaUtilityTargetGenerator::~cmNinjaUtilityTargetGenerator() = default; void cmNinjaUtilityTargetGenerator::Generate(const std::string& config) { + if (!this->GetGeneratorTarget()->Target->IsPerConfig()) { + this->WriteUtilBuildStatements(config, config); + return; + } + for (auto const& fileConfig : this->GetConfigNames()) { if (!this->GetGlobalGenerator() ->GetCrossConfigs(fileConfig) @@ -122,8 +127,6 @@ void cmNinjaUtilityTargetGenerator::WriteUtilBuildStatements( std::copy(util_outputs.begin(), util_outputs.end(), std::back_inserter(gg->GetByproductsForCleanTarget())); } - // TODO: Does this need an output config? - // Does this need to go in impl-<config>.ninja? lg->AppendTargetDepends(genTarget, deps, config, fileConfig, DependOnTargetArtifact); diff --git a/Source/kwsys/ProcessWin32.c b/Source/kwsys/ProcessWin32.c index 1267076..8f01684 100644 --- a/Source/kwsys/ProcessWin32.c +++ b/Source/kwsys/ProcessWin32.c @@ -962,7 +962,10 @@ void kwsysProcess_Execute(kwsysProcess* cp) kwsysProcessCleanup(cp, GetLastError()); return; } - SetCurrentDirectoryW(cp->WorkingDirectory); + if (!SetCurrentDirectoryW(cp->WorkingDirectory)) { + kwsysProcessCleanup(cp, GetLastError()); + return; + } } /* Setup the stdin pipe for the first process. */ diff --git a/Templates/MSBuild/FlagTables/v142_CSharp.json b/Templates/MSBuild/FlagTables/v142_CSharp.json index 5989aea..4dcea9d 100644 --- a/Templates/MSBuild/FlagTables/v142_CSharp.json +++ b/Templates/MSBuild/FlagTables/v142_CSharp.json @@ -201,6 +201,13 @@ "flags": [] }, { + "name": "DebugType", + "switch": "debug:portable", + "comment": "", + "value": "portable", + "flags": [] + }, + { "name": "Optimize", "switch": "optimize", "comment": "", @@ -264,6 +271,17 @@ "flags": [] }, { + "name": "WarningsAsErrors", + "switch": "warnaserror:", + "comment": "", + "value": "", + "flags": [ + "UserValue", + "UserRequired", + "CommaAppendable" + ] + }, + { "name": "WarningLevel", "switch": "warn:0", "comment": "", diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index 5948911..d28d89f 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -1153,6 +1153,26 @@ if(BUILD_TESTING) "components-depend1" "components-depend2" "compression") + # Run additional tests if dpkg-shlibdeps is available (and is new enough version) + find_program(SHLIBDEPS_EXECUTABLE NAMES dpkg-shlibdeps) + if(SHLIBDEPS_EXECUTABLE) + # Check version of the dpkg-shlibdeps tool + execute_process(COMMAND ${CMAKE_COMMAND} -E env LC_ALL=C ${SHLIBDEPS_EXECUTABLE} --version + OUTPUT_VARIABLE _TMP_VERSION + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(_TMP_VERSION MATCHES "dpkg-shlibdeps version ([0-9]+\\.[0-9]+\\.[0-9]+)") + set(SHLIBDEPS_EXECUTABLE_VERSION "${CMAKE_MATCH_1}") + else() + unset(SHLIBDEPS_EXECUTABLE_VERSION) + endif() + if(NOT SHLIBDEPS_EXECUTABLE_VERSION VERSION_LESS 1.19 OR + (NOT SHLIBDEPS_EXECUTABLE_VERSION VERSION_LESS 1.17 AND NOT CMAKE_BINARY_DIR MATCHES ".*[ ].*")) + list(APPEND DEB_CONFIGURATIONS_TO_TEST "shlibdeps-with-private-lib-failure" + "shlibdeps-with-private-lib-success") + endif() + endif() + set(CPackGen "DEB") set(CPackRun_CPackGen "-DCPackGen=${CPackGen}") diff --git a/Tests/CPackComponentsDEB/CMakeLists.txt b/Tests/CPackComponentsDEB/CMakeLists.txt index 4363f1b..b2e2106 100644 --- a/Tests/CPackComponentsDEB/CMakeLists.txt +++ b/Tests/CPackComponentsDEB/CMakeLists.txt @@ -22,6 +22,13 @@ target_link_libraries(mylibapp mylib) add_executable(mylibapp2 mylibapp.cpp) target_link_libraries(mylibapp2 mylib) +if (CPackDEBConfiguration MATCHES "shlibdeps-with-private-lib") + add_subdirectory("shlibdeps-with-private-lib") + add_executable(mylibapp3 mylibapp.cpp) + target_compile_definitions(mylibapp3 PRIVATE -DSHLIBDEPS_PRIVATE) + target_link_libraries(mylibapp3 myprivatelib) +endif() + # Create installation targets. Note that we put each kind of file # into a different component via COMPONENT. These components will # be used to create the installation components. @@ -39,6 +46,13 @@ install(FILES mylib.h DESTINATION include COMPONENT headers) +if (CPackDEBConfiguration MATCHES "shlibdeps-with-private-lib") + install(TARGETS mylibapp3 + RUNTIME + DESTINATION bin + COMPONENT applications) +endif() + # CPack boilerplate for this project set(CPACK_PACKAGE_NAME "MyLib") set(CPACK_PACKAGE_CONTACT "None") diff --git a/Tests/CPackComponentsDEB/MyLibCPackConfig-shlibdeps-with-private-lib-failure.cmake.in b/Tests/CPackComponentsDEB/MyLibCPackConfig-shlibdeps-with-private-lib-failure.cmake.in new file mode 100644 index 0000000..cfe6df5 --- /dev/null +++ b/Tests/CPackComponentsDEB/MyLibCPackConfig-shlibdeps-with-private-lib-failure.cmake.in @@ -0,0 +1,24 @@ +# +# Activate component packaging +# + +if(CPACK_GENERATOR MATCHES "DEB") + set(CPACK_DEB_COMPONENT_INSTALL "ON") +endif() + +# +# Choose grouping way +# +#set(CPACK_COMPONENTS_ALL_GROUPS_IN_ONE_PACKAGE) +#set(CPACK_COMPONENTS_GROUPING) +set(CPACK_COMPONENTS_IGNORE_GROUPS 1) +#set(CPACK_COMPONENTS_ALL_IN_ONE_PACKAGE 1) + +# we set shlibdeps to on +set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) +# except for the component "headers" that do not contain any binary. +# the packaging will just fail if this does not work +set(CPACK_DEBIAN_HEADERS_PACKAGE_SHLIBDEPS OFF) + +# Also libraries contains only a static library. +set(CPACK_DEBIAN_LIBRARIES_PACKAGE_SHLIBDEPS OFF) diff --git a/Tests/CPackComponentsDEB/MyLibCPackConfig-shlibdeps-with-private-lib-success.cmake.in b/Tests/CPackComponentsDEB/MyLibCPackConfig-shlibdeps-with-private-lib-success.cmake.in new file mode 100644 index 0000000..76aadc9 --- /dev/null +++ b/Tests/CPackComponentsDEB/MyLibCPackConfig-shlibdeps-with-private-lib-success.cmake.in @@ -0,0 +1,33 @@ +# +# Activate component packaging +# + +if(CPACK_GENERATOR MATCHES "DEB") + set(CPACK_DEB_COMPONENT_INSTALL "ON") +endif() + +# +# Choose grouping way +# +#set(CPACK_COMPONENTS_ALL_GROUPS_IN_ONE_PACKAGE) +#set(CPACK_COMPONENTS_GROUPING) +set(CPACK_COMPONENTS_IGNORE_GROUPS 1) +#set(CPACK_COMPONENTS_ALL_IN_ONE_PACKAGE 1) + +# we set shlibdeps to on +set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) +# except for the component "headers" that do not contain any binary. +# the packaging will just fail if this does not work +set(CPACK_DEBIAN_HEADERS_PACKAGE_SHLIBDEPS OFF) + +# Also libraries contains only a static library. +set(CPACK_DEBIAN_LIBRARIES_PACKAGE_SHLIBDEPS OFF) + +# Most importantly, we also give a list of additional search directories +# to allow `dpkg-shlibdeps` to find the private dependency. +set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS_PRIVATE_DIRS + "${CPACK_PACKAGE_DIRECTORY}/shlibdeps-with-private-lib" + "${CPACK_PACKAGE_DIRECTORY}/shlibdeps-with-private-lib/Debug" + "${CPACK_PACKAGE_DIRECTORY}/shlibdeps-with-private-lib/Release" + "${CPACK_PACKAGE_DIRECTORY}/shlibdeps-with-private-lib/RelWithDebInfo" + "${CPACK_PACKAGE_DIRECTORY}/shlibdeps-with-private-lib/MinSizeRel") diff --git a/Tests/CPackComponentsDEB/RunCPackVerifyResult-shlibdeps-with-private-lib-failure.cmake b/Tests/CPackComponentsDEB/RunCPackVerifyResult-shlibdeps-with-private-lib-failure.cmake new file mode 100644 index 0000000..547852d7 --- /dev/null +++ b/Tests/CPackComponentsDEB/RunCPackVerifyResult-shlibdeps-with-private-lib-failure.cmake @@ -0,0 +1,19 @@ +if(NOT CPackComponentsDEB_SOURCE_DIR) + message(FATAL_ERROR "CPackComponentsDEB_SOURCE_DIR not set") +endif() + +include(${CPackComponentsDEB_SOURCE_DIR}/RunCPackVerifyResult.cmake) + + +set(actual_output) +run_cpack(actual_output + CPack_output + CPack_error + EXPECT_FAILURE + CONFIG_ARGS ${config_args} + CONFIG_VERBOSE ${config_verbose}) + +string(REGEX MATCH "dpkg-shlibdeps: error: (cannot|couldn't) find library\n[ \t]*libmyprivatelib.so.1 needed by ./usr/bin/mylibapp3" expected_error ${CPack_error}) +if(NOT expected_error) + message(FATAL_ERROR "Did not get the expected error-message!") +endif() diff --git a/Tests/CPackComponentsDEB/RunCPackVerifyResult-shlibdeps-with-private-lib-success.cmake b/Tests/CPackComponentsDEB/RunCPackVerifyResult-shlibdeps-with-private-lib-success.cmake new file mode 100644 index 0000000..6eff3db --- /dev/null +++ b/Tests/CPackComponentsDEB/RunCPackVerifyResult-shlibdeps-with-private-lib-success.cmake @@ -0,0 +1,75 @@ +if(NOT CPackComponentsDEB_SOURCE_DIR) + message(FATAL_ERROR "CPackComponentsDEB_SOURCE_DIR not set") +endif() + +include(${CPackComponentsDEB_SOURCE_DIR}/RunCPackVerifyResult.cmake) + + + +# requirements + +# debian now produces lower case names +set(expected_file_mask "${CPackComponentsDEB_BINARY_DIR}/mylib-*_1.0.3_*.deb") +set(expected_count 3) + + +set(actual_output) +run_cpack(actual_output + CPack_output + CPack_error + EXPECTED_FILE_MASK "${expected_file_mask}" + CONFIG_ARGS ${config_args} + CONFIG_VERBOSE ${config_verbose}) + +message(STATUS "expected_count='${expected_count}'") +message(STATUS "expected_file_mask='${expected_file_mask}'") +message(STATUS "actual_output_files='${actual_output}'") + +if(NOT actual_output) + message(FATAL_ERROR "error: expected_files do not exist: CPackComponentsDEB test fails. (CPack_output=${CPack_output}, CPack_error=${CPack_error}") +endif() + +list(LENGTH actual_output actual_count) +message(STATUS "actual_count='${actual_count}'") +if(NOT actual_count EQUAL expected_count) + message(FATAL_ERROR "error: expected_count=${expected_count} does not match actual_count=${actual_count}: CPackComponents test fails. (CPack_output=${CPack_output}, CPack_error=${CPack_error})") +endif() + + +# dpkg-deb checks for the summary of the packages +find_program(DPKGDEB_EXECUTABLE dpkg-deb) +if(DPKGDEB_EXECUTABLE) + set(dpkgdeb_output_errors_all "") + foreach(_f IN LISTS actual_output) + + # extracts the metadata from the package + run_dpkgdeb(dpkg_output + FILENAME ${_f} + ) + + dpkgdeb_return_specific_metaentry(dpkg_package_name + DPKGDEB_OUTPUT "${dpkg_output}" + METAENTRY "Package:") + + message(STATUS "package='${dpkg_package_name}'") + + if(dpkg_package_name STREQUAL "mylib-applications") + # pass + elseif(dpkg_package_name STREQUAL "mylib-headers") + # pass + elseif(dpkg_package_name STREQUAL "mylib-libraries") + # pass + else() + set(dpkgdeb_output_errors_all ${dpkgdeb_output_errors_all} + "dpkg-deb: ${_f}: component name not found: ${dpkg_package_name}\n") + endif() + + endforeach() + + + if(NOT dpkgdeb_output_errors_all STREQUAL "") + message(FATAL_ERROR "dpkg-deb checks failed:\n${dpkgdeb_output_errors_all}") + endif() +else() + message("dpkg-deb executable not found - skipping dpkg-deb test") +endif() diff --git a/Tests/CPackComponentsDEB/RunCPackVerifyResult.cmake b/Tests/CPackComponentsDEB/RunCPackVerifyResult.cmake index 3bc8d2a..8f7c198 100644 --- a/Tests/CPackComponentsDEB/RunCPackVerifyResult.cmake +++ b/Tests/CPackComponentsDEB/RunCPackVerifyResult.cmake @@ -29,7 +29,7 @@ endif() # run cpack with some options and returns the list of files generated # -output_expected_file: list of files that match the pattern function(run_cpack output_expected_file CPack_output_parent CPack_error_parent) - set(options ) + set(options "EXPECT_FAILURE") set(oneValueArgs "EXPECTED_FILE_MASK" "CONFIG_VERBOSE") set(multiValueArgs "CONFIG_ARGS") cmake_parse_arguments(run_cpack_deb "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) @@ -45,17 +45,26 @@ function(run_cpack output_expected_file CPack_output_parent CPack_error_parent) message("config_args = ${run_cpack_deb_CONFIG_ARGS}") message("config_verbose = ${run_cpack_deb_CONFIG_VERBOSE}") + + set(_backup_lang "$ENV{LANG}") + set(_backup_lc_all "$ENV{LC_ALL}") + set(ENV{LANG} "C") + set(ENV{LC_ALL} "C") execute_process(COMMAND ${CMAKE_CPACK_COMMAND} ${run_cpack_deb_CONFIG_VERBOSE} -G ${CPackGen} -C "${CONFIG}" ${run_cpack_deb_CONFIG_ARGS} RESULT_VARIABLE CPack_result OUTPUT_VARIABLE CPack_output ERROR_VARIABLE CPack_error WORKING_DIRECTORY ${CPackComponentsDEB_BINARY_DIR}) + set(ENV{LANG} "${_backup_lang}") + set(ENV{LC_ALL} "${_backup_lc_all}") set(${CPack_output_parent} ${CPack_output} PARENT_SCOPE) set(${CPack_error_parent} ${CPack_error} PARENT_SCOPE) - if (CPack_result) + if (CPack_result AND NOT run_cpack_deb_EXPECT_FAILURE) message(FATAL_ERROR "error: CPack execution went wrong!, CPack_output=${CPack_output}, CPack_error=${CPack_error}") + elseif (NOT CPack_result AND run_cpack_deb_EXPECT_FAILURE) + message(FATAL_ERROR "error: CPack execution succeeded although failure was expected!, CPack_output=${CPack_output}, CPack_error=${CPack_error}") else () message(STATUS "CPack_output=${CPack_output}") message(STATUS "CPack_error=${CPack_error}") diff --git a/Tests/CPackComponentsDEB/mylibapp.cpp b/Tests/CPackComponentsDEB/mylibapp.cpp index a438ac7..bb45831 100644 --- a/Tests/CPackComponentsDEB/mylibapp.cpp +++ b/Tests/CPackComponentsDEB/mylibapp.cpp @@ -1,6 +1,19 @@ -#include "mylib.h" +#ifndef SHLIBDEPS_PRIVATE + +# include "mylib.h" int main() { mylib_function(); } + +#else + +# include "shlibdeps-with-private-lib/myprivatelib.h" + +int main() +{ + myprivatelib_function(); +} + +#endif diff --git a/Tests/CPackComponentsDEB/shlibdeps-with-private-lib/CMakeLists.txt b/Tests/CPackComponentsDEB/shlibdeps-with-private-lib/CMakeLists.txt new file mode 100644 index 0000000..c7ef386 --- /dev/null +++ b/Tests/CPackComponentsDEB/shlibdeps-with-private-lib/CMakeLists.txt @@ -0,0 +1,5 @@ +add_library(myprivatelib SHARED myprivatelib.cpp) +set_target_properties( myprivatelib PROPERTIES + VERSION 1.2.3 + SOVERSION 1 +) diff --git a/Tests/CPackComponentsDEB/shlibdeps-with-private-lib/myprivatelib.cpp b/Tests/CPackComponentsDEB/shlibdeps-with-private-lib/myprivatelib.cpp new file mode 100644 index 0000000..67110e6 --- /dev/null +++ b/Tests/CPackComponentsDEB/shlibdeps-with-private-lib/myprivatelib.cpp @@ -0,0 +1,8 @@ +#include "myprivatelib.h" + +#include "stdio.h" + +void myprivatelib_function() +{ + printf("This is myprivatelib"); +} diff --git a/Tests/CPackComponentsDEB/shlibdeps-with-private-lib/myprivatelib.h b/Tests/CPackComponentsDEB/shlibdeps-with-private-lib/myprivatelib.h new file mode 100644 index 0000000..7e4a42d --- /dev/null +++ b/Tests/CPackComponentsDEB/shlibdeps-with-private-lib/myprivatelib.h @@ -0,0 +1 @@ +void myprivatelib_function(); diff --git a/Tests/ExternalProject/CMakeLists.txt b/Tests/ExternalProject/CMakeLists.txt index 8fd44b4..132abf4 100644 --- a/Tests/ExternalProject/CMakeLists.txt +++ b/Tests/ExternalProject/CMakeLists.txt @@ -329,7 +329,7 @@ if(do_git_tests) set(proj TutorialStep1-GIT-byhash) ExternalProject_Add(${proj} GIT_REPOSITORY "${local_git_repo}" - GIT_TAG d1970730310fe8bc07e73f15dc570071f9f9654a + GIT_TAG 57418671a0a0e371e7bac532337152595fbe0df5 # generated by gitrepo.bash UPDATE_COMMAND "" CMAKE_GENERATOR "${CMAKE_GENERATOR}" CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> @@ -664,23 +664,23 @@ endif() if(do_git_tests) add_test(TutorialStep1-GIT-byhash - "${binary_base}/TutorialStep1-GIT-byhash/Tutorial" 100) + ${CMAKE_COMMAND} -P "${binary_base}/TutorialStep1-GIT-byhash/example.cmake") add_test(TutorialStep1-GIT-bytag - "${binary_base}/TutorialStep1-GIT-bytag/Tutorial" 99) + ${CMAKE_COMMAND} -P "${binary_base}/TutorialStep1-GIT-bytag/example.cmake") add_test(TutorialStep1-GIT-bytag-withsubmodules - "${binary_base}/TutorialStep1-GIT-bytag-withsubmodules/Tutorial" 99) + ${CMAKE_COMMAND} -P "${binary_base}/TutorialStep1-GIT-bytag-withsubmodules/example.cmake") add_test(TutorialStep1-GIT-shallow-master - "${binary_base}/TutorialStep1-GIT-shallow-master/Tutorial" 98) + ${CMAKE_COMMAND} -P "${binary_base}/TutorialStep1-GIT-shallow-master/example.cmake") add_test(TutorialStep1-GIT-master - "${binary_base}/TutorialStep1-GIT-master/Tutorial" 98) + ${CMAKE_COMMAND} -P "${binary_base}/TutorialStep1-GIT-master/example.cmake") if(NOT git_version VERSION_LESS 1.7.7) add_test(TutorialStep1-GIT-config - "${binary_base}/TutorialStep1-GIT-config/Tutorial" 98) + ${CMAKE_COMMAND} -P "${binary_base}/TutorialStep1-GIT-config/example.cmake") endif() endif() diff --git a/Tests/ExternalProject/gitrepo-sub-rec.tgz b/Tests/ExternalProject/gitrepo-sub-rec.tgz Binary files differindex b0f3f18..0e63651 100644 --- a/Tests/ExternalProject/gitrepo-sub-rec.tgz +++ b/Tests/ExternalProject/gitrepo-sub-rec.tgz diff --git a/Tests/ExternalProject/gitrepo-sub.tgz b/Tests/ExternalProject/gitrepo-sub.tgz Binary files differindex c0b5360..ab34fff 100644 --- a/Tests/ExternalProject/gitrepo-sub.tgz +++ b/Tests/ExternalProject/gitrepo-sub.tgz diff --git a/Tests/ExternalProject/gitrepo.bash b/Tests/ExternalProject/gitrepo.bash new file mode 100755 index 0000000..c341f28 --- /dev/null +++ b/Tests/ExternalProject/gitrepo.bash @@ -0,0 +1,129 @@ +#!/usr/bin/env bash + +set -e +set -x + +readonly tmpdir="$(mktemp -d)" +trap "rm -rf '$tmpdir'" EXIT + +readonly outdir="${BASH_SOURCE%/*}" +readonly defaultBranch='master' + +export GIT_AUTHOR_NAME='testauthor' +export GIT_AUTHOR_EMAIL='testauthor@cmake.org' +export GIT_COMMITTER_NAME='testauthor' +export GIT_COMMITTER_EMAIL='testauthor@cmake.org' + +( +cd "$tmpdir" + +git --bare init -b "$defaultBranch" gitrepo.git +rm -f gitrepo.git/hooks/*.sample + +mkdir gitrepo +cd gitrepo +git init -b "$defaultBranch" +echo 'cmake_minimum_required(VERSION 3.19) +project(Example NONE) +add_custom_target(example ALL + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/example.cmake.in example.cmake +)' >CMakeLists.txt +echo 'message(STATUS example)' >example.cmake.in +git add CMakeLists.txt example.cmake.in +git commit -m "Initial import into repo." +git push ../gitrepo.git "$defaultBranch" +cd ../gitrepo.git +git gc --prune +cd .. +ln -s gitrepo.git GIT + +git --bare init -b "$defaultBranch" gitrepo-sub.git +rm -f gitrepo-sub.git/hooks/*.sample + +mkdir gitrepo-sub +cd gitrepo-sub +git init -b "$defaultBranch" +echo 'cmake_minimum_required(VERSION 3.19) +project(ExampleWithSub NONE) +file(STRINGS "${CMAKE_SOURCE_DIR}/.git/config" git_config_strings + REGEX "^\\[submodule") +foreach(submodule m1 m2) + option(WITH_${submodule} "Enable ${submodule}" OFF) + set(${submodule}_INITED FALSE) + set(${submodule}_UPDATED FALSE) + foreach(s ${git_config_strings}) + if("${s}" MATCHES "${submodule}") + set(${submodule}_INITED TRUE) + endif() + endforeach() + if(EXISTS "${CMAKE_SOURCE_DIR}/m/${submodule}/CMakeLists.txt") + set(${submodule}_UPDATED TRUE) + endif() + if(WITH_${submodule}) + if(NOT ${submodule}_INITED) + message(FATAL_ERROR "${submodule} not inited") + elseif(NOT ${submodule}_UPDATED) + message(FATAL_ERROR "${submodule} not updated") + endif() + else() + if(${submodule}_INITED) + message(FATAL_ERROR "${submodule} inited") + elseif(${submodule}_UPDATED) + message(FATAL_ERROR "${submodule} updated") + endif() + endif() +endforeach()' >CMakeLists.txt +git add CMakeLists.txt +git submodule add -- ../GIT m/m1 +git submodule add -- ../GIT m/m2 +git submodule add -- ../GIT m/m3 +git commit -m "Initial import into repo." +git push ../gitrepo-sub.git "$defaultBranch" +cd ../gitrepo-sub.git +git gc --prune +cd .. +ln -s gitrepo-sub.git GIT-with-submodules + +git --bare init -b "$defaultBranch" gitrepo-sub-rec.git +rm -f gitrepo-sub-rec.git/hooks/*.sample + +mkdir gitrepo-sub-rec +cd gitrepo-sub-rec +git init -b "$defaultBranch" +echo 'cmake_minimum_required(VERSION 3.19) +project(ExampleWithRecSub NONE) +set(top_submodule_dir "${CMAKE_SOURCE_DIR}/submodule") +if(NOT EXISTS "${top_submodule_dir}/CMakeLists.txt") + message(FATAL_ERROR "Top submodule not updated") +endif() +option(WITH_RECURSIVE "Submodules are updated recursively" ON) +foreach(submodule m1 m2 m3) + set(${submodule}_UPDATED FALSE) + if(EXISTS "${top_submodule_dir}/m/${submodule}/CMakeLists.txt") + set(${submodule}_UPDATED TRUE) + endif() + if(WITH_RECURSIVE) + if(NOT ${submodule}_UPDATED) + message(FATAL_ERROR "${submodule} not updated") + endif() + else() + if(${submodule}_UPDATED) + message(FATAL_ERROR "${submodule} updated") + endif() + endif() +endforeach()' >CMakeLists.txt +git add CMakeLists.txt +git submodule add -- ../GIT-with-submodules submodule +git commit -m "Initial import into repo." +git push ../gitrepo-sub-rec.git "$defaultBranch" +cd ../gitrepo-sub-rec.git +git gc --prune +cd .. +) + +tar cvzf "$outdir/gitrepo.tgz" -C "$tmpdir" gitrepo.git +tar cvzf "$outdir/gitrepo-sub.tgz" -C "$tmpdir" gitrepo-sub.git +tar cvzf "$outdir/gitrepo-sub-rec.tgz" -C "$tmpdir" gitrepo-sub-rec.git + +git_tag=$(cd "$tmpdir/gitrepo.git" ; git rev-parse HEAD) +sed -i "/generated by gitrepo.bash/ s/ [0-9a-f]\\+ / $git_tag /" "$outdir/CMakeLists.txt" diff --git a/Tests/ExternalProject/gitrepo.tgz b/Tests/ExternalProject/gitrepo.tgz Binary files differindex 0a84bda..8d2d144 100644 --- a/Tests/ExternalProject/gitrepo.tgz +++ b/Tests/ExternalProject/gitrepo.tgz diff --git a/Tests/RunCMake/CPack/RunCMakeTest.cmake b/Tests/RunCMake/CPack/RunCMakeTest.cmake index 530bcdf..15bfb60 100644 --- a/Tests/RunCMake/CPack/RunCMakeTest.cmake +++ b/Tests/RunCMake/CPack/RunCMakeTest.cmake @@ -21,8 +21,8 @@ run_cpack_test(LONG_FILENAMES "DEB.LONG_FILENAMES" false "MONOLITHIC") run_cpack_test_subtests(MAIN_COMPONENT "invalid;found" "RPM.MAIN_COMPONENT" false "COMPONENT") run_cpack_test(MINIMAL "RPM.MINIMAL;DEB.MINIMAL;7Z;TBZ2;TGZ;TXZ;TZ;ZIP;STGZ;External" false "MONOLITHIC;COMPONENT") run_cpack_test_package_target(MINIMAL "RPM.MINIMAL;DEB.MINIMAL;7Z;TBZ2;TGZ;TXZ;TZ;ZIP;STGZ;External" false "MONOLITHIC;COMPONENT") -run_cpack_test_package_target(THREADED_ALL "TXZ" false "MONOLITHIC;COMPONENT") -run_cpack_test_package_target(THREADED "TXZ" false "MONOLITHIC;COMPONENT") +run_cpack_test_package_target(THREADED_ALL "TXZ;DEB" false "MONOLITHIC;COMPONENT") +run_cpack_test_package_target(THREADED "TXZ;DEB" false "MONOLITHIC;COMPONENT") run_cpack_test_subtests(PACKAGE_CHECKSUM "invalid;MD5;SHA1;SHA224;SHA256;SHA384;SHA512" "TGZ" false "MONOLITHIC") run_cpack_test(PARTIALLY_RELOCATABLE_WARNING "RPM.PARTIALLY_RELOCATABLE_WARNING" false "COMPONENT") run_cpack_test(PER_COMPONENT_FIELDS "RPM.PER_COMPONENT_FIELDS;DEB.PER_COMPONENT_FIELDS" false "COMPONENT") diff --git a/Tests/RunCMake/CPack/tests/THREADED/DEB-Prerequirements.cmake b/Tests/RunCMake/CPack/tests/THREADED/DEB-Prerequirements.cmake new file mode 100644 index 0000000..7b2692c --- /dev/null +++ b/Tests/RunCMake/CPack/tests/THREADED/DEB-Prerequirements.cmake @@ -0,0 +1 @@ +set(CPACK_DEBIAN_COMPRESSION_TYPE xz) diff --git a/Tests/RunCMake/CPack/tests/THREADED/test.cmake b/Tests/RunCMake/CPack/tests/THREADED/test.cmake index 78fc9e9..9e82e8c 100644 --- a/Tests/RunCMake/CPack/tests/THREADED/test.cmake +++ b/Tests/RunCMake/CPack/tests/THREADED/test.cmake @@ -1,6 +1,6 @@ install(FILES CMakeLists.txt DESTINATION foo COMPONENT test) -set(CPACK_ARCHIVE_THREADS 2) +set(CPACK_THREADS 2) if(PACKAGING_TYPE STREQUAL "COMPONENT") set(CPACK_COMPONENTS_ALL test) diff --git a/Tests/RunCMake/CPack/tests/THREADED_ALL/DEB-Prerequirements.cmake b/Tests/RunCMake/CPack/tests/THREADED_ALL/DEB-Prerequirements.cmake new file mode 100644 index 0000000..7b2692c --- /dev/null +++ b/Tests/RunCMake/CPack/tests/THREADED_ALL/DEB-Prerequirements.cmake @@ -0,0 +1 @@ +set(CPACK_DEBIAN_COMPRESSION_TYPE xz) diff --git a/Tests/RunCMake/CPack/tests/THREADED_ALL/test.cmake b/Tests/RunCMake/CPack/tests/THREADED_ALL/test.cmake index 34051b8..6f37201 100644 --- a/Tests/RunCMake/CPack/tests/THREADED_ALL/test.cmake +++ b/Tests/RunCMake/CPack/tests/THREADED_ALL/test.cmake @@ -1,6 +1,6 @@ install(FILES CMakeLists.txt DESTINATION foo COMPONENT test) -set(CPACK_ARCHIVE_THREADS 0) +set(CPACK_THREADS 0) if(PACKAGING_TYPE STREQUAL "COMPONENT") set(CPACK_COMPONENTS_ALL test) diff --git a/Tests/RunCMake/NinjaMultiConfig/RunCMakeTest.cmake b/Tests/RunCMake/NinjaMultiConfig/RunCMakeTest.cmake index 480d628..21c2658 100644 --- a/Tests/RunCMake/NinjaMultiConfig/RunCMakeTest.cmake +++ b/Tests/RunCMake/NinjaMultiConfig/RunCMakeTest.cmake @@ -85,6 +85,9 @@ set(RunCMake_TEST_OPTIONS "-DCMAKE_CONFIGURATION_TYPES=RelWithDebInfo\\;Debug\\; run_cmake_configure(Simple) unset(RunCMake_TEST_OPTIONS) include(${RunCMake_TEST_BINARY_DIR}/target_files.cmake) +run_ninja(Simple targets-default build.ninja -t targets) +run_ninja(Simple targets-debug build-Debug.ninja -t targets) +run_ninja(Simple targets-release build-Debug.ninja -t targets) run_cmake_build(Simple debug-target Debug simpleexe) run_ninja(Simple debug-target build-Debug.ninja simplestatic) get_filename_component(simpleshared_Release "${TARGET_FILE_simpleshared_Release}" NAME) diff --git a/Tests/RunCMake/NinjaMultiConfig/Simple-targets-debug-ninja-stdout.txt b/Tests/RunCMake/NinjaMultiConfig/Simple-targets-debug-ninja-stdout.txt new file mode 100644 index 0000000..f72516f --- /dev/null +++ b/Tests/RunCMake/NinjaMultiConfig/Simple-targets-debug-ninja-stdout.txt @@ -0,0 +1,3 @@ +(rebuild_cache: phony.* +edit_cache: phony|edit_cache: phony.* +rebuild_cache: phony) diff --git a/Tests/RunCMake/NinjaMultiConfig/Simple-targets-default-ninja-stdout.txt b/Tests/RunCMake/NinjaMultiConfig/Simple-targets-default-ninja-stdout.txt new file mode 100644 index 0000000..f72516f --- /dev/null +++ b/Tests/RunCMake/NinjaMultiConfig/Simple-targets-default-ninja-stdout.txt @@ -0,0 +1,3 @@ +(rebuild_cache: phony.* +edit_cache: phony|edit_cache: phony.* +rebuild_cache: phony) diff --git a/Tests/RunCMake/NinjaMultiConfig/Simple-targets-release-ninja-stdout.txt b/Tests/RunCMake/NinjaMultiConfig/Simple-targets-release-ninja-stdout.txt new file mode 100644 index 0000000..f72516f --- /dev/null +++ b/Tests/RunCMake/NinjaMultiConfig/Simple-targets-release-ninja-stdout.txt @@ -0,0 +1,3 @@ +(rebuild_cache: phony.* +edit_cache: phony|edit_cache: phony.* +rebuild_cache: phony) diff --git a/Tests/RunCMake/UnityBuild/f.cxx b/Tests/RunCMake/UnityBuild/f.cxx new file mode 100644 index 0000000..d5813c6 --- /dev/null +++ b/Tests/RunCMake/UnityBuild/f.cxx @@ -0,0 +1,5 @@ +int f(int x) +{ + (void)x; + return 0; +} diff --git a/Tests/RunCMake/UnityBuild/unitybuild_anon_ns-build-check.cmake b/Tests/RunCMake/UnityBuild/unitybuild_anon_ns-build-check.cmake new file mode 100644 index 0000000..746be32 --- /dev/null +++ b/Tests/RunCMake/UnityBuild/unitybuild_anon_ns-build-check.cmake @@ -0,0 +1,10 @@ +set(unitybuild_0 "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/tgt.dir/Unity/unity_0_cxx.cxx") + +file(STRINGS ${unitybuild_0} src) + +foreach(expectedRegex IN ITEMS "SRC_f\\.cxx" "BLD_s1\\.cpp") + if(NOT "${src}" MATCHES "${expectedRegex}") + set(RunCMake_TEST_FAILED "Generated unity file doesn't have a match for expected unity ID regex ${expectedRegex}") + return() + endif() +endforeach() diff --git a/Tests/RunCMake/UnityBuild/unitybuild_anon_ns.cmake b/Tests/RunCMake/UnityBuild/unitybuild_anon_ns.cmake index 6f4878f..e05863d 100644 --- a/Tests/RunCMake/UnityBuild/unitybuild_anon_ns.cmake +++ b/Tests/RunCMake/UnityBuild/unitybuild_anon_ns.cmake @@ -4,7 +4,7 @@ include(${CMAKE_CURRENT_SOURCE_DIR}/unitybuild_anon_ns_test_files.cmake) write_unity_build_anon_ns_test_files(srcs) -add_library(tgt SHARED ${srcs}) +add_library(tgt SHARED f.cxx ${srcs}) set_target_properties(tgt PROPERTIES UNITY_BUILD ON) diff --git a/Utilities/cmlibarchive/CMakeLists.txt b/Utilities/cmlibarchive/CMakeLists.txt index bfcaf30..6d6c1fb 100644 --- a/Utilities/cmlibarchive/CMakeLists.txt +++ b/Utilities/cmlibarchive/CMakeLists.txt @@ -1475,9 +1475,15 @@ CHECK_C_SOURCE_COMPILES( "#include <sys/sysmacros.h>\nint main() { return major(256); }" MAJOR_IN_SYSMACROS) +CMAKE_PUSH_CHECK_STATE() +SET(CMAKE_REQUIRED_LIBRARIES ${LIBLZMA_LIBRARIES}) +SET(CMAKE_REQUIRED_INCLUDES ${LIBLZMA_INCLUDE_DIR}) + CHECK_C_SOURCE_COMPILES( "#include <lzma.h>\n#if LZMA_VERSION < 50020000\n#error unsupported\n#endif\nint main(void){lzma_stream_encoder_mt(0, 0); return 0;}" - HAVE_LZMA_STREAM_ENCODER_MT) +HAVE_LZMA_STREAM_ENCODER_MT) + +CMAKE_POP_CHECK_STATE() IF(HAVE_STRERROR_R) SET(HAVE_DECL_STRERROR_R 1) diff --git a/Utilities/std/cm/optional b/Utilities/std/cm/optional index 0defae1..2ebc78c 100644 --- a/Utilities/std/cm/optional +++ b/Utilities/std/cm/optional @@ -313,7 +313,7 @@ bool operator!=(const optional<T>& opt, nullopt_t) noexcept } template <typename T> -bool operator<(const optional<T>& opt, nullopt_t) noexcept +bool operator<(const optional<T>& /*opt*/, nullopt_t) noexcept { return false; } @@ -331,7 +331,7 @@ bool operator>(const optional<T>& opt, nullopt_t) noexcept } template <typename T> -bool operator>=(const optional<T>& opt, nullopt_t) noexcept +bool operator>=(const optional<T>& /*opt*/, nullopt_t) noexcept { return true; } @@ -355,13 +355,13 @@ bool operator<(nullopt_t, const optional<T>& opt) noexcept } template <typename T> -bool operator<=(nullopt_t, const optional<T>& opt) noexcept +bool operator<=(nullopt_t, const optional<T>& /*opt*/) noexcept { return true; } template <typename T> -bool operator>(nullopt_t, const optional<T>& opt) noexcept +bool operator>(nullopt_t, const optional<T>& /*opt*/) noexcept { return false; } |