diff options
62 files changed, 485 insertions, 206 deletions
diff --git a/Help/manual/cmake-server.7.rst b/Help/manual/cmake-server.7.rst index 25d364c..b4c1436 100644 --- a/Help/manual/cmake-server.7.rst +++ b/Help/manual/cmake-server.7.rst @@ -308,6 +308,9 @@ which will result in a response type "reply":: indicating that the server is ready for action. +Protocol version 1.3 introduces an optional flag on the target filegroup +that indicates if the filegroup represents :prop_tgt:`INTERFACE_SOURCES`. + Type "globalSettings" ^^^^^^^^^^^^^^^^^^^^^ @@ -524,6 +527,8 @@ FileGroups are used to group sources using similar settings together. Each fileGroup object may contain the following keys: +"isInterfaceSources" + true if the fileGroup represents :prop_tgt:`INTERFACE_SOURCES`. "language" contains the programming language used by all files in the group. "compileFlags" @@ -538,6 +543,8 @@ Each fileGroup object may contain the following keys: "defines" with a list of defines in the form "SOMEVALUE" or "SOMEVALUE=42". This value is encoded in the system's native shell format. +"isGenerated" + true if the files were generated. "sources" with a list of source files. diff --git a/Help/release/dev/FindSubversion-wc-info-error.rst b/Help/release/dev/FindSubversion-wc-info-error.rst new file mode 100644 index 0000000..eaf6bfe --- /dev/null +++ b/Help/release/dev/FindSubversion-wc-info-error.rst @@ -0,0 +1,6 @@ +FindSubversion-wc-info-error +---------------------------- + +* The :module:`FindSubversion` module ``Subversion_WC_INFO`` command + gained an ``IGNORE_SVN_FAILURE`` option to suppress failures, + e.g. when the source tree is not under Subversion control. diff --git a/Modules/CMakeExtraGeneratorDetermineCompilerMacrosAndIncludeDirs.cmake b/Modules/CMakeExtraGeneratorDetermineCompilerMacrosAndIncludeDirs.cmake index 55e0373..11f4a29 100644 --- a/Modules/CMakeExtraGeneratorDetermineCompilerMacrosAndIncludeDirs.cmake +++ b/Modules/CMakeExtraGeneratorDetermineCompilerMacrosAndIncludeDirs.cmake @@ -27,6 +27,7 @@ macro(_DETERMINE_GCC_SYSTEM_INCLUDE_DIRS _lang _resultIncludeDirs _resultDefines set(_compilerExecutable "${CMAKE_C_COMPILER}") set(_arg1 "${CMAKE_C_COMPILER_ARG1}") endif () + separate_arguments(_arg1 NATIVE_COMMAND "${_arg1}") execute_process(COMMAND ${_compilerExecutable} ${_arg1} ${_stdver} ${_stdlib} -v -E -x ${_lang} -dD dummy WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/CMakeFiles ERROR_VARIABLE _gccOutput diff --git a/Modules/CMakeFindBinUtils.cmake b/Modules/CMakeFindBinUtils.cmake index 1b6823c..830639d 100644 --- a/Modules/CMakeFindBinUtils.cmake +++ b/Modules/CMakeFindBinUtils.cmake @@ -38,6 +38,8 @@ if(CMAKE_LINKER) endif() endif() +set(_CMAKE_TOOL_VARS "") + # if it's the MS C/CXX compiler, search for link if("x${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_SIMULATE_ID}" STREQUAL "xMSVC" OR "x${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_ID}" STREQUAL "xMSVC" @@ -47,7 +49,7 @@ if("x${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_SIMULATE_ID}" STREQUAL "xMSVC" find_program(CMAKE_LINKER NAMES link HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) - mark_as_advanced(CMAKE_LINKER) + list(APPEND _CMAKE_TOOL_VARS CMAKE_LINKER) # in all other cases search for ar, ranlib, etc. else() @@ -70,7 +72,7 @@ else() find_program(CMAKE_OBJDUMP NAMES ${_CMAKE_TOOLCHAIN_PREFIX}objdump HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) find_program(CMAKE_OBJCOPY NAMES ${_CMAKE_TOOLCHAIN_PREFIX}objcopy HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) - mark_as_advanced(CMAKE_AR CMAKE_RANLIB CMAKE_STRIP CMAKE_LINKER CMAKE_NM CMAKE_OBJDUMP CMAKE_OBJCOPY) + list(APPEND _CMAKE_TOOL_VARS CMAKE_AR CMAKE_RANLIB CMAKE_STRIP CMAKE_LINKER CMAKE_NM CMAKE_OBJDUMP CMAKE_OBJCOPY) endif() @@ -81,5 +83,15 @@ if(CMAKE_PLATFORM_HAS_INSTALLNAME) message(FATAL_ERROR "Could not find install_name_tool, please check your installation.") endif() - mark_as_advanced(CMAKE_INSTALL_NAME_TOOL) + list(APPEND _CMAKE_TOOL_VARS CMAKE_INSTALL_NAME_TOOL) endif() + +# Mark any tool cache entries as advanced. +foreach(var IN LISTS _CMAKE_TOOL_VARS) + get_property(_CMAKE_TOOL_CACHED CACHE ${var} PROPERTY TYPE) + if(_CMAKE_TOOL_CACHED) + mark_as_advanced(${var}) + endif() +endforeach() +unset(_CMAKE_TOOL_VARS) +unset(_CMAKE_TOOL_CACHED) diff --git a/Modules/ExternalProject.cmake b/Modules/ExternalProject.cmake index 0c5b33f..f987d2d 100644 --- a/Modules/ExternalProject.cmake +++ b/Modules/ExternalProject.cmake @@ -934,6 +934,11 @@ function(_ep_parse_arguments f name ns args) # We loop through ARGN and consider the namespace starting with an # upper-case letter followed by at least two more upper-case letters, # numbers or underscores to be keywords. + + if(NOT DEFINED _ExternalProject_SELF) + message(FATAL_ERROR "error: ExternalProject module must be explicitly included before using ${f} function") + endif() + set(key) foreach(arg IN LISTS args) diff --git a/Modules/FindBoost.cmake b/Modules/FindBoost.cmake index c14e402..f65a493 100644 --- a/Modules/FindBoost.cmake +++ b/Modules/FindBoost.cmake @@ -881,7 +881,11 @@ function(_Boost_COMPONENT_HEADERS component _hdrs) set(_Boost_CHRONO_HEADERS "boost/chrono.hpp") set(_Boost_CONTAINER_HEADERS "boost/container/container_fwd.hpp") set(_Boost_CONTRACT_HEADERS "boost/contract.hpp") - set(_Boost_CONTEXT_HEADERS "boost/context/detail/fcontext.hpp") + if(Boost_VERSION VERSION_LESS 106100) + set(_Boost_CONTEXT_HEADERS "boost/context/all.hpp") + else() + set(_Boost_CONTEXT_HEADERS "boost/context/detail/fcontext.hpp") + endif() set(_Boost_COROUTINE_HEADERS "boost/coroutine/all.hpp") set(_Boost_DATE_TIME_HEADERS "boost/date_time/date.hpp") set(_Boost_EXCEPTION_HEADERS "boost/exception/exception.hpp") diff --git a/Modules/FindMatlab.cmake b/Modules/FindMatlab.cmake index f2ada3b..12a2f75 100644 --- a/Modules/FindMatlab.cmake +++ b/Modules/FindMatlab.cmake @@ -1224,21 +1224,6 @@ function(_Matlab_find_instances_win32 matlab_roots) # filtering the results with the registry keys matlab_get_all_valid_matlab_roots_from_registry("${_matlab_versions_from_registry}" _matlab_possible_roots) - unset(_matlab_versions_from_registry) - - set(_matlab_versions_from_registry) - matlab_extract_all_installed_versions_from_registry(CMAKE_CL_64 _matlab_versions_from_registry) - - # the returned list is empty, doing the search on all known versions - if(NOT _matlab_versions_from_registry) - if(MATLAB_FIND_DEBUG) - message(STATUS "[MATLAB] Search for Matlab from the registry unsuccessful, testing all supported versions") - endif() - extract_matlab_versions_from_registry_brute_force(_matlab_versions_from_registry) - endif() - - # filtering the results with the registry keys - matlab_get_all_valid_matlab_roots_from_registry("${_matlab_versions_from_registry}" _matlab_possible_roots) set(${matlab_roots} ${_matlab_possible_roots} PARENT_SCOPE) endfunction() diff --git a/Modules/FindSubversion.cmake b/Modules/FindSubversion.cmake index 537d3b2..e18ae88 100644 --- a/Modules/FindSubversion.cmake +++ b/Modules/FindSubversion.cmake @@ -19,17 +19,21 @@ # # # The minimum required version of Subversion can be specified using the -# standard syntax, e.g. find_package(Subversion 1.4) +# standard syntax, e.g. ``find_package(Subversion 1.4)``. # # If the command line client executable is found two macros are defined: # # :: # -# Subversion_WC_INFO(<dir> <var-prefix>) +# Subversion_WC_INFO(<dir> <var-prefix> [IGNORE_SVN_FAILURE]) # Subversion_WC_LOG(<dir> <var-prefix>) # -# Subversion_WC_INFO extracts information of a subversion working copy -# at a given location. This macro defines the following variables: +# ``Subversion_WC_INFO`` extracts information of a subversion working copy at a +# given location. This macro defines the following variables if running +# Subversion's ``info`` command on ``<dir>`` succeeds; otherwise a +# ``SEND_ERROR`` message is generated. The error can be ignored by providing the +# ``IGNORE_SVN_FAILURE`` option, which causes these variables to remain +# undefined. # # :: # @@ -41,9 +45,8 @@ # <var-prefix>_WC_LAST_CHANGED_REV - revision of last commit # <var-prefix>_WC_INFO - output of command `svn info <dir>' # -# Subversion_WC_LOG retrieves the log message of the base revision of a -# subversion working copy at a given location. This macro defines the -# variable: +# ``Subversion_WC_LOG`` retrieves the log message of the base revision of a +# subversion working copy at a given location. This macro defines the variable: # # :: # @@ -84,6 +87,14 @@ if(Subversion_SVN_EXECUTABLE) "\\2" Subversion_VERSION_SVN "${Subversion_VERSION_SVN}") macro(Subversion_WC_INFO dir prefix) + + cmake_parse_arguments( + "Subversion_WC_INFO" + "IGNORE_SVN_FAILURE" + "" "" + ${ARGN} + ) + # the subversion commands should be executed with the C locale, otherwise # the message (which are parsed) may be translated, Alex set(_Subversion_SAVED_LC_ALL "$ENV{LC_ALL}") @@ -95,10 +106,7 @@ if(Subversion_SVN_EXECUTABLE) RESULT_VARIABLE Subversion_svn_info_result OUTPUT_STRIP_TRAILING_WHITESPACE) - if(NOT ${Subversion_svn_info_result} EQUAL 0) - message(SEND_ERROR "Command \"${Subversion_SVN_EXECUTABLE} info ${dir}\" failed with output:\n${Subversion_svn_info_error}") - else() - + if(${Subversion_svn_info_result} EQUAL 0) string(REGEX REPLACE "^(.*\n)?URL: ([^\n]+).*" "\\2" ${prefix}_WC_URL "${${prefix}_WC_INFO}") string(REGEX REPLACE "^(.*\n)?Repository Root: ([^\n]+).*" @@ -111,7 +119,8 @@ if(Subversion_SVN_EXECUTABLE) "\\2" ${prefix}_WC_LAST_CHANGED_REV "${${prefix}_WC_INFO}") string(REGEX REPLACE "^(.*\n)?Last Changed Date: ([^\n]+).*" "\\2" ${prefix}_WC_LAST_CHANGED_DATE "${${prefix}_WC_INFO}") - + elseif(NOT Subversion_WC_INFO_IGNORE_SVN_FAILURE) + message(SEND_ERROR "Command \"${Subversion_SVN_EXECUTABLE} info ${dir}\" failed with output:\n${Subversion_svn_info_error}") endif() # restore the previous LC_ALL diff --git a/Source/CMakeVersion.cmake b/Source/CMakeVersion.cmake index fd184cd..83b75fb 100644 --- a/Source/CMakeVersion.cmake +++ b/Source/CMakeVersion.cmake @@ -1,5 +1,5 @@ # CMake version number components. set(CMake_VERSION_MAJOR 3) set(CMake_VERSION_MINOR 12) -set(CMake_VERSION_PATCH 20180903) +set(CMake_VERSION_PATCH 20180910) #set(CMake_VERSION_RC 1) diff --git a/Source/CTest/cmCTestBuildHandler.cxx b/Source/CTest/cmCTestBuildHandler.cxx index c5941ce..a8309d9 100644 --- a/Source/CTest/cmCTestBuildHandler.cxx +++ b/Source/CTest/cmCTestBuildHandler.cxx @@ -327,7 +327,7 @@ int cmCTestBuildHandler::ProcessHandler() std::string const& useLaunchers = this->CTest->GetCTestConfiguration("UseLaunchers"); - this->UseCTestLaunch = cmSystemTools::IsOn(useLaunchers.c_str()); + this->UseCTestLaunch = cmSystemTools::IsOn(useLaunchers); // Create a last build log cmGeneratedFileStream ofs; diff --git a/Source/CTest/cmCTestGIT.cxx b/Source/CTest/cmCTestGIT.cxx index b919c79..71fcafb 100644 --- a/Source/CTest/cmCTestGIT.cxx +++ b/Source/CTest/cmCTestGIT.cxx @@ -272,7 +272,7 @@ bool cmCTestGIT::UpdateImpl() std::string init_submodules = this->CTest->GetCTestConfiguration("GITInitSubmodules"); - if (cmSystemTools::IsOn(init_submodules.c_str())) { + if (cmSystemTools::IsOn(init_submodules)) { char const* git_submodule_init[] = { git, "submodule", "init", nullptr }; ret = this->RunChild(git_submodule_init, &submodule_out, &submodule_err, top_dir.c_str()); diff --git a/Source/CTest/cmCTestTestHandler.cxx b/Source/CTest/cmCTestTestHandler.cxx index d1d8d08..7fb5e80 100644 --- a/Source/CTest/cmCTestTestHandler.cxx +++ b/Source/CTest/cmCTestTestHandler.cxx @@ -2126,10 +2126,10 @@ bool cmCTestTestHandler::SetTestsProperties( for (cmCTestTestProperties& rt : this->TestList) { if (t == rt.Name) { if (key == "WILL_FAIL") { - rt.WillFail = cmSystemTools::IsOn(val.c_str()); + rt.WillFail = cmSystemTools::IsOn(val); } if (key == "DISABLED") { - rt.Disabled = cmSystemTools::IsOn(val.c_str()); + rt.Disabled = cmSystemTools::IsOn(val); } if (key == "ATTACHED_FILES") { cmSystemTools::ExpandListArgument(val, rt.AttachedFiles); @@ -2172,7 +2172,7 @@ bool cmCTestTestHandler::SetTestsProperties( cmSystemTools::ExpandListArgument(val, rt.RequiredFiles); } if (key == "RUN_SERIAL") { - rt.RunSerial = cmSystemTools::IsOn(val.c_str()); + rt.RunSerial = cmSystemTools::IsOn(val); } if (key == "FAIL_REGULAR_EXPRESSION") { std::vector<std::string> lval; @@ -2188,7 +2188,7 @@ bool cmCTestTestHandler::SetTestsProperties( } } if (key == "PROCESSOR_AFFINITY") { - rt.WantAffinity = cmSystemTools::IsOn(val.c_str()); + rt.WantAffinity = cmSystemTools::IsOn(val); } if (key == "SKIP_RETURN_CODE") { rt.SkipReturnCode = atoi(val.c_str()); diff --git a/Source/CTest/cmCTestVC.cxx b/Source/CTest/cmCTestVC.cxx index a59d671..21c8889 100644 --- a/Source/CTest/cmCTestVC.cxx +++ b/Source/CTest/cmCTestVC.cxx @@ -146,7 +146,7 @@ bool cmCTestVC::Update() // if update version only is on then do not actually update, // just note the current version and finish if (!cmSystemTools::IsOn( - this->CTest->GetCTestConfiguration("UpdateVersionOnly").c_str())) { + this->CTest->GetCTestConfiguration("UpdateVersionOnly"))) { result = this->NoteOldRevision() && result; this->Log << "--- Begin Update ---\n"; result = this->UpdateImpl() && result; diff --git a/Source/CursesDialog/cmCursesMainForm.cxx b/Source/CursesDialog/cmCursesMainForm.cxx index 4a379c3..931797a 100644 --- a/Source/CursesDialog/cmCursesMainForm.cxx +++ b/Source/CursesDialog/cmCursesMainForm.cxx @@ -709,7 +709,7 @@ void cmCursesMainForm::FixValue(cmStateEnums::CacheEntryType type, cmSystemTools::ConvertToUnixSlashes(out); } if (type == cmStateEnums::BOOL) { - if (cmSystemTools::IsOff(out.c_str())) { + if (cmSystemTools::IsOff(out)) { out = "OFF"; } else { out = "ON"; diff --git a/Source/QtDialog/CMakeSetupDialog.ui b/Source/QtDialog/CMakeSetupDialog.ui index 8d8e0cd..dc22a29 100644 --- a/Source/QtDialog/CMakeSetupDialog.ui +++ b/Source/QtDialog/CMakeSetupDialog.ui @@ -57,6 +57,9 @@ <verstretch>0</verstretch> </sizepolicy> </property> + <property name="styleSheet"> + <string notr="true">padding-left: 0</string> + </property> <property name="editable"> <bool>true</bool> </property> diff --git a/Source/cmCTest.cxx b/Source/cmCTest.cxx index 3d3d526..e847bae 100644 --- a/Source/cmCTest.cxx +++ b/Source/cmCTest.cxx @@ -292,8 +292,7 @@ cmCTest::cmCTest() this->RepeatUntilFail = false; std::string outOnFail; if (cmSystemTools::GetEnv("CTEST_OUTPUT_ON_FAILURE", outOnFail)) { - this->OutputTestOutputOnTestFailure = - !cmSystemTools::IsOff(outOnFail.c_str()); + this->OutputTestOutputOnTestFailure = !cmSystemTools::IsOff(outOnFail); } this->InitStreams(); @@ -747,8 +746,8 @@ bool cmCTest::UpdateCTestConfiguration() } } if (this->ProduceXML) { - this->CompressXMLFiles = cmSystemTools::IsOn( - this->GetCTestConfiguration("CompressSubmission").c_str()); + this->CompressXMLFiles = + cmSystemTools::IsOn(this->GetCTestConfiguration("CompressSubmission")); } return true; } @@ -1936,7 +1935,7 @@ bool cmCTest::HandleCommandLineArguments(size_t& i, if (this->CheckArgument(arg, "--interactive-debug-mode") && i < args.size() - 1) { i++; - this->InteractiveDebugMode = cmSystemTools::IsOn(args[i].c_str()); + this->InteractiveDebugMode = cmSystemTools::IsOn(args[i]); } if (this->CheckArgument(arg, "--submit-index") && i < args.size() - 1) { i++; diff --git a/Source/cmCacheManager.cxx b/Source/cmCacheManager.cxx index 5091c97..b391dc4 100644 --- a/Source/cmCacheManager.cxx +++ b/Source/cmCacheManager.cxx @@ -127,15 +127,15 @@ bool cmCacheManager::LoadCache(const std::string& path, bool internal, } this->CacheMajorVersion = 0; this->CacheMinorVersion = 0; - if (const char* cmajor = + if (const std::string* cmajor = this->GetInitializedCacheValue("CMAKE_CACHE_MAJOR_VERSION")) { unsigned int v = 0; - if (sscanf(cmajor, "%u", &v) == 1) { + if (sscanf(cmajor->c_str(), "%u", &v) == 1) { this->CacheMajorVersion = v; } - if (const char* cminor = + if (const std::string* cminor = this->GetInitializedCacheValue("CMAKE_CACHE_MINOR_VERSION")) { - if (sscanf(cminor, "%u", &v) == 1) { + if (sscanf(cminor->c_str(), "%u", &v) == 1) { this->CacheMinorVersion = v; } } @@ -153,18 +153,20 @@ bool cmCacheManager::LoadCache(const std::string& path, bool internal, } // check to make sure the cache directory has not // been moved - const char* oldDir = this->GetInitializedCacheValue("CMAKE_CACHEFILE_DIR"); + const std::string* oldDir = + this->GetInitializedCacheValue("CMAKE_CACHEFILE_DIR"); if (internal && oldDir) { std::string currentcwd = path; - std::string oldcwd = oldDir; + std::string oldcwd = *oldDir; cmSystemTools::ConvertToUnixSlashes(currentcwd); currentcwd += "/CMakeCache.txt"; oldcwd += "/CMakeCache.txt"; if (!cmSystemTools::SameFile(oldcwd, currentcwd)) { + const std::string* dir = + this->GetInitializedCacheValue("CMAKE_CACHEFILE_DIR"); std::ostringstream message; message << "The current CMakeCache.txt directory " << currentcwd - << " is different than the directory " - << this->GetInitializedCacheValue("CMAKE_CACHEFILE_DIR") + << " is different than the directory " << (dir ? *dir : "") << " where CMakeCache.txt was created. This may result " "in binaries being created in the wrong place. If you " "are not sure, reedit the CMakeCache.txt"; @@ -512,12 +514,12 @@ cmCacheManager::CacheIterator cmCacheManager::GetCacheIterator(const char* key) return CacheIterator(*this, key); } -const char* cmCacheManager::GetInitializedCacheValue( +const std::string* cmCacheManager::GetInitializedCacheValue( const std::string& key) const { CacheEntryMap::const_iterator i = this->Cache.find(key); if (i != this->Cache.end() && i->second.Initialized) { - return i->second.Value.c_str(); + return &i->second.Value; } return nullptr; } @@ -616,7 +618,7 @@ void cmCacheManager::CacheIterator::SetValue(const char* value) bool cmCacheManager::CacheIterator::GetValueAsBool() const { - return cmSystemTools::IsOn(this->GetEntry().Value.c_str()); + return cmSystemTools::IsOn(this->GetEntry().Value); } std::vector<std::string> cmCacheManager::CacheEntry::GetPropertyList() const diff --git a/Source/cmCacheManager.h b/Source/cmCacheManager.h index 73923d1..a269271 100644 --- a/Source/cmCacheManager.h +++ b/Source/cmCacheManager.h @@ -126,7 +126,7 @@ public: int GetSize() { return static_cast<int>(this->Cache.size()); } ///! Get a value from the cache given a key - const char* GetInitializedCacheValue(const std::string& key) const; + const std::string* GetInitializedCacheValue(const std::string& key) const; const char* GetCacheEntryValue(const std::string& key) { diff --git a/Source/cmDefinitions.cxx b/Source/cmDefinitions.cxx index e766854..5fafaf9 100644 --- a/Source/cmDefinitions.cxx +++ b/Source/cmDefinitions.cxx @@ -30,11 +30,11 @@ cmDefinitions::Def const& cmDefinitions::GetInternal(const std::string& key, return begin->Map.insert(MapType::value_type(key, def)).first->second; } -const char* cmDefinitions::Get(const std::string& key, StackIter begin, - StackIter end) +const std::string* cmDefinitions::Get(const std::string& key, StackIter begin, + StackIter end) { Def const& def = cmDefinitions::GetInternal(key, begin, end, false); - return def.Exists ? def.c_str() : nullptr; + return def.Exists ? &def : nullptr; } void cmDefinitions::Raise(const std::string& key, StackIter begin, diff --git a/Source/cmDefinitions.h b/Source/cmDefinitions.h index 528b157..4ab5be6 100644 --- a/Source/cmDefinitions.h +++ b/Source/cmDefinitions.h @@ -23,8 +23,8 @@ class cmDefinitions typedef cmLinkedTree<cmDefinitions>::iterator StackIter; public: - static const char* Get(const std::string& key, StackIter begin, - StackIter end); + static const std::string* Get(const std::string& key, StackIter begin, + StackIter end); static void Raise(const std::string& key, StackIter begin, StackIter end); diff --git a/Source/cmFLTKWrapUICommand.cxx b/Source/cmFLTKWrapUICommand.cxx index 03d1ad1..effb446 100644 --- a/Source/cmFLTKWrapUICommand.cxx +++ b/Source/cmFLTKWrapUICommand.cxx @@ -23,7 +23,7 @@ bool cmFLTKWrapUICommand::InitialPass(std::vector<std::string> const& args, // what is the current source dir std::string cdir = this->Makefile->GetCurrentSourceDirectory(); - const char* fluid_exe = + std::string const& fluid_exe = this->Makefile->GetRequiredDefinition("FLTK_FLUID_EXECUTABLE"); // get parameter for the command diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx index 1c29017..54af2f4 100644 --- a/Source/cmFileCommand.cxx +++ b/Source/cmFileCommand.cxx @@ -784,10 +784,10 @@ bool cmFileCommand::HandleGlobCommand(std::vector<std::string> const& args, if (*i == "LIST_DIRECTORIES") { ++i; // skip LIST_DIRECTORIES if (i != args.end()) { - if (cmSystemTools::IsOn(i->c_str())) { + if (cmSystemTools::IsOn(*i)) { g.SetListDirs(true); g.SetRecurseListDirs(true); - } else if (cmSystemTools::IsOff(i->c_str())) { + } else if (cmSystemTools::IsOff(*i)) { g.SetListDirs(false); g.SetRecurseListDirs(false); } else { @@ -1756,7 +1756,7 @@ struct cmFileInstaller : public cmFileCopier // Check whether to copy files always or only if they have changed. std::string install_always; if (cmSystemTools::GetEnv("CMAKE_INSTALL_ALWAYS", install_always)) { - this->Always = cmSystemTools::IsOn(install_always.c_str()); + this->Always = cmSystemTools::IsOn(install_always); } // Get the current manifest. this->Manifest = @@ -2747,7 +2747,7 @@ bool cmFileCommand::HandleDownloadCommand(std::vector<std::string> const& args) } else if (*i == "TLS_VERIFY") { ++i; if (i != args.end()) { - tls_verify = cmSystemTools::IsOn(i->c_str()); + tls_verify = cmSystemTools::IsOn(*i); } else { this->SetError("TLS_VERIFY missing bool value."); return false; diff --git a/Source/cmFindLibraryCommand.cxx b/Source/cmFindLibraryCommand.cxx index 02bae82..1e1ab14 100644 --- a/Source/cmFindLibraryCommand.cxx +++ b/Source/cmFindLibraryCommand.cxx @@ -236,9 +236,9 @@ cmFindLibraryHelper::cmFindLibraryHelper(cmMakefile* mf) this->GG = this->Makefile->GetGlobalGenerator(); // Collect the list of library name prefixes/suffixes to try. - const char* prefixes_list = + std::string const& prefixes_list = this->Makefile->GetRequiredDefinition("CMAKE_FIND_LIBRARY_PREFIXES"); - const char* suffixes_list = + std::string const& suffixes_list = this->Makefile->GetRequiredDefinition("CMAKE_FIND_LIBRARY_SUFFIXES"); cmSystemTools::ExpandListArgument(prefixes_list, this->Prefixes, true); cmSystemTools::ExpandListArgument(suffixes_list, this->Suffixes, true); diff --git a/Source/cmGeneratorExpressionNode.cxx b/Source/cmGeneratorExpressionNode.cxx index 3381e6d..9aa5212 100644 --- a/Source/cmGeneratorExpressionNode.cxx +++ b/Source/cmGeneratorExpressionNode.cxx @@ -156,7 +156,7 @@ static const struct BoolNode : public cmGeneratorExpressionNode const GeneratorExpressionContent* /*content*/, cmGeneratorExpressionDAGChecker* /*dagChecker*/) const override { - return !cmSystemTools::IsOff(parameters.begin()->c_str()) ? "1" : "0"; + return !cmSystemTools::IsOff(*parameters.begin()) ? "1" : "0"; } } boolNode; diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index eb1852d..80a99d5 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -2556,7 +2556,7 @@ static void processIncludeDirectories( } } - if (!cmSystemTools::IsOff(entryInclude.c_str())) { + if (!cmSystemTools::IsOff(entryInclude)) { cmSystemTools::ConvertToUnixSlashes(entryInclude); } std::string inc = entryInclude; diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index 92ede7f..b5212fc 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -176,7 +176,7 @@ std::string cmGlobalGenerator::SelectMakeProgram( const std::string& inMakeProgram, const std::string& makeDefault) const { std::string makeProgram = inMakeProgram; - if (cmSystemTools::IsOff(makeProgram.c_str())) { + if (cmSystemTools::IsOff(makeProgram)) { const char* makeProgramCSTR = this->CMakeInstance->GetCacheDefinition("CMAKE_MAKE_PROGRAM"); if (cmSystemTools::IsOff(makeProgramCSTR)) { @@ -184,7 +184,7 @@ std::string cmGlobalGenerator::SelectMakeProgram( } else { makeProgram = makeProgramCSTR; } - if (cmSystemTools::IsOff(makeProgram.c_str()) && !makeProgram.empty()) { + if (cmSystemTools::IsOff(makeProgram) && !makeProgram.empty()) { makeProgram = "CMAKE_MAKE_PROGRAM-NOTFOUND"; } } @@ -205,7 +205,7 @@ void cmGlobalGenerator::ResolveLanguageCompiler(const std::string& lang, } return; } - const char* name = mf->GetRequiredDefinition(langComp); + std::string const& name = mf->GetRequiredDefinition(langComp); std::string path; if (!cmSystemTools::FileIsFullPath(name)) { path = cmSystemTools::FindProgram(name); diff --git a/Source/cmGlobalVisualStudio7Generator.cxx b/Source/cmGlobalVisualStudio7Generator.cxx index 28cbdc7..21121f2 100644 --- a/Source/cmGlobalVisualStudio7Generator.cxx +++ b/Source/cmGlobalVisualStudio7Generator.cxx @@ -679,7 +679,7 @@ std::set<std::string> cmGlobalVisualStudio7Generator::IsPartOfDefaultBuild( std::unique_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(propertyValue); if (cmSystemTools::IsOn( - cge->Evaluate(target->GetLocalGenerator(), i).c_str())) { + cge->Evaluate(target->GetLocalGenerator(), i))) { activeConfigs.insert(i); } } diff --git a/Source/cmIncludeDirectoryCommand.cxx b/Source/cmIncludeDirectoryCommand.cxx index 4f80fb8..eaaf64d 100644 --- a/Source/cmIncludeDirectoryCommand.cxx +++ b/Source/cmIncludeDirectoryCommand.cxx @@ -120,7 +120,7 @@ void cmIncludeDirectoryCommand::NormalizeInclude(std::string& inc) return; } - if (!cmSystemTools::IsOff(inc.c_str())) { + if (!cmSystemTools::IsOff(inc)) { cmSystemTools::ConvertToUnixSlashes(inc); if (!cmSystemTools::FileIsFullPath(inc)) { diff --git a/Source/cmInstalledFile.cxx b/Source/cmInstalledFile.cxx index 3ffeabd..0e06029 100644 --- a/Source/cmInstalledFile.cxx +++ b/Source/cmInstalledFile.cxx @@ -102,7 +102,7 @@ bool cmInstalledFile::GetPropertyAsBool(const std::string& prop) const { std::string value; bool isSet = this->GetProperty(prop, value); - return isSet && cmSystemTools::IsOn(value.c_str()); + return isSet && cmSystemTools::IsOn(value); } void cmInstalledFile::GetPropertyAsList(const std::string& prop, diff --git a/Source/cmLocalCommonGenerator.cxx b/Source/cmLocalCommonGenerator.cxx index 5a43f2e..7ce2c82 100644 --- a/Source/cmLocalCommonGenerator.cxx +++ b/Source/cmLocalCommonGenerator.cxx @@ -54,9 +54,8 @@ std::string cmLocalCommonGenerator::GetTargetFortranFlags( this->Makefile->GetSafeDefinition("CMAKE_Fortran_MODDIR_DEFAULT"); } if (!mod_dir.empty()) { - const char* moddir_flag = + std::string modflag = this->Makefile->GetRequiredDefinition("CMAKE_Fortran_MODDIR_FLAG"); - std::string modflag = moddir_flag; modflag += mod_dir; this->AppendFlags(flags, modflag); } diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 532f9a9..c955af6 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -1655,7 +1655,7 @@ void cmLocalGenerator::AddCompilerRequirementFlag( std::string option_flag = "CMAKE_" + lang + *stdIt + "_" + type + "_COMPILE_OPTION"; - const char* opt = + std::string const& opt = target->Target->GetMakefile()->GetRequiredDefinition(option_flag); std::vector<std::string> optVec; cmSystemTools::ExpandListArgument(opt, optVec); @@ -2024,7 +2024,7 @@ void cmLocalGenerator::AppendIncludeDirectories( std::string inc = include; - if (!cmSystemTools::IsOff(inc.c_str())) { + if (!cmSystemTools::IsOff(inc)) { cmSystemTools::ConvertToUnixSlashes(inc); } diff --git a/Source/cmLocalVisualStudio7Generator.cxx b/Source/cmLocalVisualStudio7Generator.cxx index 80f2803..13bd214 100644 --- a/Source/cmLocalVisualStudio7Generator.cxx +++ b/Source/cmLocalVisualStudio7Generator.cxx @@ -665,11 +665,11 @@ void cmLocalVisualStudio7Generator::WriteConfiguration( std::string baseFlagVar = "CMAKE_"; baseFlagVar += langForClCompile; baseFlagVar += "_FLAGS"; - flags = this->Makefile->GetRequiredDefinition(baseFlagVar.c_str()); + flags = this->Makefile->GetRequiredDefinition(baseFlagVar); std::string flagVar = baseFlagVar + std::string("_") + cmSystemTools::UpperCase(configName); flags += " "; - flags += this->Makefile->GetRequiredDefinition(flagVar.c_str()); + flags += this->Makefile->GetRequiredDefinition(flagVar); } // set the correct language if (linkLanguage == "C") { @@ -931,8 +931,7 @@ std::string cmLocalVisualStudio7Generator::GetBuildTypeLinkerFlags( rootLinkerFlags + "_" + configTypeUpper; std::string extraLinkOptionsBuildType = - this->Makefile->GetRequiredDefinition( - extraLinkOptionsBuildTypeDef.c_str()); + this->Makefile->GetRequiredDefinition(extraLinkOptionsBuildTypeDef); return extraLinkOptionsBuildType; } diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 6127b57..5498ad2 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -1738,7 +1738,7 @@ void cmMakefile::AddCacheDefinition(const std::string& name, const char* value, cmSystemTools::ExpandListArgument(nvalue, files); nvalue.clear(); for (cc = 0; cc < files.size(); cc++) { - if (!cmSystemTools::IsOff(files[cc].c_str())) { + if (!cmSystemTools::IsOff(files[cc])) { files[cc] = cmSystemTools::CollapseFullPath(files[cc]); } if (cc > 0) { @@ -2354,22 +2354,24 @@ bool cmMakefile::CanIWriteThisFile(std::string const& fileName) const cmSystemTools::SameFile(fileName, this->GetHomeOutputDirectory()); } -const char* cmMakefile::GetRequiredDefinition(const std::string& name) const +std::string cmMakefile::GetRequiredDefinition(const std::string& name) const { const char* ret = this->GetDefinition(name); if (!ret) { cmSystemTools::Error("Error required internal CMake variable not " "set, cmake may not be built correctly.\n", "Missing variable is:\n", name.c_str()); - return ""; + return std::string(); } - return ret; + return std::string(ret); } bool cmMakefile::IsDefinitionSet(const std::string& name) const { - const char* def = this->StateSnapshot.GetDefinition(name); - if (!def) { + const char* def; + if (const std::string* d = this->StateSnapshot.GetDefinition(name)) { + def = d->c_str(); + } else { def = this->GetState()->GetInitializedCacheValue(name); } #ifdef CMAKE_BUILD_WITH_CMAKE @@ -2385,8 +2387,10 @@ bool cmMakefile::IsDefinitionSet(const std::string& name) const const char* cmMakefile::GetDefinition(const std::string& name) const { - const char* def = this->StateSnapshot.GetDefinition(name); - if (!def) { + const char* def; + if (const std::string* d = this->StateSnapshot.GetDefinition(name)) { + def = d->c_str(); + } else { def = this->GetState()->GetInitializedCacheValue(name); } #ifdef CMAKE_BUILD_WITH_CMAKE @@ -2402,8 +2406,9 @@ const char* cmMakefile::GetDefinition(const std::string& name) const // A callback was executed and may have caused re-allocation of the // variable storage. Look it up again for now. // FIXME: Refactor variable storage to avoid this problem. - def = this->StateSnapshot.GetDefinition(name); - if (!def) { + if (const std::string* d = this->StateSnapshot.GetDefinition(name)) { + def = d->c_str(); + } else { def = this->GetState()->GetInitializedCacheValue(name); } } diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index 4085e99..0ab4371 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -423,7 +423,7 @@ public: */ const char* GetDefinition(const std::string&) const; const char* GetSafeDefinition(const std::string&) const; - const char* GetRequiredDefinition(const std::string& name) const; + std::string GetRequiredDefinition(const std::string& name) const; bool IsDefinitionSet(const std::string&) const; /** * Get the list of all variables in the current space. If argument diff --git a/Source/cmNinjaNormalTargetGenerator.cxx b/Source/cmNinjaNormalTargetGenerator.cxx index b634b0a..6436969 100644 --- a/Source/cmNinjaNormalTargetGenerator.cxx +++ b/Source/cmNinjaNormalTargetGenerator.cxx @@ -530,7 +530,7 @@ std::vector<std::string> cmNinjaNormalTargetGenerator::ComputeLinkCmd() linkCmdVar = this->GeneratorTarget->GetFeatureSpecificLinkRuleVariable( linkCmdVar, this->TargetLinkLanguage, this->GetConfigName()); - const char* linkCmd = mf->GetRequiredDefinition(linkCmdVar); + std::string const& linkCmd = mf->GetRequiredDefinition(linkCmdVar); cmSystemTools::ExpandListArgument(linkCmd, linkCmds); } { @@ -541,7 +541,7 @@ std::vector<std::string> cmNinjaNormalTargetGenerator::ComputeLinkCmd() linkCmdVar = this->GeneratorTarget->GetFeatureSpecificLinkRuleVariable( linkCmdVar, this->TargetLinkLanguage, this->GetConfigName()); - const char* linkCmd = mf->GetRequiredDefinition(linkCmdVar); + std::string const& linkCmd = mf->GetRequiredDefinition(linkCmdVar); cmSystemTools::ExpandListArgument(linkCmd, linkCmds); } return linkCmds; diff --git a/Source/cmOptionCommand.cxx b/Source/cmOptionCommand.cxx index 239cd00..006211d 100644 --- a/Source/cmOptionCommand.cxx +++ b/Source/cmOptionCommand.cxx @@ -31,7 +31,7 @@ bool cmOptionCommand::InitialPass(std::vector<std::string> const& args, bool checkAndWarn = false; { auto status = this->Makefile->GetPolicyStatus(cmPolicies::CMP0077); - const char* existsBeforeSet = + const auto* existsBeforeSet = this->Makefile->GetStateSnapshot().GetDefinition(args[0]); switch (status) { case cmPolicies::WARN: @@ -67,12 +67,12 @@ bool cmOptionCommand::InitialPass(std::vector<std::string> const& args, if (args.size() == 3) { initialValue = args[2]; } - bool init = cmSystemTools::IsOn(initialValue.c_str()); + bool init = cmSystemTools::IsOn(initialValue); this->Makefile->AddCacheDefinition(args[0], init ? "ON" : "OFF", args[1].c_str(), cmStateEnums::BOOL); if (checkAndWarn) { - const char* existsAfterSet = + const auto* existsAfterSet = this->Makefile->GetStateSnapshot().GetDefinition(args[0]); if (!existsAfterSet) { std::ostringstream w; diff --git a/Source/cmQTWrapCPPCommand.cxx b/Source/cmQTWrapCPPCommand.cxx index 09cc63a..d2133ed 100644 --- a/Source/cmQTWrapCPPCommand.cxx +++ b/Source/cmQTWrapCPPCommand.cxx @@ -21,7 +21,7 @@ bool cmQTWrapCPPCommand::InitialPass(std::vector<std::string> const& args, } // Get the moc executable to run in the custom command. - const char* moc_exe = + std::string const& moc_exe = this->Makefile->GetRequiredDefinition("QT_MOC_EXECUTABLE"); // Get the variable holding the list of sources. diff --git a/Source/cmQTWrapUICommand.cxx b/Source/cmQTWrapUICommand.cxx index da36cdf..25dcd1a 100644 --- a/Source/cmQTWrapUICommand.cxx +++ b/Source/cmQTWrapUICommand.cxx @@ -21,9 +21,9 @@ bool cmQTWrapUICommand::InitialPass(std::vector<std::string> const& args, } // Get the uic and moc executables to run in the custom commands. - const char* uic_exe = + std::string const& uic_exe = this->Makefile->GetRequiredDefinition("QT_UIC_EXECUTABLE"); - const char* moc_exe = + std::string const& moc_exe = this->Makefile->GetRequiredDefinition("QT_MOC_EXECUTABLE"); // Get the variable holding the list of sources. diff --git a/Source/cmQtAutoGenInitializer.cxx b/Source/cmQtAutoGenInitializer.cxx index 5dd3c8b..8bd985a 100644 --- a/Source/cmQtAutoGenInitializer.cxx +++ b/Source/cmQtAutoGenInitializer.cxx @@ -205,8 +205,7 @@ bool cmQtAutoGenInitializer::InitCustomTargets() unsigned long iVerb = 0; if (!cmSystemTools::StringToULong(this->Verbosity.c_str(), &iVerb)) { // Non numeric verbosity - this->Verbosity = - cmSystemTools::IsOn(this->Verbosity.c_str()) ? "1" : "0"; + this->Verbosity = cmSystemTools::IsOn(this->Verbosity) ? "1" : "0"; } } diff --git a/Source/cmQtAutoGenerator.cxx b/Source/cmQtAutoGenerator.cxx index 64ce0e3..734b2d7 100644 --- a/Source/cmQtAutoGenerator.cxx +++ b/Source/cmQtAutoGenerator.cxx @@ -645,7 +645,7 @@ cmQtAutoGenerator::cmQtAutoGenerator() Logger_.SetVerbosity(static_cast<unsigned int>(iVerbose)); } else { // Non numeric verbosity - Logger_.SetVerbose(cmSystemTools::IsOn(verbose.c_str())); + Logger_.SetVerbose(cmSystemTools::IsOn(verbose)); } } } @@ -653,7 +653,7 @@ cmQtAutoGenerator::cmQtAutoGenerator() std::string colorEnv; cmSystemTools::GetEnv("COLOR", colorEnv); if (!colorEnv.empty()) { - Logger_.SetColorOutput(cmSystemTools::IsOn(colorEnv.c_str())); + Logger_.SetColorOutput(cmSystemTools::IsOn(colorEnv)); } else { Logger_.SetColorOutput(true); } diff --git a/Source/cmServerDictionary.h b/Source/cmServerDictionary.h index 685542c..ebf16eb 100644 --- a/Source/cmServerDictionary.h +++ b/Source/cmServerDictionary.h @@ -96,6 +96,7 @@ static const std::string kCTEST_COMMAND = "ctestCommand"; static const std::string kCTEST_INFO = "ctestInfo"; static const std::string kMINIMUM_CMAKE_VERSION = "minimumCMakeVersion"; static const std::string kIS_GENERATOR_PROVIDED_KEY = "isGeneratorProvided"; +static const std::string kIS_INTERFACE_SOURCES_KEY = "isInterfaceSources"; static const std::string kSTART_MAGIC = "[== \"CMake Server\" ==["; static const std::string kEND_MAGIC = "]== \"CMake Server\" ==]"; diff --git a/Source/cmServerProtocol.cxx b/Source/cmServerProtocol.cxx index 31101e4..af4b466 100644 --- a/Source/cmServerProtocol.cxx +++ b/Source/cmServerProtocol.cxx @@ -256,7 +256,12 @@ bool cmServerProtocol::DoActivate(const cmServerRequest& /*request*/, std::pair<int, int> cmServerProtocol1::ProtocolVersion() const { - return std::make_pair(1, 2); + // Revision history + // 1, 1 - Report backtraces in codemodel response + // 1, 2 - Add target install destinations to codemodel + // 1, 3 - Add a flag to target filegroups indicating whether or not the + // filegroup is for INTERFACE_SOURCES + return std::make_pair(1, 3); } static void setErrorMessage(std::string* errorMessage, const std::string& text) @@ -593,6 +598,8 @@ cmServerResponse cmServerProtocol1::ProcessCMakeInputs( return request.Reply(result); } +const std::string kInterfaceSourcesLanguageDataKey = + "INTERFACE_SOURCES_LD_KEY"; class LanguageData { public: @@ -625,6 +632,12 @@ void LanguageData::SetDefines(const std::set<std::string>& defines) Defines = std::move(result); } +struct FileGroupSources +{ + bool IsInterfaceSources; + std::vector<std::string> Files; +}; + namespace std { template <> @@ -652,31 +665,35 @@ struct hash<LanguageData> } // namespace std static Json::Value DumpSourceFileGroup(const LanguageData& data, + bool isInterfaceSource, const std::vector<std::string>& files, const std::string& baseDir) { Json::Value result = Json::objectValue; + if (isInterfaceSource) { + result[kIS_INTERFACE_SOURCES_KEY] = true; + } if (!data.Language.empty()) { result[kLANGUAGE_KEY] = data.Language; - if (!data.Flags.empty()) { - result[kCOMPILE_FLAGS_KEY] = data.Flags; - } - if (!data.IncludePathList.empty()) { - Json::Value includes = Json::arrayValue; - for (auto const& i : data.IncludePathList) { - Json::Value tmp = Json::objectValue; - tmp[kPATH_KEY] = i.first; - if (i.second) { - tmp[kIS_SYSTEM_KEY] = i.second; - } - includes.append(tmp); + } + if (!data.Flags.empty()) { + result[kCOMPILE_FLAGS_KEY] = data.Flags; + } + if (!data.IncludePathList.empty()) { + Json::Value includes = Json::arrayValue; + for (auto const& i : data.IncludePathList) { + Json::Value tmp = Json::objectValue; + tmp[kPATH_KEY] = i.first; + if (i.second) { + tmp[kIS_SYSTEM_KEY] = i.second; } - result[kINCLUDE_PATH_KEY] = includes; - } - if (!data.Defines.empty()) { - result[kDEFINES_KEY] = fromStringList(data.Defines); + includes.append(tmp); } + result[kINCLUDE_PATH_KEY] = includes; + } + if (!data.Defines.empty()) { + result[kDEFINES_KEY] = fromStringList(data.Defines); } result[kIS_GENERATED_KEY] = data.IsGenerated; @@ -691,21 +708,19 @@ static Json::Value DumpSourceFileGroup(const LanguageData& data, return result; } -static Json::Value DumpSourceFilesList( - cmGeneratorTarget* target, const std::string& config, - const std::map<std::string, LanguageData>& languageDataMap) +static void PopulateFileGroupData( + cmGeneratorTarget* target, bool isInterfaceSources, + const std::vector<cmSourceFile*>& files, const std::string& config, + const std::map<std::string, LanguageData>& languageDataMap, + std::unordered_map<LanguageData, FileGroupSources>& fileGroups) { - // Collect sourcefile groups: - - std::vector<cmSourceFile*> files; - target->GetSourceFiles(files, config); - - std::unordered_map<LanguageData, std::vector<std::string>> fileGroups; for (cmSourceFile* file : files) { LanguageData fileData; fileData.Language = file->GetLanguage(); - if (!fileData.Language.empty()) { - const LanguageData& ld = languageDataMap.at(fileData.Language); + if (!fileData.Language.empty() || isInterfaceSources) { + const LanguageData& ld = isInterfaceSources + ? languageDataMap.at(kInterfaceSourcesLanguageDataKey) + : languageDataMap.at(fileData.Language); cmLocalGenerator* lg = target->GetLocalGenerator(); cmGeneratorExpressionInterpreter genexInterpreter( lg, target, config, target->GetName(), fileData.Language); @@ -733,10 +748,14 @@ static Json::Value DumpSourceFilesList( lg->AppendIncludeDirectories(includes, evaluatedIncludes, *file); for (const auto& include : includes) { + // INTERFACE_LIBRARY targets do not support the + // IsSystemIncludeDirectory call so just set it to false. + const bool isSystemInclude = isInterfaceSources + ? false + : target->IsSystemIncludeDirectory(include, config, + fileData.Language); fileData.IncludePathList.push_back( - std::make_pair(include, - target->IsSystemIncludeDirectory( - include, config, fileData.Language))); + std::make_pair(include, isSystemInclude)); } } @@ -765,14 +784,71 @@ static Json::Value DumpSourceFilesList( } fileData.IsGenerated = file->GetPropertyAsBool("GENERATED"); - std::vector<std::string>& groupFileList = fileGroups[fileData]; - groupFileList.push_back(file->GetFullPath()); + FileGroupSources& groupFileList = fileGroups[fileData]; + groupFileList.IsInterfaceSources = isInterfaceSources; + groupFileList.Files.push_back(file->GetFullPath()); + } +} + +static Json::Value DumpSourceFilesList( + cmGeneratorTarget* target, const std::string& config, + const std::map<std::string, LanguageData>& languageDataMap) +{ + const cmStateEnums::TargetType type = target->GetType(); + std::unordered_map<LanguageData, FileGroupSources> fileGroups; + + // Collect sourcefile groups: + + std::vector<cmSourceFile*> files; + if (type == cmStateEnums::INTERFACE_LIBRARY) { + // INTERFACE_LIBRARY targets do not create all the data structures + // associated with regular targets. If properties are explicitly specified + // for files in INTERFACE_SOURCES then we can get them through the Makefile + // rather than the target. + files = target->Makefile->GetSourceFiles(); + } else { + target->GetSourceFiles(files, config); + PopulateFileGroupData(target, false /* isInterfaceSources */, files, + config, languageDataMap, fileGroups); + } + + // Collect interface sourcefile groups: + + auto targetProp = target->Target->GetProperty("INTERFACE_SOURCES"); + if (targetProp != nullptr) { + cmGeneratorExpressionInterpreter genexInterpreter( + target->GetLocalGenerator(), target, config, target->GetName(), ""); + + auto evaluatedSources = cmsys::SystemTools::SplitString( + genexInterpreter.Evaluate(targetProp, "INTERFACE_SOURCES"), ';'); + + std::map<std::string, cmSourceFile*> filesMap; + for (auto file : files) { + filesMap[file->GetFullPath()] = file; + } + + std::vector<cmSourceFile*> interfaceSourceFiles; + for (const std::string& interfaceSourceFilePath : evaluatedSources) { + auto entry = filesMap.find(interfaceSourceFilePath); + if (entry != filesMap.end()) { + // use what we have since it has all the associated properties + interfaceSourceFiles.push_back(entry->second); + } else { + interfaceSourceFiles.push_back( + new cmSourceFile(target->Makefile, interfaceSourceFilePath)); + } + } + + PopulateFileGroupData(target, true /* isInterfaceSources */, + interfaceSourceFiles, config, languageDataMap, + fileGroups); } const std::string& baseDir = target->Makefile->GetCurrentSourceDirectory(); Json::Value result = Json::arrayValue; for (auto const& it : fileGroups) { - Json::Value group = DumpSourceFileGroup(it.first, it.second, baseDir); + Json::Value group = DumpSourceFileGroup( + it.first, it.second.IsInterfaceSources, it.second.Files, baseDir); if (!group.isNull()) { result.append(group); } @@ -882,6 +958,59 @@ static Json::Value DumpCTestConfigurationsList(const cmake* cm) return result; } +static void GetTargetProperty( + cmGeneratorExpressionInterpreter& genexInterpreter, + cmGeneratorTarget* target, const char* propertyName, + std::vector<std::string>& propertyValue) +{ + auto targetProp = target->Target->GetProperty(propertyName); + if (targetProp != nullptr) { + propertyValue = cmsys::SystemTools::SplitString( + genexInterpreter.Evaluate(targetProp, propertyName), ';'); + } +} + +static void CreateInterfaceSourcesEntry( + cmLocalGenerator* lg, cmGeneratorTarget* target, const std::string& config, + std::map<std::string, LanguageData>& languageDataMap) +{ + LanguageData& ld = languageDataMap[kInterfaceSourcesLanguageDataKey]; + ld.Language = ""; + + cmGeneratorExpressionInterpreter genexInterpreter(lg, target, config, + target->GetName(), ""); + std::vector<std::string> propertyValue; + GetTargetProperty(genexInterpreter, target, "INTERFACE_INCLUDE_DIRECTORIES", + propertyValue); + for (std::string const& i : propertyValue) { + ld.IncludePathList.push_back( + std::make_pair(i, false /* isSystemInclude */)); + } + + propertyValue.clear(); + GetTargetProperty(genexInterpreter, target, + "INTERFACE_SYSTEM_INCLUDE_DIRECTORIES", propertyValue); + for (std::string const& i : propertyValue) { + ld.IncludePathList.push_back( + std::make_pair(i, true /* isSystemInclude */)); + } + + propertyValue.clear(); + GetTargetProperty(genexInterpreter, target, "INTERFACE_COMPILE_OPTIONS", + propertyValue); + for (const auto& s : propertyValue) { + ld.Flags += " " + s; + } + + propertyValue.clear(); + GetTargetProperty(genexInterpreter, target, "INTERFACE_COMPILE_DEFINITIONS", + propertyValue); + if (!propertyValue.empty()) { + std::set<std::string> defines(propertyValue.begin(), propertyValue.end()); + ld.SetDefines(defines); + } +} + static Json::Value DumpTarget(cmGeneratorTarget* target, const std::string& config) { @@ -911,11 +1040,6 @@ static Json::Value DumpTarget(cmGeneratorTarget* target, result[kTYPE_KEY] = typeName; result[kSOURCE_DIRECTORY_KEY] = lg->GetCurrentSourceDirectory(); result[kBUILD_DIRECTORY_KEY] = lg->GetCurrentBinaryDirectory(); - - if (type == cmStateEnums::INTERFACE_LIBRARY) { - return result; - } - result[kFULL_NAME_KEY] = target->GetFullName(config); if (target->Target->GetHaveInstallRule()) { @@ -1002,8 +1126,22 @@ static Json::Value DumpTarget(cmGeneratorTarget* target, } std::set<std::string> languages; - target->GetLanguages(languages, config); std::map<std::string, LanguageData> languageDataMap; + if (type == cmStateEnums::INTERFACE_LIBRARY) { + // INTERFACE_LIBRARY targets do not create all the data structures + // associated with regular targets. If properties are explicitly specified + // for files in INTERFACE_SOURCES then we can get them through the Makefile + // rather than the target. + for (auto file : target->Makefile->GetSourceFiles()) { + const std::string& language = file->GetLanguage(); + if (!language.empty()) { + languages.insert(language); + } + } + } else { + target->GetLanguages(languages, config); + } + for (std::string const& lang : languages) { LanguageData& ld = languageDataMap[lang]; ld.Language = lang; @@ -1019,6 +1157,11 @@ static Json::Value DumpTarget(cmGeneratorTarget* target, } } + if (target->Target->GetProperty("INTERFACE_SOURCES") != nullptr) { + // Create an entry in the languageDataMap for interface sources. + CreateInterfaceSourcesEntry(lg, target, config, languageDataMap); + } + Json::Value sourceGroupsValue = DumpSourceFilesList(target, config, languageDataMap); if (!sourceGroupsValue.empty()) { diff --git a/Source/cmSetPropertyCommand.cxx b/Source/cmSetPropertyCommand.cxx index 171b62e..3c4111b 100644 --- a/Source/cmSetPropertyCommand.cxx +++ b/Source/cmSetPropertyCommand.cxx @@ -330,8 +330,8 @@ bool cmSetPropertyCommand::HandleTest(cmTest* test) bool cmSetPropertyCommand::HandleCacheMode() { if (this->PropertyName == "ADVANCED") { - if (!this->Remove && !cmSystemTools::IsOn(this->PropertyValue.c_str()) && - !cmSystemTools::IsOff(this->PropertyValue.c_str())) { + if (!this->Remove && !cmSystemTools::IsOn(this->PropertyValue) && + !cmSystemTools::IsOff(this->PropertyValue)) { std::ostringstream e; e << "given non-boolean value \"" << this->PropertyValue << "\" for CACHE property \"ADVANCED\". "; diff --git a/Source/cmSetSourceFilesPropertiesCommand.cxx b/Source/cmSetSourceFilesPropertiesCommand.cxx index 33e1b2e..8445b02 100644 --- a/Source/cmSetSourceFilesPropertiesCommand.cxx +++ b/Source/cmSetSourceFilesPropertiesCommand.cxx @@ -87,7 +87,7 @@ bool cmSetSourceFilesPropertiesCommand::RunCommand( propertyPairs.push_back(*j); if (*j == "GENERATED") { ++j; - if (j != propend && cmSystemTools::IsOn(j->c_str())) { + if (j != propend && cmSystemTools::IsOn(*j)) { generated = true; } } else { diff --git a/Source/cmSiteNameCommand.cxx b/Source/cmSiteNameCommand.cxx index d2e83a6..7f33b7a 100644 --- a/Source/cmSiteNameCommand.cxx +++ b/Source/cmSiteNameCommand.cxx @@ -50,7 +50,7 @@ bool cmSiteNameCommand::InitialPass(std::vector<std::string> const& args, } #else // try to find the hostname for this computer - if (!cmSystemTools::IsOff(hostname_cmd.c_str())) { + if (!cmSystemTools::IsOff(hostname_cmd)) { std::string host; cmSystemTools::RunSingleCommand(hostname_cmd.c_str(), &host, nullptr, nullptr, nullptr, diff --git a/Source/cmState.cxx b/Source/cmState.cxx index 5651594..e01bf71 100644 --- a/Source/cmState.cxx +++ b/Source/cmState.cxx @@ -142,7 +142,8 @@ const char* cmState::GetCacheEntryValue(std::string const& key) const const char* cmState::GetInitializedCacheValue(std::string const& key) const { - return this->CacheManager->GetInitializedCacheValue(key); + const std::string* p = this->CacheManager->GetInitializedCacheValue(key); + return p ? p->c_str() : nullptr; } cmStateEnums::CacheEntryType cmState::GetCacheEntryType( @@ -298,9 +299,9 @@ cmStateSnapshot cmState::Reset() { std::string srcDir = - cmDefinitions::Get("CMAKE_SOURCE_DIR", pos->Vars, pos->Root); + *cmDefinitions::Get("CMAKE_SOURCE_DIR", pos->Vars, pos->Root); std::string binDir = - cmDefinitions::Get("CMAKE_BINARY_DIR", pos->Vars, pos->Root); + *cmDefinitions::Get("CMAKE_BINARY_DIR", pos->Vars, pos->Root); this->VarTree.Clear(); pos->Vars = this->VarTree.Push(this->VarTree.Root()); pos->Parent = this->VarTree.Root(); diff --git a/Source/cmStateSnapshot.cxx b/Source/cmStateSnapshot.cxx index ec428a6..0379e7e 100644 --- a/Source/cmStateSnapshot.cxx +++ b/Source/cmStateSnapshot.cxx @@ -204,7 +204,8 @@ bool cmStateSnapshot::HasDefinedPolicyCMP0011() return !this->Position->Policies->IsEmpty(); } -const char* cmStateSnapshot::GetDefinition(std::string const& name) const +std::string const* cmStateSnapshot::GetDefinition( + std::string const& name) const { assert(this->Position->Vars.IsValid()); return cmDefinitions::Get(name, this->Position->Vars, this->Position->Root); @@ -426,8 +427,8 @@ std::string cmStateSnapshot::GetProjectName() const void cmStateSnapshot::InitializeFromParent_ForSubdirsCommand() { - std::string currentSrcDir = this->GetDefinition("CMAKE_CURRENT_SOURCE_DIR"); - std::string currentBinDir = this->GetDefinition("CMAKE_CURRENT_BINARY_DIR"); + std::string currentSrcDir = *this->GetDefinition("CMAKE_CURRENT_SOURCE_DIR"); + std::string currentBinDir = *this->GetDefinition("CMAKE_CURRENT_BINARY_DIR"); this->InitializeFromParent(); this->SetDefinition("CMAKE_SOURCE_DIR", this->State->GetSourceDirectory()); this->SetDefinition("CMAKE_BINARY_DIR", this->State->GetBinaryDirectory()); diff --git a/Source/cmStateSnapshot.h b/Source/cmStateSnapshot.h index af5653b..014c62e 100644 --- a/Source/cmStateSnapshot.h +++ b/Source/cmStateSnapshot.h @@ -22,7 +22,7 @@ public: cmStateSnapshot(cmState* state = nullptr); cmStateSnapshot(cmState* state, cmStateDetail::PositionType position); - const char* GetDefinition(std::string const& name) const; + std::string const* GetDefinition(std::string const& name) const; bool IsInitialized(std::string const& name) const; void SetDefinition(std::string const& name, std::string const& value); void RemoveDefinition(std::string const& name); diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 72fd2bb..79e5ccf 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -42,7 +42,6 @@ #include <ctype.h> #include <errno.h> #include <iostream> -#include <set> #include <sstream> #include <stdio.h> #include <stdlib.h> @@ -372,24 +371,36 @@ bool cmSystemTools::IsOn(const char* val) if (!val) { return false; } - size_t len = strlen(val); - if (len > 4) { - return false; + /* clang-format off */ + // "1" + if (val[0] == '1' && val[1] == '\0') { + return true; } - std::string v(val, len); - - static std::set<std::string> onValues; - if (onValues.empty()) { - onValues.insert("ON"); - onValues.insert("1"); - onValues.insert("YES"); - onValues.insert("TRUE"); - onValues.insert("Y"); + // "ON" + if ((val[0] == 'O' || val[0] == 'o') && + (val[1] == 'N' || val[1] == 'n') && val[2] == '\0') { + return true; } - for (char& c : v) { - c = static_cast<char>(toupper(c)); + // "Y", "YES" + if ((val[0] == 'Y' || val[0] == 'y') && (val[1] == '\0' || ( + (val[1] == 'E' || val[1] == 'e') && + (val[2] == 'S' || val[2] == 's') && val[3] == '\0'))) { + return true; } - return (onValues.count(v) > 0); + // "TRUE" + if ((val[0] == 'T' || val[0] == 't') && + (val[1] == 'R' || val[1] == 'r') && + (val[2] == 'U' || val[2] == 'u') && + (val[3] == 'E' || val[3] == 'e') && val[4] == '\0') { + return true; + } + /* clang-format on */ + return false; +} + +bool cmSystemTools::IsOn(const std::string& val) +{ + return cmSystemTools::IsOn(val.c_str()); } bool cmSystemTools::IsNOTFOUND(const char* val) @@ -402,30 +413,50 @@ bool cmSystemTools::IsNOTFOUND(const char* val) bool cmSystemTools::IsOff(const char* val) { - if (!val || !*val) { + // "" + if (!val || val[0] == '\0') { return true; } - size_t len = strlen(val); - // Try and avoid toupper() for large strings. - if (len > 6) { - return cmSystemTools::IsNOTFOUND(val); + /* clang-format off */ + // "0" + if (val[0] == '0' && val[1] == '\0') { + return true; } - - static std::set<std::string> offValues; - if (offValues.empty()) { - offValues.insert("OFF"); - offValues.insert("0"); - offValues.insert("NO"); - offValues.insert("FALSE"); - offValues.insert("N"); - offValues.insert("IGNORE"); + // "OFF" + if ((val[0] == 'O' || val[0] == 'o') && + (val[1] == 'F' || val[1] == 'f') && + (val[2] == 'F' || val[2] == 'f') && val[3] == '\0') { + return true; } - // Try and avoid toupper(). - std::string v(val, len); - for (char& c : v) { - c = static_cast<char>(toupper(c)); + // "N", "NO" + if ((val[0] == 'N' || val[0] == 'n') && (val[1] == '\0' || ( + (val[1] == 'O' || val[1] == 'o') && val[2] == '\0'))) { + return true; } - return (offValues.count(v) > 0); + // "FALSE" + if ((val[0] == 'F' || val[0] == 'f') && + (val[1] == 'A' || val[1] == 'a') && + (val[2] == 'L' || val[2] == 'l') && + (val[3] == 'S' || val[3] == 's') && + (val[4] == 'E' || val[4] == 'e') && val[5] == '\0') { + return true; + } + // "IGNORE" + if ((val[0] == 'I' || val[0] == 'i') && + (val[1] == 'G' || val[1] == 'g') && + (val[2] == 'N' || val[2] == 'n') && + (val[3] == 'O' || val[3] == 'o') && + (val[4] == 'R' || val[4] == 'r') && + (val[5] == 'E' || val[5] == 'e') && val[6] == '\0') { + return true; + } + /* clang-format on */ + return cmSystemTools::IsNOTFOUND(val); +} + +bool cmSystemTools::IsOff(const std::string& val) +{ + return cmSystemTools::IsOff(val.c_str()); } void cmSystemTools::ParseWindowsCommandLine(const char* command, diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h index c0a1b6b..5c383ee 100644 --- a/Source/cmSystemTools.h +++ b/Source/cmSystemTools.h @@ -129,6 +129,7 @@ public: * as ifdef. */ static bool IsOn(const char* val); + static bool IsOn(const std::string& val); /** * does a string indicate a false or off value ? Note that this is @@ -138,6 +139,7 @@ public: * NOTFOUND, *-NOTFOUND or IGNORE will cause IsOff to return true. */ static bool IsOff(const char* val); + static bool IsOff(const std::string& val); ///! Return true if value is NOTFOUND or ends in -NOTFOUND. static bool IsNOTFOUND(const char* value); diff --git a/Source/cmUtilitySourceCommand.cxx b/Source/cmUtilitySourceCommand.cxx index a601637..f374626 100644 --- a/Source/cmUtilitySourceCommand.cxx +++ b/Source/cmUtilitySourceCommand.cxx @@ -28,7 +28,7 @@ bool cmUtilitySourceCommand::InitialPass(std::vector<std::string> const& args, // If it exists already and appears up to date then we are done. If // the string contains "(IntDir)" but that is not the // CMAKE_CFG_INTDIR setting then the value is out of date. - const char* intDir = + std::string const& intDir = this->Makefile->GetRequiredDefinition("CMAKE_CFG_INTDIR"); bool haveCacheValue = false; @@ -46,7 +46,7 @@ bool cmUtilitySourceCommand::InitialPass(std::vector<std::string> const& args, cmState* state = this->Makefile->GetState(); haveCacheValue = (cacheValue && (strstr(cacheValue, "(IntDir)") == nullptr || - (intDir && strcmp(intDir, "$(IntDir)") == 0)) && + (intDir == "$(IntDir)")) && (state->GetCacheMajorVersion() != 0 && state->GetCacheMinorVersion() != 0)); } diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index ea65e21..9e74335 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -1207,7 +1207,11 @@ void cmVisualStudio10TargetGenerator::WriteCustomCommands(Elem& e0) this->GeneratorTarget->GetName() != CMAKE_CHECK_BUILD_SYSTEM_TARGET) { if (cmSourceFile const* sf = this->LocalGenerator->CreateVCProjBuildRule()) { - this->WriteCustomCommand(e0, sf); + // Write directly rather than through WriteCustomCommand because + // we do not want the de-duplication and it has no dependencies. + if (cmCustomCommand const* command = sf->GetCustomCommand()) { + this->WriteCustomRule(e0, sf, *command); + } } } } @@ -1798,7 +1802,7 @@ void cmVisualStudio10TargetGenerator::WriteExtraSource(Elem& e1, "EnableDebuggingInformation", "'$(Configuration)|$(Platform)'=='" + this->Configurations[i] + "|" + this->Platform + "'", - cmSystemTools::IsOn(enableDebug.c_str()) ? "true" : "false"); + cmSystemTools::IsOn(enableDebug) ? "true" : "false"); } } } @@ -1815,8 +1819,7 @@ void cmVisualStudio10TargetGenerator::WriteExtraSource(Elem& e1, "DisableOptimizations", "'$(Configuration)|$(Platform)'=='" + this->Configurations[i] + "|" + this->Platform + "'", - (cmSystemTools::IsOn(disableOptimizations.c_str()) ? "true" - : "false")); + (cmSystemTools::IsOn(disableOptimizations) ? "true" : "false")); } } } @@ -2468,7 +2471,7 @@ bool cmVisualStudio10TargetGenerator::ComputeClOptions( baseFlagVar += "_FLAGS"; flags = this->Makefile->GetRequiredDefinition(baseFlagVar); std::string flagVar = - baseFlagVar + std::string("_") + cmSystemTools::UpperCase(configName); + baseFlagVar + "_" + cmSystemTools::UpperCase(configName); flags += " "; flags += this->Makefile->GetRequiredDefinition(flagVar); this->LocalGenerator->AddCompileOptions(flags, this->GeneratorTarget, diff --git a/Source/cmcmd.cxx b/Source/cmcmd.cxx index 2027722..87da108 100644 --- a/Source/cmcmd.cxx +++ b/Source/cmcmd.cxx @@ -917,8 +917,8 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string>& args) if (args.size() >= 9 && args[8].length() >= 8 && args[8].substr(0, 8) == "--color=") { // Enable or disable color based on the switch value. - color = (args[8].size() == 8 || - cmSystemTools::IsOn(args[8].substr(8).c_str())); + color = + (args[8].size() == 8 || cmSystemTools::IsOn(args[8].substr(8))); } } else { // Support older signature for existing makefiles: @@ -1354,7 +1354,7 @@ int cmcmd::ExecuteEchoColor(std::vector<std::string>& args) // Enable or disable color based on the switch value. std::string value = args[i].substr(9); if (!value.empty()) { - enabled = cmSystemTools::IsOn(value.c_str()); + enabled = cmSystemTools::IsOn(value); } } else if (cmHasLiteralPrefix(args[i], "--progress-dir=")) { progressDir = args[i].substr(15); @@ -1407,7 +1407,7 @@ int cmcmd::ExecuteLinkScript(std::vector<std::string>& args) bool verbose = false; if (args.size() >= 4) { if (args[3].find("--verbose=") == 0) { - if (!cmSystemTools::IsOff(args[3].substr(10).c_str())) { + if (!cmSystemTools::IsOff(args[3].substr(10))) { verbose = true; } } diff --git a/Tests/RunCMake/CPack/tests/PER_COMPONENT_FIELDS/VerifyResult.cmake b/Tests/RunCMake/CPack/tests/PER_COMPONENT_FIELDS/VerifyResult.cmake index 18ef63c..b4bdb61 100644 --- a/Tests/RunCMake/CPack/tests/PER_COMPONENT_FIELDS/VerifyResult.cmake +++ b/Tests/RunCMake/CPack/tests/PER_COMPONENT_FIELDS/VerifyResult.cmake @@ -1,7 +1,7 @@ function(checkPackageInfo_ TYPE FILE REGEX) getPackageInfo("${FILE}" "FILE_INFO_") if(NOT FILE_INFO_ MATCHES "${REGEX}") - message(FATAL_ERROR "Unexpected ${TYPE} in '${FILE}'; file info: '${FILE_INFO_}'") + message(FATAL_ERROR "Unexpected ${TYPE} in '${FILE}'; file info: '${FILE_INFO_}'; does not match '${REGEX}'") endif() endfunction() @@ -24,3 +24,15 @@ checkPackageInfo_("name" "${FOUND_FILE_3}" ".*${name_}${whitespaces_}:${whitespa checkPackageInfo_("group" "${FOUND_FILE_1}" ".*${group_}${whitespaces_}:${whitespaces_}default") checkPackageInfo_("group" "${FOUND_FILE_2}" ".*${group_}${whitespaces_}:${whitespaces_}second_group") checkPackageInfo_("group" "${FOUND_FILE_3}" ".*${group_}${whitespaces_}:${whitespaces_}default") + +# check package summaries (not available in DEB) +if(GENERATOR_TYPE STREQUAL "RPM") + checkPackageInfo_("summary" "${FOUND_FILE_1}" ".*Summary${whitespaces_}:${whitespaces_}Global summary") + checkPackageInfo_("summary" "${FOUND_FILE_2}" ".*Summary${whitespaces_}:${whitespaces_}Summary for pkg_2") + checkPackageInfo_("summary" "${FOUND_FILE_3}" ".*Summary${whitespaces_}:${whitespaces_}Global summary") +endif() + +# check package description +checkPackageInfo_("description" "${FOUND_FILE_1}" ".*Description${whitespaces_}:${whitespaces_}Description for pkg_1") +checkPackageInfo_("description" "${FOUND_FILE_2}" ".*Description${whitespaces_}:${whitespaces_}Description for pkg_2") +checkPackageInfo_("description" "${FOUND_FILE_3}" ".*Description${whitespaces_}:${whitespaces_}Description for pkg_3") diff --git a/Tests/RunCMake/CPack/tests/PER_COMPONENT_FIELDS/test.cmake b/Tests/RunCMake/CPack/tests/PER_COMPONENT_FIELDS/test.cmake index 8719c0b..dc61d0a 100644 --- a/Tests/RunCMake/CPack/tests/PER_COMPONENT_FIELDS/test.cmake +++ b/Tests/RunCMake/CPack/tests/PER_COMPONENT_FIELDS/test.cmake @@ -11,6 +11,13 @@ if(GENERATOR_TYPE STREQUAL "DEB" OR GENERATOR_TYPE STREQUAL "RPM") set(CPACK_${GENERATOR_TYPE}${generator_type_suffix_}_PACKAGE_${group_} "default") set(CPACK_${GENERATOR_TYPE}${generator_type_suffix_}_PKG_2_PACKAGE_NAME "second") set(CPACK_${GENERATOR_TYPE}${generator_type_suffix_}_PKG_2_PACKAGE_${group_} "second_group") + + set(CPACK_${GENERATOR_TYPE}${generator_type_suffix_}_PACKAGE_SUMMARY "Global summary") # not used for DEB + set(CPACK_${GENERATOR_TYPE}${generator_type_suffix_}_PKG_2_PACKAGE_SUMMARY "Summary for pkg_2") # not used for DEB + + set(CPACK_COMPONENT_PKG_1_DESCRIPTION "Description for pkg_1") + set(CPACK_COMPONENT_PKG_2_DESCRIPTION "Description for pkg_2") + set(CPACK_COMPONENT_PKG_3_DESCRIPTION "Description for pkg_3") endif() install(FILES CMakeLists.txt DESTINATION foo COMPONENT pkg_1) diff --git a/Tests/RunCMake/ExternalProject/IncludeScope-Add-result.txt b/Tests/RunCMake/ExternalProject/IncludeScope-Add-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/ExternalProject/IncludeScope-Add-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/ExternalProject/IncludeScope-Add-stderr.txt b/Tests/RunCMake/ExternalProject/IncludeScope-Add-stderr.txt new file mode 100644 index 0000000..ff3e5c1 --- /dev/null +++ b/Tests/RunCMake/ExternalProject/IncludeScope-Add-stderr.txt @@ -0,0 +1,7 @@ +^CMake Error at .*/Modules/ExternalProject.cmake:[0-9]+ \(message\): + error: ExternalProject module must be explicitly included before using + ExternalProject_Add function +Call Stack \(most recent call first\): + .*/Modules/ExternalProject.cmake:[0-9]+ \(_ep_parse_arguments\) + IncludeScope-Add.cmake:[0-9]+ \(ExternalProject_Add\) + CMakeLists.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/ExternalProject/IncludeScope-Add.cmake b/Tests/RunCMake/ExternalProject/IncludeScope-Add.cmake new file mode 100644 index 0000000..1061ffd --- /dev/null +++ b/Tests/RunCMake/ExternalProject/IncludeScope-Add.cmake @@ -0,0 +1,12 @@ +function(IncludeScope_IncludeOnly) + include(ExternalProject) +endfunction() + +IncludeScope_IncludeOnly() + +ExternalProject_Add(MyProj + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" +) diff --git a/Tests/RunCMake/ExternalProject/IncludeScope-Add_Step-result.txt b/Tests/RunCMake/ExternalProject/IncludeScope-Add_Step-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/ExternalProject/IncludeScope-Add_Step-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/ExternalProject/IncludeScope-Add_Step-stderr.txt b/Tests/RunCMake/ExternalProject/IncludeScope-Add_Step-stderr.txt new file mode 100644 index 0000000..cbad4be --- /dev/null +++ b/Tests/RunCMake/ExternalProject/IncludeScope-Add_Step-stderr.txt @@ -0,0 +1,7 @@ +^CMake Error at .*/Modules/ExternalProject.cmake:[0-9]+ \(message\): + error: ExternalProject module must be explicitly included before using + ExternalProject_Add_Step function +Call Stack \(most recent call first\): + .*/Modules/ExternalProject.cmake:[0-9]+ \(_ep_parse_arguments\) + IncludeScope-Add_Step.cmake:[0-9]+ \(ExternalProject_Add_Step\) + CMakeLists.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/ExternalProject/IncludeScope-Add_Step.cmake b/Tests/RunCMake/ExternalProject/IncludeScope-Add_Step.cmake new file mode 100644 index 0000000..2a820f8 --- /dev/null +++ b/Tests/RunCMake/ExternalProject/IncludeScope-Add_Step.cmake @@ -0,0 +1,13 @@ +function(IncludeScope_DefineProj) + include(ExternalProject) + ExternalProject_Add(MyProj + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + ) +endfunction() + +IncludeScope_DefineProj() + +ExternalProject_Add_Step(MyProj extraStep COMMENT "Foo") diff --git a/Tests/RunCMake/ExternalProject/RunCMakeTest.cmake b/Tests/RunCMake/ExternalProject/RunCMakeTest.cmake index 09607f6..bf11381 100644 --- a/Tests/RunCMake/ExternalProject/RunCMakeTest.cmake +++ b/Tests/RunCMake/ExternalProject/RunCMakeTest.cmake @@ -1,5 +1,7 @@ include(RunCMake) +run_cmake(IncludeScope-Add) +run_cmake(IncludeScope-Add_Step) run_cmake(NoOptions) run_cmake(SourceEmpty) run_cmake(SourceMissing) |