diff options
Diffstat (limited to 'Source')
-rw-r--r-- | Source/CMakeVersion.cmake | 2 | ||||
-rw-r--r-- | Source/CPack/cpack.cxx | 223 | ||||
-rw-r--r-- | Source/QtDialog/CMakeSetupDialog.cxx | 3 | ||||
-rw-r--r-- | Source/cmCommandLineArgument.h | 50 | ||||
-rw-r--r-- | Source/cmExportBuildFileGenerator.cxx | 93 | ||||
-rw-r--r-- | Source/cmFindBase.cxx | 59 | ||||
-rw-r--r-- | Source/cmFindCommon.cxx | 8 | ||||
-rw-r--r-- | Source/cmFindCommon.h | 1 | ||||
-rw-r--r-- | Source/cmFindPackageCommand.cxx | 52 | ||||
-rw-r--r-- | Source/cmInstallCommand.cxx | 6 | ||||
-rw-r--r-- | Source/cmPolicies.h | 6 | ||||
-rw-r--r-- | Source/cmVisualStudio10TargetGenerator.cxx | 14 | ||||
-rw-r--r-- | Source/cmake.cxx | 10 | ||||
-rw-r--r-- | Source/cmakemain.cxx | 87 |
14 files changed, 411 insertions, 203 deletions
diff --git a/Source/CMakeVersion.cmake b/Source/CMakeVersion.cmake index 3c340f9..423b5f6 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 23) -set(CMake_VERSION_PATCH 20220416) +set(CMake_VERSION_PATCH 20220422) #set(CMake_VERSION_RC 0) set(CMake_VERSION_IS_DIRTY 0) diff --git a/Source/CPack/cpack.cxx b/Source/CPack/cpack.cxx index f43642f..6c6d0ca 100644 --- a/Source/CPack/cpack.cxx +++ b/Source/CPack/cpack.cxx @@ -2,6 +2,7 @@ file Copyright.txt or https://cmake.org/licensing for details. */ #include <cstddef> +#include <functional> #include <iostream> #include <map> #include <memory> @@ -10,12 +11,14 @@ #include <utility> #include <vector> -#include "cmsys/CommandLineArguments.hxx" +#include <cmext/algorithm> + #include "cmsys/Encoding.hxx" #include "cmCPackGenerator.h" #include "cmCPackGeneratorFactory.h" #include "cmCPackLog.h" +#include "cmCommandLineArgument.h" #include "cmConsoleBuf.h" #include "cmDocumentation.h" #include "cmDocumentationEntry.h" @@ -58,39 +61,6 @@ const char* cmDocumentationOptions[][2] = { { nullptr, nullptr } }; -int cpackUnknownArgument(const char* /*unused*/, void* /*unused*/) -{ - return 1; -} - -struct cpackDefinitions -{ - using MapType = std::map<std::string, std::string>; - MapType Map; - cmCPackLog* Log{}; -}; - -int cpackDefinitionArgument(const char* argument, const char* cValue, - void* call_data) -{ - (void)argument; - cpackDefinitions* def = static_cast<cpackDefinitions*>(call_data); - std::string value = cValue; - size_t pos = value.find_first_of('='); - if (pos == std::string::npos) { - cmCPack_Log(def->Log, cmCPackLog::LOG_ERROR, - "Please specify CPack definitions as: KEY=VALUE" << std::endl); - return 0; - } - std::string key = value.substr(0, pos); - value.erase(0, pos + 1); - def->Map[key] = value; - cmCPack_Log(def->Log, cmCPackLog::LOG_DEBUG, - "Set CPack variable: " << key << " to \"" << value << "\"" - << std::endl); - return 1; -} - void cpackProgressCallback(const std::string& message, float /*unused*/) { std::cout << "-- " << message << std::endl; @@ -111,6 +81,10 @@ int main(int argc, char const* const* argv) argc = args.argc(); argv = args.argv(); + std::vector<std::string> inputArgs; + inputArgs.reserve(argc - 1); + cm::append(inputArgs, argv + 1, argv + argc); + cmSystemTools::InitializeLibUV(); cmSystemTools::FindCMakeResources(argv[0]); cmCPackLog log; @@ -130,10 +104,6 @@ int main(int argc, char const* const* argv) std::string generator; bool help = false; bool helpVersion = false; - bool verbose = false; - bool trace = false; - bool traceExpand = false; - bool debug = false; std::string helpFull; std::string helpMAN; std::string helpHTML; @@ -146,64 +116,93 @@ int main(int argc, char const* const* argv) std::string cpackProjectVendor; std::string cpackConfigFile; - cpackDefinitions definitions; - definitions.Log = &log; - - cpackConfigFile.clear(); - - cmsys::CommandLineArguments arg; - arg.Initialize(argc, argv); - using argT = cmsys::CommandLineArguments; - // Help arguments - arg.AddArgument("--help", argT::NO_ARGUMENT, &help, "CPack help"); - arg.AddArgument("--help-full", argT::SPACE_ARGUMENT, &helpFull, - "CPack help"); - arg.AddArgument("--help-html", argT::SPACE_ARGUMENT, &helpHTML, - "CPack help"); - arg.AddArgument("--help-man", argT::SPACE_ARGUMENT, &helpMAN, "CPack help"); - arg.AddArgument("--version", argT::NO_ARGUMENT, &helpVersion, "CPack help"); - - arg.AddArgument("-V", argT::NO_ARGUMENT, &verbose, "CPack verbose"); - arg.AddArgument("--verbose", argT::NO_ARGUMENT, &verbose, "-V"); - arg.AddArgument("--debug", argT::NO_ARGUMENT, &debug, "-V"); - arg.AddArgument("--config", argT::SPACE_ARGUMENT, &cpackConfigFile, - "CPack configuration file"); - arg.AddArgument("--trace", argT::NO_ARGUMENT, &trace, - "Put underlying cmake scripts in trace mode."); - arg.AddArgument("--trace-expand", argT::NO_ARGUMENT, &traceExpand, - "Put underlying cmake scripts in expanded trace mode."); - arg.AddArgument("-C", argT::SPACE_ARGUMENT, &cpackBuildConfig, - "CPack build configuration"); - arg.AddArgument("-G", argT::SPACE_ARGUMENT, &generator, "CPack generator"); - arg.AddArgument("-P", argT::SPACE_ARGUMENT, &cpackProjectName, - "CPack project name"); - arg.AddArgument("-R", argT::SPACE_ARGUMENT, &cpackProjectVersion, - "CPack project version"); - arg.AddArgument("-B", argT::SPACE_ARGUMENT, &cpackProjectDirectory, - "CPack project directory"); - arg.AddArgument("--patch", argT::SPACE_ARGUMENT, &cpackProjectPatch, - "CPack project patch"); - arg.AddArgument("--vendor", argT::SPACE_ARGUMENT, &cpackProjectVendor, - "CPack project vendor"); - arg.AddCallback("-D", argT::SPACE_ARGUMENT, cpackDefinitionArgument, - &definitions, "CPack Definitions"); - arg.SetUnknownArgumentCallback(cpackUnknownArgument); - - // Parse command line - int parsed = arg.Parse(); - - // Setup logging - if (verbose) { - log.SetVerbose(verbose); + std::map<std::string, std::string> definitions; + + auto const verboseLambda = [&log](const std::string&, cmake*, + cmMakefile*) -> bool { + log.SetVerbose(true); cmCPack_Log(&log, cmCPackLog::LOG_OUTPUT, "Enable Verbose" << std::endl); - } - if (debug) { - log.SetDebug(debug); - cmCPack_Log(&log, cmCPackLog::LOG_OUTPUT, "Enable Debug" << std::endl); - } + return true; + }; - cmCPack_Log(&log, cmCPackLog::LOG_VERBOSE, - "Read CPack config file: " << cpackConfigFile << std::endl); + auto const debugLambda = [&log](const std::string&, cmake*, + cmMakefile*) -> bool { + log.SetDebug(true); + cmCPack_Log(&log, cmCPackLog::LOG_OUTPUT, "Enable Debug" << std::endl); + return true; + }; + + auto const traceLambda = [](const std::string&, cmake* state, + cmMakefile*) -> bool { + state->SetTrace(true); + return true; + }; + + auto const traceExpandLambda = [](const std::string&, cmake* state, + cmMakefile*) -> bool { + state->SetTrace(true); + state->SetTraceExpand(true); + return true; + }; + + using CommandArgument = + cmCommandLineArgument<bool(std::string const&, cmake*, cmMakefile*)>; + + std::vector<CommandArgument> arguments = { + CommandArgument{ "--help", CommandArgument::Values::Zero, + CommandArgument::setToTrue(help) }, + CommandArgument{ "--help-full", CommandArgument::Values::Zero, + CommandArgument::setToValue(helpFull) }, + CommandArgument{ "--help-html", CommandArgument::Values::Zero, + CommandArgument::setToValue(helpHTML) }, + CommandArgument{ "--help-man", CommandArgument::Values::Zero, + CommandArgument::setToValue(helpMAN) }, + CommandArgument{ "--version", CommandArgument::Values::Zero, + CommandArgument::setToTrue(helpVersion) }, + CommandArgument{ "-V", CommandArgument::Values::Zero, verboseLambda }, + CommandArgument{ "--verbose", CommandArgument::Values::Zero, + verboseLambda }, + CommandArgument{ "--debug", CommandArgument::Values::Zero, debugLambda }, + CommandArgument{ "--config", CommandArgument::Values::One, + CommandArgument::setToValue(cpackConfigFile) }, + CommandArgument{ "--trace", CommandArgument::Values::One, traceLambda }, + CommandArgument{ "--trace-expand", CommandArgument::Values::One, + traceExpandLambda }, + CommandArgument{ "-C", CommandArgument::Values::One, + CommandArgument::setToValue(cpackBuildConfig) }, + CommandArgument{ "-G", CommandArgument::Values::One, + CommandArgument::setToValue(generator) }, + CommandArgument{ "-P", CommandArgument::Values::One, + CommandArgument::setToValue(cpackProjectName) }, + CommandArgument{ "-R", CommandArgument::Values::One, + CommandArgument::setToValue(cpackProjectVersion) }, + CommandArgument{ "-B", CommandArgument::Values::One, + CommandArgument::setToValue(cpackProjectDirectory) }, + CommandArgument{ "--patch", CommandArgument::Values::One, + CommandArgument::setToValue(cpackProjectPatch) }, + CommandArgument{ "--vendor", CommandArgument::Values::One, + CommandArgument::setToValue(cpackProjectVendor) }, + CommandArgument{ + "-D", CommandArgument::Values::One, + [&log, &definitions](const std::string& arg, cmake*, + cmMakefile*) -> bool { + std::string value = arg; + size_t pos = value.find_first_of('='); + if (pos == std::string::npos) { + cmCPack_Log(&log, cmCPackLog::LOG_ERROR, + "Please specify CPack definitions as: KEY=VALUE" + << std::endl); + return false; + } + std::string key = value.substr(0, pos); + value.erase(0, pos + 1); + definitions[key] = value; + cmCPack_Log(&log, cmCPackLog::LOG_DEBUG, + "Set CPack variable: " << key << " to \"" << value << "\"" + << std::endl); + return true; + } }, + }; cmake cminst(cmake::RoleScript, cmState::CPack); cminst.SetHomeDirectory(""); @@ -216,14 +215,22 @@ int main(int argc, char const* const* argv) globalMF.AddDefinition("CMAKE_LEGACY_CYGWIN_WIN32", "0"); #endif - if (trace) { - cminst.SetTrace(true); - } - if (traceExpand) { - cminst.SetTrace(true); - cminst.SetTraceExpand(true); + bool parsed = true; + for (std::size_t i = 0; i < inputArgs.size(); i++) { + auto const& arg = inputArgs[i]; + for (auto const& m : arguments) { + if (m.matches(arg)) { + if (!m.parse(arg, i, inputArgs, &cminst, &globalMF)) { + parsed = false; + } + break; + } + } } + cmCPack_Log(&log, cmCPackLog::LOG_VERBOSE, + "Read CPack config file: " << cpackConfigFile << std::endl); + bool cpackConfigFileSpecified = true; if (cpackConfigFile.empty()) { cpackConfigFile = cmStrCat(cmSystemTools::GetCurrentWorkingDirectory(), @@ -315,7 +322,7 @@ int main(int argc, char const* const* argv) cpackProjectDirectory); } } - for (auto const& cd : definitions.Map) { + for (auto const& cd : definitions) { globalMF.AddDefinition(cd.first, cd.second); } @@ -344,7 +351,7 @@ int main(int argc, char const* const* argv) if (!mf->GetDefinition("CPACK_PACKAGE_NAME")) { cmCPack_Log(&log, cmCPackLog::LOG_ERROR, "CPack project name not specified" << std::endl); - parsed = 0; + parsed = false; } if (parsed && !(mf->GetDefinition("CPACK_PACKAGE_VERSION") || @@ -359,14 +366,14 @@ int main(int argc, char const* const* argv) "CPACK_PACKAGE_VERSION_MINOR, and " "CPACK_PACKAGE_VERSION_PATCH." << std::endl); - parsed = 0; + parsed = false; } if (parsed) { std::unique_ptr<cmCPackGenerator> cpackGenerator = generators.NewGenerator(gen); if (cpackGenerator) { - cpackGenerator->SetTrace(trace); - cpackGenerator->SetTraceExpand(traceExpand); + cpackGenerator->SetTrace(cminst.GetTrace()); + cpackGenerator->SetTraceExpand(cminst.GetTraceExpand()); } else { cmCPack_Log(&log, cmCPackLog::LOG_ERROR, "Could not create CPack generator: " << gen @@ -384,14 +391,14 @@ int main(int argc, char const* const* argv) std::cerr << "\n"; generatorDocs.PrintDocumentation(cmDocumentation::ListGenerators, std::cerr); - parsed = 0; + parsed = false; } if (parsed && !cpackGenerator->Initialize(gen, mf)) { cmCPack_Log(&log, cmCPackLog::LOG_ERROR, "Cannot initialize the generator " << gen << std::endl); - parsed = 0; + parsed = false; } if (!mf->GetDefinition("CPACK_INSTALL_COMMANDS") && @@ -405,7 +412,7 @@ int main(int argc, char const* const* argv) "CPACK_INSTALL_COMMANDS, CPACK_INSTALL_SCRIPT, or " "CPACK_INSTALLED_DIRECTORIES." << std::endl); - parsed = 0; + parsed = false; } if (parsed) { cmValue projName = mf->GetDefinition("CPACK_PACKAGE_NAME"); diff --git a/Source/QtDialog/CMakeSetupDialog.cxx b/Source/QtDialog/CMakeSetupDialog.cxx index f90b781..3c41fce 100644 --- a/Source/QtDialog/CMakeSetupDialog.cxx +++ b/Source/QtDialog/CMakeSetupDialog.cxx @@ -226,7 +226,8 @@ CMakeSetupDialog::CMakeSetupDialog() this->SourceDirectory->setCompleter(new QCMakeFileCompleter(this, true)); // fixed pitch font in output window - QFont outputFont("Courier"); + QFont outputFont("Courier New"); + outputFont.setStyleHint(QFont::Monospace); this->Output->setFont(outputFont); this->ErrorFormat.setForeground(QBrush(Qt::red)); diff --git a/Source/cmCommandLineArgument.h b/Source/cmCommandLineArgument.h index 72ab045..33c91bc 100644 --- a/Source/cmCommandLineArgument.h +++ b/Source/cmCommandLineArgument.h @@ -201,7 +201,57 @@ struct cmCommandLineArgument return (parseState == ParseMode::Valid); } + template <typename... Values> + static std::function<FunctionSignature> setToTrue(Values&&... values) + { + return ArgumentLambdaHelper<FunctionSignature>::generateSetToTrue( + std::forward<Values>(values)...); + } + + template <typename... Values> + static std::function<FunctionSignature> setToValue(Values&&... values) + { + return ArgumentLambdaHelper<FunctionSignature>::generateSetToValue( + std::forward<Values>(values)...); + } + private: + template <typename T> + class ArgumentLambdaHelper; + + template <typename... CallState> + class ArgumentLambdaHelper<bool(const std::string&, CallState...)> + { + public: + static std::function<bool(const std::string&, CallState...)> + generateSetToTrue(bool& value1) + { + return [&value1](const std::string&, CallState&&...) -> bool { + value1 = true; + return true; + }; + } + + static std::function<bool(const std::string&, CallState...)> + generateSetToTrue(bool& value1, bool& value2) + { + return [&value1, &value2](const std::string&, CallState&&...) -> bool { + value1 = true; + value2 = true; + return true; + }; + } + + static std::function<bool(const std::string&, CallState...)> + generateSetToValue(std::string& value1) + { + return [&value1](const std::string& arg, CallState&&...) -> bool { + value1 = arg; + return true; + }; + } + }; + std::string extract_single_value(std::string const& input, ParseMode& parseState) const { diff --git a/Source/cmExportBuildFileGenerator.cxx b/Source/cmExportBuildFileGenerator.cxx index a306fdd..6ce0c98 100644 --- a/Source/cmExportBuildFileGenerator.cxx +++ b/Source/cmExportBuildFileGenerator.cxx @@ -2,6 +2,7 @@ file Copyright.txt or https://cmake.org/licensing for details. */ #include "cmExportBuildFileGenerator.h" +#include <algorithm> #include <map> #include <memory> #include <set> @@ -15,7 +16,6 @@ #include "cmGeneratorExpression.h" #include "cmGeneratorTarget.h" #include "cmGlobalGenerator.h" -#include "cmListFileCache.h" #include "cmLocalGenerator.h" #include "cmMakefile.h" #include "cmMessageType.h" @@ -357,16 +357,93 @@ std::string cmExportBuildFileGenerator::InstallNameDir( return install_name_dir; } +namespace { +bool EntryIsContextSensitive( + const std::unique_ptr<cmCompiledGeneratorExpression>& cge) +{ + return cge->GetHadContextSensitiveCondition(); +} +} + std::string cmExportBuildFileGenerator::GetFileSetDirectories( - cmGeneratorTarget* /*gte*/, cmFileSet* fileSet, cmTargetExport* /*te*/) + cmGeneratorTarget* gte, cmFileSet* fileSet, cmTargetExport* /*te*/) { - return cmOutputConverter::EscapeForCMake( - cmJoin(fileSet->GetDirectoryEntries(), ";")); + std::vector<std::string> resultVector; + + auto configs = + gte->Makefile->GetGeneratorConfigs(cmMakefile::IncludeEmptyConfig); + auto directoryEntries = fileSet->CompileDirectoryEntries(); + + for (auto const& config : configs) { + auto directories = fileSet->EvaluateDirectoryEntries( + directoryEntries, gte->LocalGenerator, config, gte); + + bool const contextSensitive = + std::any_of(directoryEntries.begin(), directoryEntries.end(), + EntryIsContextSensitive); + + for (auto const& directory : directories) { + auto dest = cmOutputConverter::EscapeForCMake( + directory, cmOutputConverter::WrapQuotes::NoWrap); + + if (contextSensitive && configs.size() != 1) { + resultVector.push_back( + cmStrCat("\"$<$<CONFIG:", config, ">:", dest, ">\"")); + } else { + resultVector.push_back(cmStrCat('"', dest, '"')); + break; + } + } + } + + return cmJoin(resultVector, " "); } -std::string cmExportBuildFileGenerator::GetFileSetFiles( - cmGeneratorTarget* /*gte*/, cmFileSet* fileSet, cmTargetExport* /*te*/) +std::string cmExportBuildFileGenerator::GetFileSetFiles(cmGeneratorTarget* gte, + cmFileSet* fileSet, + cmTargetExport* /*te*/) { - return cmOutputConverter::EscapeForCMake( - cmJoin(fileSet->GetFileEntries(), ";")); + std::vector<std::string> resultVector; + + auto configs = + gte->Makefile->GetGeneratorConfigs(cmMakefile::IncludeEmptyConfig); + + auto fileEntries = fileSet->CompileFileEntries(); + auto directoryEntries = fileSet->CompileDirectoryEntries(); + + for (auto const& config : configs) { + auto directories = fileSet->EvaluateDirectoryEntries( + directoryEntries, gte->LocalGenerator, config, gte); + + std::map<std::string, std::vector<std::string>> files; + for (auto const& entry : fileEntries) { + fileSet->EvaluateFileEntry(directories, files, entry, + gte->LocalGenerator, config, gte); + } + + bool const contextSensitive = + std::any_of(directoryEntries.begin(), directoryEntries.end(), + EntryIsContextSensitive) || + std::any_of(fileEntries.begin(), fileEntries.end(), + EntryIsContextSensitive); + + for (auto const& it : files) { + for (auto const& filename : it.second) { + auto escapedFile = cmOutputConverter::EscapeForCMake( + filename, cmOutputConverter::WrapQuotes::NoWrap); + if (contextSensitive && configs.size() != 1) { + resultVector.push_back( + cmStrCat("\"$<$<CONFIG:", config, ">:", escapedFile, ">\"")); + } else { + resultVector.push_back(cmStrCat('"', escapedFile, '"')); + } + } + } + + if (!(contextSensitive && configs.size() != 1)) { + break; + } + } + + return cmJoin(resultVector, " "); } diff --git a/Source/cmFindBase.cxx b/Source/cmFindBase.cxx index efc4e3a..a8db63d 100644 --- a/Source/cmFindBase.cxx +++ b/Source/cmFindBase.cxx @@ -267,8 +267,61 @@ void cmFindBase::FillCMakeSystemVariablePath() { cmSearchPath& paths = this->LabeledPaths[PathLabel::CMakeSystem]; + const bool install_prefix_in_list = + !this->Makefile->IsOn("CMAKE_FIND_NO_INSTALL_PREFIX"); + const bool remove_install_prefix = this->NoCMakeInstallPath; + const bool add_install_prefix = !this->NoCMakeInstallPath && + this->Makefile->IsDefinitionSet("CMAKE_FIND_USE_INSTALL_PREFIX"); + + // We have 3 possible states for `CMAKE_SYSTEM_PREFIX_PATH` and + // `CMAKE_INSTALL_PREFIX`. + // Either we need to remove `CMAKE_INSTALL_PREFIX`, add + // `CMAKE_INSTALL_PREFIX`, or do nothing. + // + // When we need to remove `CMAKE_INSTALL_PREFIX` we remove the Nth occurrence + // of `CMAKE_INSTALL_PREFIX` from `CMAKE_SYSTEM_PREFIX_PATH`, where `N` is + // computed by `CMakeSystemSpecificInformation.cmake` while constructing + // `CMAKE_SYSTEM_PREFIX_PATH`. This ensures that if projects / toolchains + // have removed `CMAKE_INSTALL_PREFIX` from the list, we don't remove + // some other entry by mistake + long install_prefix_count = -1; + std::string install_path_to_remove; + if (cmValue to_skip = this->Makefile->GetDefinition( + "_CMAKE_SYSTEM_PREFIX_PATH_INSTALL_PREFIX_COUNT")) { + cmStrToLong(to_skip, &install_prefix_count); + } + if (cmValue install_value = this->Makefile->GetDefinition( + "_CMAKE_SYSTEM_PREFIX_PATH_INSTALL_PREFIX_VALUE")) { + install_path_to_remove = *install_value; + } + + if (remove_install_prefix && install_prefix_in_list && + install_prefix_count > 0 && !install_path_to_remove.empty()) { + cmValue prefix_paths = + this->Makefile->GetDefinition("CMAKE_SYSTEM_PREFIX_PATH"); + + // remove entry from CMAKE_SYSTEM_PREFIX_PATH + std::vector<std::string> expanded = cmExpandedList(*prefix_paths); + long index_to_remove = 0; + for (const auto& path : expanded) { + if (path == install_path_to_remove && --install_prefix_count == 0) { + break; + } + ++index_to_remove; + } + expanded.erase(expanded.begin() + index_to_remove); + paths.AddPrefixPaths(expanded, + this->Makefile->GetCurrentSourceDirectory().c_str()); + } else if (add_install_prefix && !install_prefix_in_list) { + + paths.AddCMakePrefixPath("CMAKE_INSTALL_PREFIX"); + paths.AddCMakePrefixPath("CMAKE_SYSTEM_PREFIX_PATH"); + } else { + // Otherwise the current setup of `CMAKE_SYSTEM_PREFIX_PATH` is correct + paths.AddCMakePrefixPath("CMAKE_SYSTEM_PREFIX_PATH"); + } + std::string var = cmStrCat("CMAKE_SYSTEM_", this->CMakePathName, "_PATH"); - paths.AddCMakePrefixPath("CMAKE_SYSTEM_PREFIX_PATH"); paths.AddCMakePath(var); if (this->CMakePathName == "PROGRAM") { @@ -496,7 +549,9 @@ cmFindBaseDebugState::~cmFindBaseDebugState() " CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: ", !this->FindCommand->NoSystemEnvironmentPath, "\n", " CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: ", - !this->FindCommand->NoCMakeSystemPath, "\n"); + !this->FindCommand->NoCMakeSystemPath, "\n", + " CMAKE_FIND_USE_INSTALL_PREFIX: ", + !this->FindCommand->NoCMakeInstallPath, "\n"); } buffer += diff --git a/Source/cmFindCommon.cxx b/Source/cmFindCommon.cxx index 7106e4b..9fd712a 100644 --- a/Source/cmFindCommon.cxx +++ b/Source/cmFindCommon.cxx @@ -39,6 +39,7 @@ cmFindCommon::cmFindCommon(cmExecutionStatus& status) this->NoCMakeEnvironmentPath = false; this->NoSystemEnvironmentPath = false; this->NoCMakeSystemPath = false; + this->NoCMakeInstallPath = false; // OS X Bundle and Framework search policy. The default is to // search frameworks first on apple. @@ -179,14 +180,15 @@ void cmFindCommon::SelectDefaultMacMode() void cmFindCommon::SelectDefaultSearchModes() { - const std::array<std::pair<bool&, std::string>, 5> search_paths = { + const std::array<std::pair<bool&, std::string>, 6> search_paths = { { { this->NoPackageRootPath, "CMAKE_FIND_USE_PACKAGE_ROOT_PATH" }, { this->NoCMakePath, "CMAKE_FIND_USE_CMAKE_PATH" }, { this->NoCMakeEnvironmentPath, "CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH" }, { this->NoSystemEnvironmentPath, "CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH" }, - { this->NoCMakeSystemPath, "CMAKE_FIND_USE_CMAKE_SYSTEM_PATH" } } + { this->NoCMakeSystemPath, "CMAKE_FIND_USE_CMAKE_SYSTEM_PATH" }, + { this->NoCMakeInstallPath, "CMAKE_FIND_USE_INSTALL_PREFIX" } } }; for (auto const& path : search_paths) { @@ -348,6 +350,8 @@ bool cmFindCommon::CheckCommonArgument(std::string const& arg) this->NoSystemEnvironmentPath = true; } else if (arg == "NO_CMAKE_SYSTEM_PATH") { this->NoCMakeSystemPath = true; + } else if (arg == "NO_CMAKE_INSTALL_PREFIX") { + this->NoCMakeInstallPath = true; } else if (arg == "NO_CMAKE_FIND_ROOT_PATH") { this->FindRootPathMode = RootPathModeNever; } else if (arg == "ONLY_CMAKE_FIND_ROOT_PATH") { diff --git a/Source/cmFindCommon.h b/Source/cmFindCommon.h index 5d9b3e1..4c02df0 100644 --- a/Source/cmFindCommon.h +++ b/Source/cmFindCommon.h @@ -130,6 +130,7 @@ protected: bool NoCMakeEnvironmentPath; bool NoSystemEnvironmentPath; bool NoCMakeSystemPath; + bool NoCMakeInstallPath; std::vector<std::string> SearchPathSuffixes; diff --git a/Source/cmFindPackageCommand.cxx b/Source/cmFindPackageCommand.cxx index 18457a7..9a89935 100644 --- a/Source/cmFindPackageCommand.cxx +++ b/Source/cmFindPackageCommand.cxx @@ -1682,7 +1682,57 @@ void cmFindPackageCommand::FillPrefixesCMakeSystemVariable() { cmSearchPath& paths = this->LabeledPaths[PathLabel::CMakeSystem]; - paths.AddCMakePath("CMAKE_SYSTEM_PREFIX_PATH"); + const bool install_prefix_in_list = + !this->Makefile->IsOn("CMAKE_FIND_NO_INSTALL_PREFIX"); + const bool remove_install_prefix = this->NoCMakeInstallPath; + const bool add_install_prefix = !this->NoCMakeInstallPath && + this->Makefile->IsDefinitionSet("CMAKE_FIND_USE_INSTALL_PREFIX"); + + // We have 3 possible states for `CMAKE_SYSTEM_PREFIX_PATH` and + // `CMAKE_INSTALL_PREFIX`. + // Either we need to remove `CMAKE_INSTALL_PREFIX`, add + // `CMAKE_INSTALL_PREFIX`, or do nothing. + // + // When we need to remove `CMAKE_INSTALL_PREFIX` we remove the Nth occurrence + // of `CMAKE_INSTALL_PREFIX` from `CMAKE_SYSTEM_PREFIX_PATH`, where `N` is + // computed by `CMakeSystemSpecificInformation.cmake` while constructing + // `CMAKE_SYSTEM_PREFIX_PATH`. This ensures that if projects / toolchains + // have removed `CMAKE_INSTALL_PREFIX` from the list, we don't remove + // some other entry by mistake + long install_prefix_count = -1; + std::string install_path_to_remove; + if (cmValue to_skip = this->Makefile->GetDefinition( + "_CMAKE_SYSTEM_PREFIX_PATH_INSTALL_PREFIX_COUNT")) { + cmStrToLong(to_skip, &install_prefix_count); + } + if (cmValue install_value = this->Makefile->GetDefinition( + "_CMAKE_SYSTEM_PREFIX_PATH_INSTALL_PREFIX_VALUE")) { + install_path_to_remove = *install_value; + } + + if (remove_install_prefix && install_prefix_in_list && + install_prefix_count > 0 && !install_path_to_remove.empty()) { + + cmValue prefix_paths = + this->Makefile->GetDefinition("CMAKE_SYSTEM_PREFIX_PATH"); + // remove entry from CMAKE_SYSTEM_PREFIX_PATH + std::vector<std::string> expanded = cmExpandedList(*prefix_paths); + long count = 0; + for (const auto& path : expanded) { + bool to_add = + !(path == install_path_to_remove && ++count == install_prefix_count); + if (to_add) { + paths.AddPath(path); + } + } + } else if (add_install_prefix && !install_prefix_in_list) { + paths.AddCMakePath("CMAKE_INSTALL_PREFIX"); + paths.AddCMakePath("CMAKE_SYSTEM_PREFIX_PATH"); + } else { + // Otherwise the current setup of `CMAKE_SYSTEM_PREFIX_PATH` is correct + paths.AddCMakePath("CMAKE_SYSTEM_PREFIX_PATH"); + } + paths.AddCMakePath("CMAKE_SYSTEM_FRAMEWORK_PATH"); paths.AddCMakePath("CMAKE_SYSTEM_APPBUNDLE_PATH"); diff --git a/Source/cmInstallCommand.cxx b/Source/cmInstallCommand.cxx index 7de2cb1..7ca5b23 100644 --- a/Source/cmInstallCommand.cxx +++ b/Source/cmInstallCommand.cxx @@ -742,9 +742,9 @@ bool HandleTargetsMode(std::vector<std::string> const& args, [=](const cmInstallCommandFileSetArguments& fileSetArg) -> bool { return fileSetArg.GetFileSet() == name; }); })) { - status.SetError(cmStrCat( - "TARGETS target ", target.GetName(), - " is exported but not all of its file sets are installed")); + status.SetError(cmStrCat("TARGETS target ", target.GetName(), + " is exported but not all of its interface " + "file sets are installed")); return false; } diff --git a/Source/cmPolicies.h b/Source/cmPolicies.h index 434c51c..5393747 100644 --- a/Source/cmPolicies.h +++ b/Source/cmPolicies.h @@ -396,7 +396,11 @@ class cmMakefile; 24, 0, cmPolicies::WARN) \ SELECT(POLICY, CMP0132, \ "Do not set compiler environment variables on first run", 3, 24, 0, \ - cmPolicies::WARN) + cmPolicies::WARN) \ + SELECT(POLICY, CMP0133, \ + "The CPack module disables SLA by default in the CPack DragNDrop " \ + "Generator.", \ + 3, 24, 0, cmPolicies::WARN) #define CM_SELECT_ID(F, A1, A2, A3, A4, A5, A6) F(A1) #define CM_FOR_EACH_POLICY_ID(POLICY) \ diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index 276eccf..cf0cb17 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -664,6 +664,14 @@ void cmVisualStudio10TargetGenerator::WriteClassicMsBuildProjectFile( } } + cmValue startupObject = + this->GeneratorTarget->GetProperty("VS_DOTNET_STARTUP_OBJECT"); + + if (startupObject && this->Managed) { + Elem e1(e0, "PropertyGroup"); + e1.Element("StartupObject", *startupObject); + } + switch (this->ProjectType) { case VsProjectType::vcxproj: { std::string const& props = @@ -927,6 +935,12 @@ void cmVisualStudio10TargetGenerator::WriteSdkStyleProjectFile( break; } e1.Element("OutputType", outputType); + + cmValue startupObject = + this->GeneratorTarget->GetProperty("VS_DOTNET_STARTUP_OBJECT"); + if (startupObject) { + e1.Element("StartupObject", *startupObject); + } } for (const std::string& config : this->Configurations) { diff --git a/Source/cmake.cxx b/Source/cmake.cxx index 5bfc4c8..1c027ad 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -565,10 +565,7 @@ bool cmake::SetCacheArgs(const std::vector<std::string>& args) "No install directory specified for --install-prefix", CommandArgument::Values::One, PrefixLambda }, CommandArgument{ "--find-package", CommandArgument::Values::Zero, - [&](std::string const&, cmake*) -> bool { - findPackageMode = true; - return true; - } }, + CommandArgument::setToTrue(findPackageMode) }, }; for (decltype(args.size()) i = 1; i < args.size(); ++i) { std::string const& arg = args[i]; @@ -876,10 +873,7 @@ void cmake::SetArgs(const std::vector<std::string>& args) CommandArgument{ "-P", "-P must be followed by a file name.", CommandArgument::Values::One, CommandArgument::RequiresSeparator::No, - [&](std::string const&, cmake*) -> bool { - scriptMode = true; - return true; - } }, + CommandArgument::setToTrue(scriptMode) }, CommandArgument{ "-D", "-D must be followed with VAR=VALUE.", CommandArgument::Values::One, CommandArgument::RequiresSeparator::No, diff --git a/Source/cmakemain.cxx b/Source/cmakemain.cxx index 28be166..41c6c12 100644 --- a/Source/cmakemain.cxx +++ b/Source/cmakemain.cxx @@ -9,6 +9,7 @@ #include <climits> #include <cstdio> #include <cstring> +#include <functional> #include <iostream> #include <sstream> #include <string> @@ -262,37 +263,17 @@ int do_cmake(int ac, char const* const* av) return true; } }, CommandArgument{ "--system-information", CommandArgument::Values::Zero, - [&](std::string const&) -> bool { - sysinfo = true; - return true; - } }, + CommandArgument::setToTrue(sysinfo) }, CommandArgument{ "-N", CommandArgument::Values::Zero, - [&](std::string const&) -> bool { - view_only = true; - return true; - } }, + CommandArgument::setToTrue(view_only) }, CommandArgument{ "-LAH", CommandArgument::Values::Zero, - [&](std::string const&) -> bool { - list_all_cached = true; - list_help = true; - return true; - } }, + CommandArgument::setToTrue(list_all_cached, list_help) }, CommandArgument{ "-LA", CommandArgument::Values::Zero, - [&](std::string const&) -> bool { - list_all_cached = true; - return true; - } }, + CommandArgument::setToTrue(list_all_cached) }, CommandArgument{ "-LH", CommandArgument::Values::Zero, - [&](std::string const&) -> bool { - list_cached = true; - list_help = true; - return true; - } }, + CommandArgument::setToTrue(list_cached, list_help) }, CommandArgument{ "-L", CommandArgument::Values::Zero, - [&](std::string const&) -> bool { - list_cached = true; - return true; - } }, + CommandArgument::setToTrue(list_cached) }, CommandArgument{ "-P", "No script specified for argument -P", CommandArgument::Values::One, CommandArgument::RequiresSeparator::No, @@ -510,15 +491,9 @@ int do_build(int ac, char const* const* av) std::vector<CommandArgument> arguments = { CommandArgument{ "--preset", CommandArgument::Values::One, - [&](std::string const& value) -> bool { - presetName = value; - return true; - } }, + CommandArgument::setToValue(presetName) }, CommandArgument{ "--list-presets", CommandArgument::Values::Zero, - [&](std::string const&) -> bool { - listPresets = true; - return true; - } }, + CommandArgument::setToTrue(listPresets) }, CommandArgument{ "-j", CommandArgument::Values::ZeroOrOne, CommandArgument::RequiresSeparator::No, jLambda }, CommandArgument{ "--parallel", CommandArgument::Values::ZeroOrOne, @@ -527,15 +502,9 @@ int do_build(int ac, char const* const* av) CommandArgument{ "--target", CommandArgument::Values::OneOrMore, targetLambda }, CommandArgument{ "--config", CommandArgument::Values::One, - [&](std::string const& value) -> bool { - config = value; - return true; - } }, + CommandArgument::setToValue(config) }, CommandArgument{ "--clean-first", CommandArgument::Values::Zero, - [&](std::string const&) -> bool { - cleanFirst = true; - return true; - } }, + CommandArgument::setToTrue(cleanFirst) }, CommandArgument{ "--resolve-package-references", CommandArgument::Values::One, resolvePackagesLambda }, CommandArgument{ "-v", CommandArgument::Values::Zero, verboseLambda }, @@ -545,10 +514,7 @@ int do_build(int ac, char const* const* av) CommandArgument{ "--use-stderr", CommandArgument::Values::Zero, [](std::string const&) -> bool { return true; } }, CommandArgument{ "--", CommandArgument::Values::Zero, - [&](std::string const&) -> bool { - nativeOptionsPassed = true; - return true; - } }, + CommandArgument::setToTrue(nativeOptionsPassed) }, }; if (ac >= 3) { @@ -831,31 +797,16 @@ int do_install(int ac, char const* const* av) std::vector<CommandArgument> arguments = { CommandArgument{ "--config", CommandArgument::Values::One, - [&](std::string const& value) -> bool { - config = value; - return true; - } }, + CommandArgument::setToValue(config) }, CommandArgument{ "--component", CommandArgument::Values::One, - [&](std::string const& value) -> bool { - component = value; - return true; - } }, - CommandArgument{ "--default-directory-permissions", - CommandArgument::Values::One, - [&](std::string const& value) -> bool { - defaultDirectoryPermissions = value; - return true; - } }, + CommandArgument::setToValue(component) }, + CommandArgument{ + "--default-directory-permissions", CommandArgument::Values::One, + CommandArgument::setToValue(defaultDirectoryPermissions) }, CommandArgument{ "--prefix", CommandArgument::Values::One, - [&](std::string const& value) -> bool { - prefix = value; - return true; - } }, + CommandArgument::setToValue(prefix) }, CommandArgument{ "--strip", CommandArgument::Values::Zero, - [&](std::string const&) -> bool { - strip = true; - return true; - } }, + CommandArgument::setToTrue(strip) }, CommandArgument{ "-v", CommandArgument::Values::Zero, verboseLambda }, CommandArgument{ "--verbose", CommandArgument::Values::Zero, verboseLambda } |