diff options
33 files changed, 278 insertions, 113 deletions
diff --git a/Help/manual/cmake-policies.7.rst b/Help/manual/cmake-policies.7.rst index 8d41ed8..e98038a 100644 --- a/Help/manual/cmake-policies.7.rst +++ b/Help/manual/cmake-policies.7.rst @@ -57,6 +57,7 @@ Policies Introduced by CMake 3.18 .. toctree:: :maxdepth: 1 + CMP0108: A target cannot link to itself through an alias. </policy/CMP0108> CMP0107: An ALIAS target cannot overwrite another target. </policy/CMP0107> CMP0106: The Documentation module is removed. </policy/CMP0106> CMP0105: Device link step uses the link options. </policy/CMP0105> diff --git a/Help/policy/CMP0108.rst b/Help/policy/CMP0108.rst new file mode 100644 index 0000000..0d54cfa --- /dev/null +++ b/Help/policy/CMP0108.rst @@ -0,0 +1,19 @@ +CMP0108 +------- + +A target is not allowed to link to itself even through an ``ALIAS`` target. + +In CMake 3.17 and below, a target can link to a target aliased to itself. + +The ``OLD`` behavior for this policy is to allow a target to link to a target +aliased to itself. + +The ``NEW`` behavior of this policy is to prevent a target to link to itself +through an ``ALIAS`` target. + +This policy was introduced in CMake version 3.17. Use the +:command:`cmake_policy` command to set it to ``OLD`` or ``NEW`` explicitly. +Unlike many policies, CMake version |release| does *not* warn +when this policy is not set and simply uses ``OLD`` behavior. + +.. include:: DEPRECATED.txt diff --git a/Help/release/dev/fc-ep-git-update-strategy.rst b/Help/release/dev/fc-ep-git-update-strategy.rst new file mode 100644 index 0000000..b48fdcf --- /dev/null +++ b/Help/release/dev/fc-ep-git-update-strategy.rst @@ -0,0 +1,9 @@ +fc-ep-git-update-strategy +------------------------- + +* The :command:`ExternalProject_Add` command gained a new + ``GIT_REMOTE_UPDATE_STRATEGY`` keyword. This can be used to specify how + failed rebase operations during a git update should be handled. + The ``CMAKE_EP_GIT_REMOTE_UPDATE_STRATEGY`` variable was also added as a + global default and is honored by both the :module:`ExternalProject` and + :module:`FetchContent` modules. diff --git a/Help/release/dev/self-link-through-alias.rst b/Help/release/dev/self-link-through-alias.rst new file mode 100644 index 0000000..d91d7ae --- /dev/null +++ b/Help/release/dev/self-link-through-alias.rst @@ -0,0 +1,5 @@ +self-link-through-alias +----------------------- + +* Linking a target to itself through an alias now raise an error. + See policy :policy:`CMP0108`. diff --git a/Modules/CMakeDetermineCUDACompiler.cmake b/Modules/CMakeDetermineCUDACompiler.cmake index ed37d28..1601e83 100644 --- a/Modules/CMakeDetermineCUDACompiler.cmake +++ b/Modules/CMakeDetermineCUDACompiler.cmake @@ -70,7 +70,6 @@ if(NOT CMAKE_CUDA_COMPILER_ID_RUN) if(CMAKE_CUDA_HOST_COMPILER) string(APPEND nvcc_test_flags " -ccbin=${CMAKE_CUDA_HOST_COMPILER}") endif() - list(APPEND CMAKE_CUDA_COMPILER_ID_TEST_FLAGS_FIRST ${nvcc_test_flags}) # Clang if(CMAKE_CROSSCOMPILING) @@ -83,16 +82,22 @@ if(NOT CMAKE_CUDA_COMPILER_ID_RUN) # First try with the user-specified architectures. if(CMAKE_CUDA_ARCHITECTURES) set(clang_archs "${clang_test_flags}") + set(nvcc_archs "${nvcc_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}") + string(APPEND nvcc_archs " -gencode=arch=compute_${arch_name},code=sm_${arch_name}") endforeach() list(APPEND CMAKE_CUDA_COMPILER_ID_TEST_FLAGS_FIRST "${clang_archs}") + list(APPEND CMAKE_CUDA_COMPILER_ID_TEST_FLAGS_FIRST "${nvcc_archs}") endif() + # Fallback default NVCC flags. + list(APPEND CMAKE_CUDA_COMPILER_ID_TEST_FLAGS_FIRST ${nvcc_test_flags}) + # 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 "20" "30" "52") @@ -141,11 +146,7 @@ elseif(CMAKE_CUDA_COMPILER_ID STREQUAL "Clang") 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 a working CUDA architecture.") - endif() + set(detected_architecture "${CMAKE_MATCH_1}") else() string(REGEX MATCHALL "-target-cpu sm_([0-9]+)" target_cpus "${CMAKE_CUDA_COMPILER_PRODUCED_OUTPUT}") @@ -153,15 +154,6 @@ elseif(CMAKE_CUDA_COMPILER_ID STREQUAL "Clang") 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() # Clang does not add any CUDA SDK libraries or directories when invoking the host linker. @@ -346,11 +338,35 @@ if(CMAKE_CUDA_COMPILER_ID STREQUAL "NVIDIA") cmake_policy(GET CMP0104 _CUDA_CMP0104) if(NOT CMAKE_CUDA_ARCHITECTURES AND _CUDA_CMP0104 STREQUAL "NEW") string(REGEX MATCH "arch[ =]compute_([0-9]+)" dont_care "${CMAKE_CUDA_COMPILER_PRODUCED_OUTPUT}") - set(CMAKE_CUDA_ARCHITECTURES "${CMAKE_MATCH_1}" CACHE STRING "CUDA architectures") + set(detected_architecture "${CMAKE_MATCH_1}") + elseif(CMAKE_CUDA_ARCHITECTURES) + string(REGEX MATCHALL "-arch compute_([0-9]+)" target_cpus "${CMAKE_CUDA_COMPILER_PRODUCED_OUTPUT}") - if(NOT CMAKE_CUDA_ARCHITECTURES) - message(FATAL_ERROR "Failed to find default CUDA architecture.") - endif() + foreach(cpu ${target_cpus}) + string(REGEX MATCH "-arch compute_([0-9]+)" dont_care "${cpu}") + list(APPEND architectures "${CMAKE_MATCH_1}") + endforeach() + endif() +endif() + +if(DEFINED detected_architecture) + set(CMAKE_CUDA_ARCHITECTURES "${detected_architecture}" CACHE STRING "CUDA architectures") + + if(NOT CMAKE_CUDA_ARCHITECTURES) + message(FATAL_ERROR "Failed to find a working CUDA architecture.") + endif() +elseif(architectures) + # Sort since order mustn't matter. + list(SORT CMAKE_CUDA_ARCHITECTURES) + list(SORT architectures) + + 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/Compiler/GNU-ASM.cmake b/Modules/Compiler/GNU-ASM.cmake index 3daa57d..94af401 100644 --- a/Modules/Compiler/GNU-ASM.cmake +++ b/Modules/Compiler/GNU-ASM.cmake @@ -9,4 +9,5 @@ if(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_MATCH STREQUAL "GNU assembler") set(CMAKE_DEPFILE_FLAGS_ASM${ASM_DIALECT} "--MD <DEPFILE>") set(CMAKE_ASM${ASM_DIALECT}_LINK_EXECUTABLE "<CMAKE_LINKER> <FLAGS> <CMAKE_ASM${ASM_DIALECT}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>") + set(CMAKE_ASM_DEFINE_FLAG "--defsym ") endif() diff --git a/Modules/ExternalProject-gitupdate.cmake.in b/Modules/ExternalProject-gitupdate.cmake.in index e993c3c..eff39c1 100644 --- a/Modules/ExternalProject-gitupdate.cmake.in +++ b/Modules/ExternalProject-gitupdate.cmake.in @@ -59,7 +59,7 @@ if(error_code OR is_remote_ref OR NOT ("${tag_sha}" STREQUAL "${head_sha}")) message(FATAL_ERROR "Failed to fetch repository '@git_repository@'") endif() - if(is_remote_ref AND NOT "@git_update_strategy@" STREQUAL "CHECKOUT") + if(is_remote_ref) # Check if stash is needed execute_process( COMMAND "@git_EXECUTABLE@" status --porcelain @@ -72,8 +72,8 @@ if(error_code OR is_remote_ref OR NOT ("${tag_sha}" STREQUAL "${head_sha}")) endif() string(LENGTH "${repo_status}" need_stash) - # If not in clean state, stash changes in order to be able to be able to - # perform git pull --rebase + # If not in clean state, stash changes in order to be able to perform a + # rebase or checkout without losing those changes permanently if(need_stash) execute_process( COMMAND "@git_EXECUTABLE@" stash save @git_stash_save_options@ @@ -85,66 +85,77 @@ if(error_code OR is_remote_ref OR NOT ("${tag_sha}" STREQUAL "${head_sha}")) endif() endif() - # Pull changes from the remote branch - execute_process( - COMMAND "@git_EXECUTABLE@" rebase "${git_remote}/${git_tag}" - WORKING_DIRECTORY "@work_dir@" - RESULT_VARIABLE error_code - OUTPUT_VARIABLE rebase_output - ERROR_VARIABLE rebase_output - ) - if(error_code) - # Rebase failed, undo the rebase attempt before continuing + if("@git_update_strategy@" STREQUAL "CHECKOUT") execute_process( - COMMAND "@git_EXECUTABLE@" rebase --abort - WORKING_DIRECTORY "@work_dir@" - ) - - if(NOT "@git_update_strategy@" STREQUAL "REBASE_CHECKOUT") - # Not allowed to do a checkout as a fallback, so cannot proceed - if(need_stash) - execute_process( - COMMAND "@git_EXECUTABLE@" stash pop --index --quiet - WORKING_DIRECTORY "@work_dir@" - ) - endif() - message(FATAL_ERROR "\nFailed to rebase in: '@work_dir@'." - "\nOutput from the attempted rebase follows:" - "\n${rebase_output}" - "\n\nYou will have to resolve the conflicts manually") - endif() - - # Fall back to checkout. We create an annotated tag so that the user - # can manually inspect the situation and revert if required. - # We can't log the failed rebase output because MSVC sees it and - # intervenes, causing the build to fail even though it completes. - # Write it to a file instead. - string(TIMESTAMP tag_timestamp "%Y%m%dT%H%M%S" UTC) - set(tag_name _cmake_ExternalProject_moved_from_here_${tag_timestamp}Z) - set(error_log_file ${CMAKE_CURRENT_LIST_DIR}/rebase_error_${tag_timestamp}Z.log) - file(WRITE ${error_log_file} "${rebase_output}") - message(WARNING "Rebase failed, output has been saved to ${error_log_file}" - "\nFalling back to checkout, previous commit tagged as ${tag_name}") - execute_process( - COMMAND "@git_EXECUTABLE@" tag -a - -m "ExternalProject attempting to move from here to ${git_remote}/${git_tag}" - ${tag_name} + COMMAND "@git_EXECUTABLE@" checkout "${git_remote}/${git_tag}" WORKING_DIRECTORY "@work_dir@" RESULT_VARIABLE error_code - ) + ) if(error_code) - message(FATAL_ERROR "Failed to add marker tag") + message(FATAL_ERROR "Failed to checkout tag: '${git_remote}/${git_tag}'") endif() - + else() + # Pull changes from the remote branch execute_process( - COMMAND "@git_EXECUTABLE@" checkout ${git_remote}/${git_tag} + COMMAND "@git_EXECUTABLE@" rebase "${git_remote}/${git_tag}" WORKING_DIRECTORY "@work_dir@" RESULT_VARIABLE error_code - ) + OUTPUT_VARIABLE rebase_output + ERROR_VARIABLE rebase_output + ) if(error_code) - message(FATAL_ERROR "Failed to checkout : '${git_remote}/${git_tag}'") - endif() + # Rebase failed, undo the rebase attempt before continuing + execute_process( + COMMAND "@git_EXECUTABLE@" rebase --abort + WORKING_DIRECTORY "@work_dir@" + ) + + if(NOT "@git_update_strategy@" STREQUAL "REBASE_CHECKOUT") + # Not allowed to do a checkout as a fallback, so cannot proceed + if(need_stash) + execute_process( + COMMAND "@git_EXECUTABLE@" stash pop --index --quiet + WORKING_DIRECTORY "@work_dir@" + ) + endif() + message(FATAL_ERROR "\nFailed to rebase in: '@work_dir@'." + "\nOutput from the attempted rebase follows:" + "\n${rebase_output}" + "\n\nYou will have to resolve the conflicts manually") + endif() + + # Fall back to checkout. We create an annotated tag so that the user + # can manually inspect the situation and revert if required. + # We can't log the failed rebase output because MSVC sees it and + # intervenes, causing the build to fail even though it completes. + # Write it to a file instead. + string(TIMESTAMP tag_timestamp "%Y%m%dT%H%M%S" UTC) + set(tag_name _cmake_ExternalProject_moved_from_here_${tag_timestamp}Z) + set(error_log_file ${CMAKE_CURRENT_LIST_DIR}/rebase_error_${tag_timestamp}Z.log) + file(WRITE ${error_log_file} "${rebase_output}") + message(WARNING "Rebase failed, output has been saved to ${error_log_file}" + "\nFalling back to checkout, previous commit tagged as ${tag_name}") + execute_process( + COMMAND "@git_EXECUTABLE@" tag -a + -m "ExternalProject attempting to move from here to ${git_remote}/${git_tag}" + ${tag_name} + WORKING_DIRECTORY "@work_dir@" + RESULT_VARIABLE error_code + ) + if(error_code) + message(FATAL_ERROR "Failed to add marker tag") + endif() + + execute_process( + COMMAND "@git_EXECUTABLE@" checkout "${git_remote}/${git_tag}" + WORKING_DIRECTORY "@work_dir@" + RESULT_VARIABLE error_code + ) + if(error_code) + message(FATAL_ERROR "Failed to checkout : '${git_remote}/${git_tag}'") + endif() + endif() endif() if(need_stash) diff --git a/Modules/FetchContent.cmake b/Modules/FetchContent.cmake index 69f2513..e05ca96 100644 --- a/Modules/FetchContent.cmake +++ b/Modules/FetchContent.cmake @@ -930,16 +930,16 @@ ExternalProject_Add_Step(${contentName}-populate copyfile endif() if(CMAKE_GENERATOR) - set(generatorOpts "-G${CMAKE_GENERATOR}") + set(subCMakeOpts "-G${CMAKE_GENERATOR}") if(CMAKE_GENERATOR_PLATFORM) - list(APPEND generatorOpts "-A${CMAKE_GENERATOR_PLATFORM}") + list(APPEND subCMakeOpts "-A${CMAKE_GENERATOR_PLATFORM}") endif() if(CMAKE_GENERATOR_TOOLSET) - list(APPEND generatorOpts "-T${CMAKE_GENERATOR_TOOLSET}") + list(APPEND subCMakeOpts "-T${CMAKE_GENERATOR_TOOLSET}") endif() if(CMAKE_MAKE_PROGRAM) - list(APPEND generatorOpts "-DCMAKE_MAKE_PROGRAM:FILEPATH=${CMAKE_MAKE_PROGRAM}") + list(APPEND subCMakeOpts "-DCMAKE_MAKE_PROGRAM:FILEPATH=${CMAKE_MAKE_PROGRAM}") endif() else() @@ -947,7 +947,12 @@ ExternalProject_Add_Step(${contentName}-populate copyfile # generator is set (and hence CMAKE_MAKE_PROGRAM could not be # trusted even if provided). We will have to rely on being # able to find the default generator and build tool. - unset(generatorOpts) + unset(subCMakeOpts) + endif() + + if(DEFINED CMAKE_EP_GIT_REMOTE_UPDATE_STRATEGY) + list(APPEND subCMakeOpts + "-DCMAKE_EP_GIT_REMOTE_UPDATE_STRATEGY=${CMAKE_EP_GIT_REMOTE_UPDATE_STRATEGY}") endif() # Create and build a separate CMake project to carry out the population. @@ -958,7 +963,7 @@ ExternalProject_Add_Step(${contentName}-populate copyfile configure_file("${CMAKE_CURRENT_FUNCTION_LIST_DIR}/FetchContent/CMakeLists.cmake.in" "${ARG_SUBBUILD_DIR}/CMakeLists.txt") execute_process( - COMMAND ${CMAKE_COMMAND} ${generatorOpts} . + COMMAND ${CMAKE_COMMAND} ${subCMakeOpts} . RESULT_VARIABLE result ${outputOptions} WORKING_DIRECTORY "${ARG_SUBBUILD_DIR}" diff --git a/Modules/Platform/Darwin.cmake b/Modules/Platform/Darwin.cmake index 0a4d4e1..c6de3b0 100644 --- a/Modules/Platform/Darwin.cmake +++ b/Modules/Platform/Darwin.cmake @@ -42,6 +42,7 @@ endif() set(CMAKE_SHARED_LIBRARY_PREFIX "lib") set(CMAKE_SHARED_LIBRARY_SUFFIX ".dylib") +set(CMAKE_EXTRA_SHARED_LIBRARY_SUFFIXES ".tbd" ".so") set(CMAKE_SHARED_MODULE_PREFIX "lib") set(CMAKE_SHARED_MODULE_SUFFIX ".so") set(CMAKE_MODULE_EXISTS 1) @@ -156,6 +157,13 @@ if(_CMAKE_OSX_SYSROOT_PATH) break() endif() endforeach() + + if(EXISTS ${_CMAKE_OSX_SYSROOT_PATH}/usr/lib) + list(INSERT CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES 0 ${_CMAKE_OSX_SYSROOT_PATH}/usr/lib) + endif() + if(EXISTS ${_CMAKE_OSX_SYSROOT_PATH}/usr/local/lib) + list(INSERT CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES 0 ${_CMAKE_OSX_SYSROOT_PATH}/usr/local/lib) + endif() endif() if (OSX_DEVELOPER_ROOT AND EXISTS "${OSX_DEVELOPER_ROOT}/Library/Frameworks") list(APPEND CMAKE_SYSTEM_FRAMEWORK_PATH @@ -208,11 +216,19 @@ set(CMAKE_SYSTEM_APPBUNDLE_PATH unset(_apps_paths) include(Platform/UnixPaths) -if(_CMAKE_OSX_SYSROOT_PATH AND EXISTS ${_CMAKE_OSX_SYSROOT_PATH}/usr/include) - list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${_CMAKE_OSX_SYSROOT_PATH}/usr) - foreach(lang C CXX OBJC OBJCXX Swift) - list(APPEND _CMAKE_${lang}_IMPLICIT_INCLUDE_DIRECTORIES_INIT ${_CMAKE_OSX_SYSROOT_PATH}/usr/include) - endforeach() +if(_CMAKE_OSX_SYSROOT_PATH) + if(EXISTS ${_CMAKE_OSX_SYSROOT_PATH}/usr/include) + list(INSERT CMAKE_SYSTEM_PREFIX_PATH 0 ${_CMAKE_OSX_SYSROOT_PATH}/usr) + foreach(lang C CXX OBJC OBJCXX Swift) + list(APPEND _CMAKE_${lang}_IMPLICIT_INCLUDE_DIRECTORIES_INIT ${_CMAKE_OSX_SYSROOT_PATH}/usr/include) + endforeach() + endif() + if(EXISTS ${_CMAKE_OSX_SYSROOT_PATH}/usr/local/include) + list(INSERT CMAKE_SYSTEM_PREFIX_PATH 0 ${_CMAKE_OSX_SYSROOT_PATH}/usr/local) + foreach(lang C CXX OBJC OBJCXX Swift) + list(APPEND _CMAKE_${lang}_IMPLICIT_INCLUDE_DIRECTORIES_INIT ${_CMAKE_OSX_SYSROOT_PATH}/usr/local/include) + endforeach() + endif() endif() list(APPEND CMAKE_SYSTEM_PREFIX_PATH /sw # Fink diff --git a/Modules/UseSWIG.cmake b/Modules/UseSWIG.cmake index f6a20f8..a60e05e 100644 --- a/Modules/UseSWIG.cmake +++ b/Modules/UseSWIG.cmake @@ -41,6 +41,14 @@ Defines the following command for use with ``SWIG``: configuration-specific files generated by ``SWIG``. All build configurations must result in the same generated source file. + .. note:: + + For Make-based generators, ``swig_add_library`` does not track file + dependencies, so depending on the ``<name>_swig_compilation`` custom target + is required for targets which require the ``swig``-generated files to + exist. Other generators may depend on the source files that would be + generated by SWIG. + ``TYPE`` ``SHARED``, ``MODULE`` and ``STATIC`` have the same semantic as for the :command:`add_library` command. If ``USE_BUILD_SHARED_LIBS`` is specified, diff --git a/Source/CMakeVersion.cmake b/Source/CMakeVersion.cmake index 687332e..9eaf22c 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 20200530) +set(CMake_VERSION_PATCH 20200602) #set(CMake_VERSION_RC 0) set(CMake_VERSION_IS_DIRTY 0) diff --git a/Source/CPack/cmCPackGenerator.cxx b/Source/CPack/cmCPackGenerator.cxx index 08fd2a2..288dc58 100644 --- a/Source/CPack/cmCPackGenerator.cxx +++ b/Source/CPack/cmCPackGenerator.cxx @@ -921,11 +921,11 @@ int cmCPackGenerator::InstallCMakeProject( } } - if (nullptr != mf.GetDefinition("CPACK_ABSOLUTE_DESTINATION_FILES")) { + if (auto d = mf.GetDefinition("CPACK_ABSOLUTE_DESTINATION_FILES")) { if (!absoluteDestFiles.empty()) { absoluteDestFiles += ";"; } - absoluteDestFiles += mf.GetDefinition("CPACK_ABSOLUTE_DESTINATION_FILES"); + absoluteDestFiles += d; cmCPackLogger(cmCPackLog::LOG_DEBUG, "Got some ABSOLUTE DESTINATION FILES: " << absoluteDestFiles << std::endl); @@ -936,8 +936,7 @@ int cmCPackGenerator::InstallCMakeProject( GetComponentInstallDirNameSuffix(component); if (nullptr != this->GetOption(absoluteDestFileComponent)) { std::string absoluteDestFilesListComponent = - cmStrCat(this->GetOption(absoluteDestFileComponent), ';', - mf.GetDefinition("CPACK_ABSOLUTE_DESTINATION_FILES")); + cmStrCat(this->GetOption(absoluteDestFileComponent), ';', d); this->SetOption(absoluteDestFileComponent, absoluteDestFilesListComponent.c_str()); } else { diff --git a/Source/CTest/cmCTestCoverageHandler.cxx b/Source/CTest/cmCTestCoverageHandler.cxx index daa10c9..b839c10 100644 --- a/Source/CTest/cmCTestCoverageHandler.cxx +++ b/Source/CTest/cmCTestCoverageHandler.cxx @@ -1215,8 +1215,6 @@ int cmCTestCoverageHandler::HandleGCovCoverage( while (cmSystemTools::GetLineFromStream(ifile, nl)) { cnt++; - // TODO: Handle gcov 3.0 non-coverage lines - // Skip empty lines if (nl.empty()) { continue; @@ -1227,6 +1225,14 @@ int cmCTestCoverageHandler::HandleGCovCoverage( continue; } + // Handle gcov 3.0 non-coverage lines + // non-coverage lines seem to always start with something not + // a space and don't have a ':' in the 9th position + // TODO: Verify that this is actually a robust metric + if (nl[0] != ' ' && nl[9] != ':') { + continue; + } + // Read the coverage count from the beginning of the gcov output // line std::string prefix = nl.substr(0, 12); diff --git a/Source/cmForEachCommand.cxx b/Source/cmForEachCommand.cxx index 32e7892..3b82e0a 100644 --- a/Source/cmForEachCommand.cxx +++ b/Source/cmForEachCommand.cxx @@ -113,8 +113,8 @@ bool cmForEachFunctionBlocker::ReplayItems( // At end of for each execute recorded commands // store the old value std::string oldDef; - if (mf.GetDefinition(this->Args.front())) { - oldDef = mf.GetDefinition(this->Args.front()); + if (auto d = mf.GetDefinition(this->Args.front())) { + oldDef = d; } auto restore = false; @@ -186,8 +186,8 @@ bool cmForEachFunctionBlocker::ReplayZipLists( // Store old values for iteration variables std::map<std::string, std::string> oldDefs; for (auto i = 0u; i < values.size(); ++i) { - if (mf.GetDefinition(iterationVars[i])) { - oldDefs.emplace(iterationVars[i], mf.GetDefinition(iterationVars[i])); + if (auto d = mf.GetDefinition(iterationVars[i])) { + oldDefs.emplace(iterationVars[i], d); } } diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index f2a51ab..dcdaaea 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -2651,7 +2651,8 @@ void cmGeneratorTarget::ComputeModuleDefinitionInfo( info.DefFileGenerated = false; #endif if (info.DefFileGenerated) { - info.DefFile = this->ObjectDirectory /* has slash */ + "exports.def"; + info.DefFile = + this->GetObjectDirectory(config) /* has slash */ + "exports.def"; } else if (!info.Sources.empty()) { info.DefFile = info.Sources.front()->GetFullPath(); } @@ -3858,8 +3859,6 @@ std::string cmGeneratorTarget::GetPchFileObject(const std::string& config, } std::string& filename = inserted.first->second; - this->AddSource(pchSource, true); - auto pchSf = this->Makefile->GetOrCreateSource( pchSource, false, cmSourceFileLocationKind::Known); @@ -7031,6 +7030,13 @@ void cmGeneratorTarget::ComputeLinkImplementationLibraries( // Skip entries that resolve to the target itself or are empty. std::string name = this->CheckCMP0004(lib); + if (this->GetPolicyStatusCMP0108() == cmPolicies::NEW) { + // resolve alias name + auto target = this->Makefile->FindTargetToUse(name); + if (target) { + name = target->GetName(); + } + } if (name == this->GetName() || name.empty()) { if (name == this->GetName()) { bool noMessage = false; diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index d019648..68e25fb 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -1618,7 +1618,23 @@ bool cmGlobalGenerator::AddAutomaticSources() continue; } lg->AddUnityBuild(gt.get()); - lg->AddPchDependencies(gt.get()); + // Targets that re-use a PCH are handled below. + if (!gt->GetProperty("PRECOMPILE_HEADERS_REUSE_FROM")) { + lg->AddPchDependencies(gt.get()); + } + } + } + for (const auto& lg : this->LocalGenerators) { + for (const auto& gt : lg->GetGeneratorTargets()) { + if (gt->GetType() == cmStateEnums::INTERFACE_LIBRARY || + gt->GetType() == cmStateEnums::UTILITY || + gt->GetType() == cmStateEnums::GLOBAL_TARGET) { + continue; + } + // Handle targets that re-use a PCH from an above-handled target. + if (gt->GetProperty("PRECOMPILE_HEADERS_REUSE_FROM")) { + lg->AddPchDependencies(gt.get()); + } } } // The above transformations may have changed the classification of sources. diff --git a/Source/cmNinjaNormalTargetGenerator.cxx b/Source/cmNinjaNormalTargetGenerator.cxx index a283227..8f47010 100644 --- a/Source/cmNinjaNormalTargetGenerator.cxx +++ b/Source/cmNinjaNormalTargetGenerator.cxx @@ -1028,8 +1028,8 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement( gt->GetFullNameComponents(prefix, base, suffix, config); std::string dbg_suffix = ".dbg"; // TODO: Where to document? - if (mf->GetDefinition("CMAKE_DEBUG_SYMBOL_SUFFIX")) { - dbg_suffix = mf->GetDefinition("CMAKE_DEBUG_SYMBOL_SUFFIX"); + if (auto d = mf->GetDefinition("CMAKE_DEBUG_SYMBOL_SUFFIX")) { + dbg_suffix = d; } vars["TARGET_PDB"] = base + suffix + dbg_suffix; } diff --git a/Source/cmNinjaTargetGenerator.cxx b/Source/cmNinjaTargetGenerator.cxx index 5435183..d406c99 100644 --- a/Source/cmNinjaTargetGenerator.cxx +++ b/Source/cmNinjaTargetGenerator.cxx @@ -750,9 +750,9 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang, if (!mf->GetIsSourceFileTryCompile()) { rule.DepType = "gcc"; rule.DepFile = "$DEP_FILE"; - const std::string cl = mf->GetDefinition("CMAKE_C_COMPILER") - ? mf->GetSafeDefinition("CMAKE_C_COMPILER") - : mf->GetSafeDefinition("CMAKE_CXX_COMPILER"); + auto d = mf->GetDefinition("CMAKE_C_COMPILER"); + const std::string cl = + d ? d : mf->GetSafeDefinition("CMAKE_CXX_COMPILER"); cldeps = cmStrCat('"', cmSystemTools::GetCMClDepsCommand(), "\" ", lang, ' ', vars.Source, " $DEP_FILE $out \"", mf->GetSafeDefinition("CMAKE_CL_SHOWINCLUDES_PREFIX"), diff --git a/Source/cmPolicies.h b/Source/cmPolicies.h index 4dff1d8..a82f421 100644 --- a/Source/cmPolicies.h +++ b/Source/cmPolicies.h @@ -318,6 +318,8 @@ class cmMakefile; SELECT(POLICY, CMP0106, "The Documentation module is removed.", 3, 18, 0, \ cmPolicies::WARN) \ SELECT(POLICY, CMP0107, "An ALIAS target cannot overwrite another target.", \ + 3, 18, 0, cmPolicies::WARN) \ + SELECT(POLICY, CMP0108, "A target cannot link to itself through an alias.", \ 3, 18, 0, cmPolicies::WARN) #define CM_SELECT_ID(F, A1, A2, A3, A4, A5, A6) F(A1) @@ -350,7 +352,8 @@ class cmMakefile; F(CMP0095) \ F(CMP0099) \ F(CMP0104) \ - F(CMP0105) + F(CMP0105) \ + F(CMP0108) /** \class cmPolicies * \brief Handles changes in CMake behavior and policies diff --git a/Source/cmUtilitySourceCommand.cxx b/Source/cmUtilitySourceCommand.cxx index 5865a19..6de78ff 100644 --- a/Source/cmUtilitySourceCommand.cxx +++ b/Source/cmUtilitySourceCommand.cxx @@ -84,8 +84,8 @@ bool cmUtilitySourceCommand(std::vector<std::string> const& args, std::string utilityDirectory = status.GetMakefile().GetCurrentBinaryDirectory(); std::string exePath; - if (status.GetMakefile().GetDefinition("EXECUTABLE_OUTPUT_PATH")) { - exePath = status.GetMakefile().GetDefinition("EXECUTABLE_OUTPUT_PATH"); + if (auto d = status.GetMakefile().GetDefinition("EXECUTABLE_OUTPUT_PATH")) { + exePath = d; } if (!exePath.empty()) { utilityDirectory = exePath; diff --git a/Tests/ExternalProjectUpdate/ExternalProjectUpdateTest.cmake b/Tests/ExternalProjectUpdate/ExternalProjectUpdateTest.cmake index ba0c598..ddc513f 100644 --- a/Tests/ExternalProjectUpdate/ExternalProjectUpdateTest.cmake +++ b/Tests/ExternalProjectUpdate/ExternalProjectUpdateTest.cmake @@ -199,8 +199,14 @@ if(do_git_tests) foreach(strategy IN ITEMS CHECKOUT REBASE_CHECKOUT) # Move local master back, then apply a change that will cause a conflict - # during rebase. We want to test the fallback to checkout. - check_a_tag(master 5842b503ba4113976d9bb28d57b5aee1ad2736b7 1 REBASE) + # during rebase + execute_process(COMMAND ${GIT_EXECUTABLE} checkout master + WORKING_DIRECTORY ${ExternalProjectUpdate_BINARY_DIR}/CMakeExternals/Source/TutorialStep1-GIT + RESULT_VARIABLE error_code + ) + if(error_code) + message(FATAL_ERROR "Could not reset local master back to tag1.") + endif() execute_process(COMMAND ${GIT_EXECUTABLE} reset --hard tag1 WORKING_DIRECTORY ${ExternalProjectUpdate_BINARY_DIR}/CMakeExternals/Source/TutorialStep1-GIT RESULT_VARIABLE error_code @@ -208,6 +214,7 @@ if(do_git_tests) if(error_code) message(FATAL_ERROR "Could not reset local master back to tag1.") endif() + set(cmlFile ${ExternalProjectUpdate_BINARY_DIR}/CMakeExternals/Source/TutorialStep1-GIT/CMakeLists.txt) file(READ ${cmlFile} contents) string(REPLACE "find TutorialConfig.h" "find TutorialConfig.h (conflict here)" @@ -222,7 +229,7 @@ if(do_git_tests) message(FATAL_ERROR "Could not commit conflicting change.") endif() # This should discard our commit but leave behind an annotated tag - check_a_tag(master 5842b503ba4113976d9bb28d57b5aee1ad2736b7 1 ${strategy}) + check_a_tag(origin/master 5842b503ba4113976d9bb28d57b5aee1ad2736b7 1 ${strategy}) endforeach() endif() diff --git a/Tests/RunCMake/BuildDepends/GNU-AS.cmake b/Tests/RunCMake/BuildDepends/GNU-AS.cmake index 21921ef..0c7249a 100644 --- a/Tests/RunCMake/BuildDepends/GNU-AS.cmake +++ b/Tests/RunCMake/BuildDepends/GNU-AS.cmake @@ -5,6 +5,7 @@ message(STATUS "CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_MATCH='${CMAKE_ASM${A add_library(gnu_as STATIC gnu_as.s) target_include_directories(gnu_as PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) +target_compile_definitions(gnu_as PRIVATE "TEST_DEF=Hello") file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/check-$<LOWER_CASE:$<CONFIG>>.cmake CONTENT " set(check_pairs diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index 868eb24..65d5e44 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -356,6 +356,7 @@ function(add_RunCMake_test_try_compile) CMAKE_CXX_COMPILER_VERSION CMAKE_CXX_STANDARD_DEFAULT CMake_TEST_CUDA + CMake_TEST_FILESYSTEM_1S CMAKE_OBJC_STANDARD_DEFAULT CMAKE_OBJCXX_STANDARD_DEFAULT ) diff --git a/Tests/RunCMake/NinjaMultiConfig/Simple.cmake b/Tests/RunCMake/NinjaMultiConfig/Simple.cmake index a32f551..3f4ecbe 100644 --- a/Tests/RunCMake/NinjaMultiConfig/Simple.cmake +++ b/Tests/RunCMake/NinjaMultiConfig/Simple.cmake @@ -1,5 +1,7 @@ enable_language(C) +set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) + file(TOUCH ${CMAKE_BINARY_DIR}/empty.cmake) include(${CMAKE_BINARY_DIR}/empty.cmake) diff --git a/Tests/RunCMake/PrecompileHeaders/PchReuseFrom.cmake b/Tests/RunCMake/PrecompileHeaders/PchReuseFrom.cmake index 03a97ed..f8fba44 100644 --- a/Tests/RunCMake/PrecompileHeaders/PchReuseFrom.cmake +++ b/Tests/RunCMake/PrecompileHeaders/PchReuseFrom.cmake @@ -5,6 +5,11 @@ if(CMAKE_C_COMPILE_OPTIONS_USE_PCH) add_definitions(-DHAVE_PCH_SUPPORT) endif() +# Add this before the target from which we will reuse the PCH +# to test that generators can handle reversed ordering. +add_library(foo foo.c) +target_include_directories(foo PUBLIC include) + add_library(empty empty.c) target_precompile_headers(empty PRIVATE <stdio.h> @@ -12,8 +17,6 @@ target_precompile_headers(empty PRIVATE ) target_include_directories(empty PUBLIC include) -add_library(foo foo.c) -target_include_directories(foo PUBLIC include) target_precompile_headers(foo REUSE_FROM empty) # should not cause problems if configured multiple times diff --git a/Tests/RunCMake/TargetPolicies/PolicyList-stderr.txt b/Tests/RunCMake/TargetPolicies/PolicyList-stderr.txt index 2d270c5..2454f25 100644 --- a/Tests/RunCMake/TargetPolicies/PolicyList-stderr.txt +++ b/Tests/RunCMake/TargetPolicies/PolicyList-stderr.txt @@ -31,6 +31,7 @@ \* CMP0099 \* CMP0104 \* CMP0105 + \* CMP0108 Call Stack \(most recent call first\): CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/target_link_libraries/CMP0108-NEW-self-link-result.txt b/Tests/RunCMake/target_link_libraries/CMP0108-NEW-self-link-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/target_link_libraries/CMP0108-NEW-self-link-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/target_link_libraries/CMP0108-NEW-self-link-stderr.txt b/Tests/RunCMake/target_link_libraries/CMP0108-NEW-self-link-stderr.txt new file mode 100644 index 0000000..7389eff --- /dev/null +++ b/Tests/RunCMake/target_link_libraries/CMP0108-NEW-self-link-stderr.txt @@ -0,0 +1,5 @@ +CMake Error at CMP0108-self-link.cmake:[0-9]+ \(add_library\): + Target "foo" links to itself. +Call Stack \(most recent call first\): + CMP0108-NEW-self-link.cmake:[0-9]+ \(include\) + CMakeLists.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/target_link_libraries/CMP0108-NEW-self-link.cmake b/Tests/RunCMake/target_link_libraries/CMP0108-NEW-self-link.cmake new file mode 100644 index 0000000..4ee9621 --- /dev/null +++ b/Tests/RunCMake/target_link_libraries/CMP0108-NEW-self-link.cmake @@ -0,0 +1,4 @@ + +cmake_policy (SET CMP0108 NEW) + +include (CMP0108-self-link.cmake) diff --git a/Tests/RunCMake/target_link_libraries/CMP0108-OLD-self-link.cmake b/Tests/RunCMake/target_link_libraries/CMP0108-OLD-self-link.cmake new file mode 100644 index 0000000..813104a --- /dev/null +++ b/Tests/RunCMake/target_link_libraries/CMP0108-OLD-self-link.cmake @@ -0,0 +1,4 @@ + +cmake_policy (SET CMP0108 OLD) + +include (CMP0108-self-link.cmake) diff --git a/Tests/RunCMake/target_link_libraries/CMP0108-self-link.cmake b/Tests/RunCMake/target_link_libraries/CMP0108-self-link.cmake new file mode 100644 index 0000000..07a3490 --- /dev/null +++ b/Tests/RunCMake/target_link_libraries/CMP0108-self-link.cmake @@ -0,0 +1,9 @@ + +cmake_policy (SET CMP0038 NEW) +cmake_policy (SET CMP0042 NEW) + +enable_language(C) + +add_library(foo SHARED lib.c) +add_library(Bar::foo ALIAS foo) +target_link_libraries(foo PRIVATE Bar::foo) diff --git a/Tests/RunCMake/target_link_libraries/RunCMakeTest.cmake b/Tests/RunCMake/target_link_libraries/RunCMakeTest.cmake index fb223ab..dfa71dd 100644 --- a/Tests/RunCMake/target_link_libraries/RunCMakeTest.cmake +++ b/Tests/RunCMake/target_link_libraries/RunCMakeTest.cmake @@ -19,6 +19,8 @@ run_cmake(CMP0079-link-WARN) run_cmake(CMP0079-link-OLD) run_cmake(CMP0079-link-NEW) run_cmake(CMP0079-link-NEW-bogus) +run_cmake(CMP0108-OLD-self-link) +run_cmake(CMP0108-NEW-self-link) run_cmake(ImportedTarget) run_cmake(ImportedTargetFailure) run_cmake(MixedSignature) diff --git a/Tests/RunCMake/try_compile/RunCMakeTest.cmake b/Tests/RunCMake/try_compile/RunCMakeTest.cmake index bee9e5b..82c55cc 100644 --- a/Tests/RunCMake/try_compile/RunCMakeTest.cmake +++ b/Tests/RunCMake/try_compile/RunCMakeTest.cmake @@ -83,13 +83,17 @@ if(RunCMake_GENERATOR MATCHES "Make|Ninja") message(STATUS "RerunCMake: first configuration...") run_cmake(RerunCMake) - run_cmake_command(RerunCMake-nowork${ninja} ${CMAKE_COMMAND} --build .) + if(NOT CMake_TEST_FILESYSTEM_1S) + run_cmake_command(RerunCMake-nowork${ninja} ${CMAKE_COMMAND} --build .) + endif() execute_process(COMMAND ${CMAKE_COMMAND} -E sleep 1) # handle 1s resolution message(STATUS "RerunCMake: modify try_compile input...") file(WRITE "${in_tc}" "does-not-compile\n") run_cmake_command(RerunCMake-rerun${ninja} ${CMAKE_COMMAND} --build .) - run_cmake_command(RerunCMake-nowork${ninja} ${CMAKE_COMMAND} --build .) + if(NOT CMake_TEST_FILESYSTEM_1S) + run_cmake_command(RerunCMake-nowork${ninja} ${CMAKE_COMMAND} --build .) + endif() unset(RunCMake_TEST_BINARY_DIR) unset(RunCMake_TEST_NO_CLEAN) |