summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Help/cpack_gen/nuget.rst164
-rw-r--r--Help/release/3.30.rst7
-rw-r--r--Modules/Internal/CPack/CPackRPM.cmake2
-rw-r--r--Source/cmGlobalCommonGenerator.cxx6
-rw-r--r--Source/cmGlobalNinjaGenerator.cxx59
-rw-r--r--Source/cmGlobalNinjaGenerator.h2
-rw-r--r--Source/cmLocalCommonGenerator.cxx14
-rw-r--r--Source/cmLocalNinjaGenerator.cxx7
-rw-r--r--Source/cmNinjaTargetGenerator.cxx3
-rw-r--r--Tests/RunCMake/add_subdirectory/ChangeConfigMulti.cmake1
-rw-r--r--Tests/RunCMake/add_subdirectory/ChangeConfigMulti/CMakeLists.txt1
-rw-r--r--Tests/RunCMake/add_subdirectory/RunCMakeTest.cmake4
12 files changed, 180 insertions, 90 deletions
diff --git a/Help/cpack_gen/nuget.rst b/Help/cpack_gen/nuget.rst
index e25364f..d97f0c0 100644
--- a/Help/cpack_gen/nuget.rst
+++ b/Help/cpack_gen/nuget.rst
@@ -34,6 +34,17 @@ List of CPack NuGet generator specific variables:
:Mandatory: No
:Default: ``OFF``
+.. variable:: CPACK_NUGET_PACKAGE_DEBUG
+
+ Enable debug messages while executing CPack NuGet generator.
+
+ :Mandatory: No
+ :Default: ``OFF``
+
+
+Required metadata variables
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
.. variable:: CPACK_NUGET_PACKAGE_NAME
CPACK_NUGET_<compName>_PACKAGE_NAME
@@ -74,22 +85,16 @@ List of CPack NuGet generator specific variables:
:Mandatory: Yes
:Default: :variable:`CPACK_PACKAGE_VENDOR`
-.. variable:: CPACK_NUGET_PACKAGE_TITLE
- CPACK_NUGET_<compName>_PACKAGE_TITLE
-
- A human-friendly title of the package, typically used in UI displays
- as on nuget.org_ and the Package Manager in Visual Studio. If not
- specified, the package ID is used.
-
- :Mandatory: No
- :Default:
- - :variable:`CPACK_COMPONENT_<compName>_DISPLAY_NAME`,
- - :variable:`!CPACK_COMPONENT_GROUP_<groupName>_DISPLAY_NAME`
+Optional metadata variables
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. variable:: CPACK_NUGET_PACKAGE_OWNERS
CPACK_NUGET_<compName>_PACKAGE_OWNERS
+ .. deprecated:: 3.30
+ Use authors (:variable:`CPACK_NUGET_PACKAGE_AUTHORS`) instead.
+
A comma-separated list of the package creators using profile names
on nuget.org_. This is often the same list as in authors,
and is ignored when uploading the package to nuget.org_.
@@ -120,6 +125,21 @@ List of CPack NuGet generator specific variables:
:Mandatory: No
:Default: None
+ :Supported: NuGet 4.9.0 and above
+
+.. variable:: CPACK_NUGET_PACKAGE_LICENSE_FILE_NAME
+ CPACK_NUGET_<compName>_PACKAGE_LICENSE_FILE_NAME
+
+ .. versionadded:: 3.20
+
+ The package's license file in :file:`.txt` or :file:`.md` format.
+
+ If :variable:`!CPACK_NUGET_PACKAGE_LICENSE_FILE_NAME` is specified,
+ :variable:`!CPACK_NUGET_PACKAGE_LICENSE_EXPRESSION` is ignored.
+
+ :Mandatory: No
+ :Default: None
+ :Supported: NuGet 4.9.0 and above
.. variable:: CPACK_NUGET_PACKAGE_LICENSE_EXPRESSION
CPACK_NUGET_<compName>_PACKAGE_LICENSE_EXPRESSION
@@ -139,19 +159,6 @@ List of CPack NuGet generator specific variables:
:Mandatory: No
:Default: None
-.. variable:: CPACK_NUGET_PACKAGE_LICENSE_FILE_NAME
- CPACK_NUGET_<compName>_PACKAGE_LICENSE_FILE_NAME
-
- The package's license file in :file:`.txt` or :file:`.md` format.
-
- If :variable:`!CPACK_NUGET_PACKAGE_LICENSE_FILE_NAME` is specified,
- :variable:`!CPACK_NUGET_PACKAGE_LICENSE_EXPRESSION` is ignored.
-
- .. versionadded:: 3.20
-
- :Mandatory: No
- :Default: None
-
.. variable:: CPACK_NUGET_PACKAGE_ICONURL
CPACK_NUGET_<compName>_PACKAGE_ICONURL
@@ -164,14 +171,6 @@ List of CPack NuGet generator specific variables:
:Mandatory: No
:Default: None
-.. variable:: CPACK_NUGET_PACKAGE_REQUIRE_LICENSE_ACCEPTANCE
-
- When set to a true value, the user will be prompted to accept the license
- before installing the package.
-
- :Mandatory: No
- :Default: None
-
.. variable:: CPACK_NUGET_PACKAGE_ICON
CPACK_NUGET_<compName>_PACKAGE_ICON
@@ -182,10 +181,36 @@ List of CPack NuGet generator specific variables:
:Mandatory: No
:Default: None
+ :Supported: NuGet 5.3.0 and above
+
+
+.. variable:: CPACK_NUGET_PACKAGE_README
+ CPACK_NUGET_<compName>_PACKAGE_README
+
+ .. versionadded:: 3.30
+
+ The package path relative to the root of the package to a readme file.
+ Supported file formats include only Markdown (``*.md``).
+
+ :Mandatory: No
+ :Default: None
+ :Supported: NuGet 5.10.0 preview 2 and above
+
+.. variable:: CPACK_NUGET_PACKAGE_REQUIRE_LICENSE_ACCEPTANCE
+
+ When set to a true value, the user will be prompted to accept the license
+ before installing the package.
+
+ :Mandatory: No
+ :Default: None
.. variable:: CPACK_NUGET_PACKAGE_DESCRIPTION_SUMMARY
CPACK_NUGET_<compName>_PACKAGE_DESCRIPTION_SUMMARY
+ .. deprecated:: 3.30
+ Summary is being deprecated. Use description
+ (:variable:`CPACK_NUGET_PACKAGE_DESCRIPTION`) instead.
+
A short description of the package for UI display. If omitted, a
truncated version of description is used.
@@ -230,6 +255,71 @@ List of CPack NuGet generator specific variables:
:Mandatory: No
:Default: None
+.. variable:: CPACK_NUGET_PACKAGE_REPOSITORY_URL
+ CPACK_NUGET_<compName>_REPOSITORY_URL
+
+ .. versionadded:: 3.30
+
+ Repository metadata allows you to map the ``*.nupkg`` to the repository
+ that built it. This should be a publicly available URL that can be invoked
+ directly by a version control software. It should not be an HTML page as
+ this is meant for the computer.
+
+ :Mandatory: No
+ :Default: None
+ :Supported: NuGet 4.0 and above
+
+.. variable:: CPACK_NUGET_PACKAGE_REPOSITORY_TYPE
+ CPACK_NUGET_<compName>_REPOSITORY_TYPE
+
+ .. versionadded:: 3.30
+
+ A type of the VCS repository. When uploading a package to nuget.org_, the
+ type is limited to 100 characters.
+
+ :Mandatory: Yes, if repository URL has been specified
+ :Default: None
+ :Supported: NuGet 4.0 and above
+
+.. variable:: CPACK_NUGET_PACKAGE_REPOSITORY_BRANCH
+ CPACK_NUGET_<compName>_REPOSITORY_BRANCH
+
+ .. versionadded:: 3.30
+
+ A VSC branch name to build the package.
+
+ :Mandatory: No
+ :Default: None
+ :Supported: NuGet 4.6 and above
+
+.. variable:: CPACK_NUGET_PACKAGE_REPOSITORY_COMMIT
+ CPACK_NUGET_<compName>_REPOSITORY_COMMIT
+
+ .. versionadded:: 3.30
+
+ A SHA-1 hash of the commit to build the package.
+
+ :Mandatory: No
+ :Default: None
+ :Supported: NuGet 4.6 and above
+
+.. variable:: CPACK_NUGET_PACKAGE_TITLE
+ CPACK_NUGET_<compName>_PACKAGE_TITLE
+
+ A human-friendly title of the package, typically used in UI displays
+ as on nuget.org_ and the Package Manager in Visual Studio. If not
+ specified, the package ID is used.
+
+ :Mandatory: No
+ :Default:
+
+ - :variable:`CPACK_COMPONENT_<compName>_DISPLAY_NAME`,
+ - :variable:`!CPACK_COMPONENT_GROUP_<groupName>_DISPLAY_NAME`
+
+
+Dependencies specification
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
.. variable:: CPACK_NUGET_PACKAGE_DEPENDENCIES
CPACK_NUGET_<compName>_PACKAGE_DEPENDENCIES
@@ -284,13 +374,6 @@ List of CPack NuGet generator specific variables:
:Mandatory: No
:Default: None
-.. variable:: CPACK_NUGET_PACKAGE_DEBUG
-
- Enable debug messages while executing CPack NuGet generator.
-
- :Mandatory: No
- :Default: ``OFF``
-
Example usage
^^^^^^^^^^^^^
@@ -302,9 +385,8 @@ Example usage
set(CPACK_PACKAGE_NAME SamplePackage)
set(CPACK_PACKAGE_VERSION "1.0.0")
set(CPACK_PACKAGE_VENDOR "Example Inc")
- set(CPACK_NUGET_PACKAGE_OWNERS "Example Inc")
+ set(CPACK_NUGET_PACKAGE_AUTHORS "ExampleInc")
set(CPACK_PACKAGE_DESCRIPTION "A .NET wrapper around the foobar library for frobbling bratchens")
- set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A .NET wrapper around the foobar library for frobbling bratchens")
set(CPACK_PACKAGE_HOMEPAGE_URL "https://www.example.com")
set(CPACK_NUGET_PACKAGE_REPOSITORY_URL "https://github.com/example/libfoobar.git")
set(CPACK_NUGET_PACKAGE_REPOSITORY_TYPE git)
diff --git a/Help/release/3.30.rst b/Help/release/3.30.rst
index ce489f6..6d515fd 100644
--- a/Help/release/3.30.rst
+++ b/Help/release/3.30.rst
@@ -179,6 +179,13 @@ CPack
* The :cpack_gen:`CPack Inno Setup Generator` is now available
on non-Windows hosts.
+* The :cpack_gen:`CPack NuGet Generator` gained the
+ :variable:`CPACK_NUGET_PACKAGE_README`,
+ :variable:`CPACK_NUGET_PACKAGE_REPOSITORY_URL`,
+ :variable:`CPACK_NUGET_PACKAGE_REPOSITORY_TYPE`,
+ :variable:`CPACK_NUGET_PACKAGE_REPOSITORY_BRANCH`, and
+ :variable:`CPACK_NUGET_PACKAGE_REPOSITORY_COMMIT` variables.
+
* The :cpack_gen:`CPack NuGet Generator` can now generate dependency groups
for framework-specific dependencies. The :variable:`CPACK_NUGET_PACKAGE_TFMS`
variable was added to specify a list of target framework monikers (TFMs)
diff --git a/Modules/Internal/CPack/CPackRPM.cmake b/Modules/Internal/CPack/CPackRPM.cmake
index 4998d71..4a741ee 100644
--- a/Modules/Internal/CPack/CPackRPM.cmake
+++ b/Modules/Internal/CPack/CPackRPM.cmake
@@ -711,7 +711,7 @@ function(cpack_rpm_debugsymbol_check INSTALL_FILES WORKING_DIR)
endif()
get_file_permissions("${WORKING_DIR}/${F}" permissions_)
- if(NOT "USER_EXECUTE" IN_LIST permissions_ AND
+ if(NOT "OWNER_EXECUTE" IN_LIST permissions_ AND
NOT "GROUP_EXECUTE" IN_LIST permissions_ AND
NOT "WORLD_EXECUTE" IN_LIST permissions_)
if(CPACK_RPM_INSTALL_WITH_EXEC)
diff --git a/Source/cmGlobalCommonGenerator.cxx b/Source/cmGlobalCommonGenerator.cxx
index 513e3bf..b1b96d0 100644
--- a/Source/cmGlobalCommonGenerator.cxx
+++ b/Source/cmGlobalCommonGenerator.cxx
@@ -12,8 +12,8 @@
#include "cmGeneratorExpression.h"
#include "cmGeneratorTarget.h"
+#include "cmLocalCommonGenerator.h"
#include "cmLocalGenerator.h"
-#include "cmMakefile.h"
#include "cmStateDirectory.h"
#include "cmStateSnapshot.h"
#include "cmStateTypes.h"
@@ -38,8 +38,8 @@ cmGlobalCommonGenerator::ComputeDirectoryTargets() const
lg->GetStateSnapshot().GetDirectory().GetCurrentBinary();
DirectoryTarget& dirTarget = dirTargets[currentBinaryDir];
dirTarget.LG = lg.get();
- const std::vector<std::string>& configs =
- lg->GetMakefile()->GetGeneratorConfigs(cmMakefile::IncludeEmptyConfig);
+ std::vector<std::string> const& configs =
+ static_cast<cmLocalCommonGenerator const*>(lg.get())->GetConfigNames();
// The directory-level rule should depend on the target-level rules
// for all targets in the directory.
diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx
index 4e6f164..96c8f25 100644
--- a/Source/cmGlobalNinjaGenerator.cxx
+++ b/Source/cmGlobalNinjaGenerator.cxx
@@ -603,6 +603,13 @@ cmDocumentationEntry cmGlobalNinjaGenerator::GetDocumentation()
"Generates build.ninja files." };
}
+std::vector<std::string> const& cmGlobalNinjaGenerator::GetConfigNames() const
+{
+ return static_cast<cmLocalNinjaGenerator const*>(
+ this->LocalGenerators.front().get())
+ ->GetConfigNames();
+}
+
// Implemented in all cmGlobaleGenerator sub-classes.
// Used in:
// Source/cmLocalGenerator.cxx
@@ -655,8 +662,7 @@ void cmGlobalNinjaGenerator::Generate()
if (cmSystemTools::GetErrorOccurredFlag()) {
this->RulesFileStream->setstate(std::ios::failbit);
- for (auto const& config : this->Makefiles[0]->GetGeneratorConfigs(
- cmMakefile::IncludeEmptyConfig)) {
+ for (std::string const& config : this->GetConfigNames()) {
this->GetImplFileStream(config)->setstate(std::ios::failbit);
this->GetConfigFileStream(config)->setstate(std::ios::failbit);
}
@@ -1491,9 +1497,7 @@ void cmGlobalNinjaGenerator::AddTargetAlias(const std::string& alias,
for (std::string const& output : outputs) {
this->TargetAliases[output].GeneratorTarget = nullptr;
this->DefaultTargetAliases[output].GeneratorTarget = nullptr;
- for (const std::string& config2 :
- this->Makefiles.front()->GetGeneratorConfigs(
- cmMakefile::IncludeEmptyConfig)) {
+ for (std::string const& config2 : this->GetConfigNames()) {
this->Configs[config2].TargetAliases[output].GeneratorTarget = nullptr;
}
}
@@ -1567,8 +1571,7 @@ void cmGlobalNinjaGenerator::WriteTargetAliases(std::ostream& os)
}
if (this->IsMultiConfig()) {
- for (auto const& config : this->Makefiles.front()->GetGeneratorConfigs(
- cmMakefile::IncludeEmptyConfig)) {
+ for (std::string const& config : this->GetConfigNames()) {
for (auto const& ta : this->Configs[config].TargetAliases) {
// Don't write ambiguous aliases.
if (!ta.second.GeneratorTarget) {
@@ -1630,8 +1633,7 @@ void cmGlobalNinjaGenerator::WriteFolderTargets(std::ostream& os)
std::string const& currentBinaryDir = it.first;
DirectoryTarget const& dt = it.second;
std::vector<std::string> configs =
- dt.LG->GetMakefile()->GetGeneratorConfigs(
- cmMakefile::IncludeEmptyConfig);
+ static_cast<cmLocalNinjaGenerator const*>(dt.LG)->GetConfigNames();
// Setup target
cmNinjaDeps configDeps;
@@ -1827,8 +1829,7 @@ void cmGlobalNinjaGenerator::WriteBuiltinTargets(std::ostream& os)
this->WriteTargetClean(os);
this->WriteTargetHelp(os);
- for (auto const& config : this->Makefiles[0]->GetGeneratorConfigs(
- cmMakefile::IncludeEmptyConfig)) {
+ for (std::string const& config : this->GetConfigNames()) {
this->WriteTargetDefault(*this->GetConfigFileStream(config));
}
@@ -2025,8 +2026,7 @@ bool cmGlobalNinjaGenerator::WriteTargetCleanAdditional(std::ostream& os)
std::string cleanScriptRel = "CMakeFiles/clean_additional.cmake";
std::string cleanScriptAbs =
cmStrCat(lgr->GetBinaryDirectory(), '/', cleanScriptRel);
- std::vector<std::string> configs =
- this->Makefiles[0]->GetGeneratorConfigs(cmMakefile::IncludeEmptyConfig);
+ std::vector<std::string> const& configs = this->GetConfigNames();
// Check if there are additional files to clean
bool empty = true;
@@ -2121,16 +2121,13 @@ void cmGlobalNinjaGenerator::WriteTargetClean(std::ostream& os)
WriteRule(*this->RulesFileStream, rule);
}
- auto const configs = this->Makefiles.front()->GetGeneratorConfigs(
- cmMakefile::IncludeEmptyConfig);
-
// Write build
{
cmNinjaBuild build("CLEAN");
build.Comment = "Clean all the built files.";
build.Outputs.emplace_back();
- for (auto const& config : configs) {
+ for (std::string const& config : this->GetConfigNames()) {
build.Outputs.front() = this->BuildAlias(
this->NinjaOutputPath(this->GetCleanTargetName()), config);
if (this->IsMultiConfig()) {
@@ -2145,7 +2142,7 @@ void cmGlobalNinjaGenerator::WriteTargetClean(std::ostream& os)
this->NinjaOutputPath(this->GetAdditionalCleanTargetName()),
config));
}
- for (auto const& fileConfig : configs) {
+ for (std::string const& fileConfig : this->GetConfigNames()) {
if (fileConfig != config && !this->EnableCrossConfigBuild()) {
continue;
}
@@ -2181,7 +2178,7 @@ void cmGlobalNinjaGenerator::WriteTargetClean(std::ostream& os)
byproducts.emplace_back(GetByproductsForCleanTargetName());
build.Variables["TARGETS"] = cmJoin(byproducts, " ");
- for (auto const& fileConfig : configs) {
+ for (std::string const& fileConfig : this->GetConfigNames()) {
build.Variables["FILE_ARG"] = cmStrCat(
"-f ",
this->NinjaOutputPath(
@@ -2197,7 +2194,7 @@ void cmGlobalNinjaGenerator::WriteTargetClean(std::ostream& os)
this->NinjaOutputPath(this->GetCleanTargetName()));
build.ExplicitDeps.emplace_back();
- for (auto const& config : configs) {
+ for (std::string const& config : this->GetConfigNames()) {
build.ExplicitDeps.front() = this->BuildAlias(
this->NinjaOutputPath(this->GetCleanTargetName()), config);
this->WriteBuild(*this->GetConfigFileStream(config), build);
@@ -2222,7 +2219,7 @@ void cmGlobalNinjaGenerator::WriteTargetClean(std::ostream& os)
build.ExplicitDeps = this->ByproductsForCleanTarget;
this->WriteBuild(os, build);
- for (auto const& config : configs) {
+ for (std::string const& config : this->GetConfigNames()) {
build.Outputs.front() = this->BuildAlias(
this->ConvertToNinjaPath(GetByproductsForCleanTargetName()), config);
build.ExplicitDeps = this->Configs[config].ByproductsForCleanTarget;
@@ -3119,8 +3116,7 @@ bool cmGlobalNinjaMultiGenerator::OpenBuildFileStreams()
<< "# This file contains build statements common to all "
"configurations.\n\n";
- auto const& configs =
- this->Makefiles[0]->GetGeneratorConfigs(cmMakefile::IncludeEmptyConfig);
+ std::vector<std::string> const& configs = this->GetConfigNames();
return std::all_of(
configs.begin(), configs.end(), [this](std::string const& config) -> bool {
// Open impl file.
@@ -3163,8 +3159,7 @@ void cmGlobalNinjaMultiGenerator::CloseBuildFileStreams()
this->DefaultFileStream.reset();
} // No error if it wasn't open
- for (auto const& config : this->Makefiles[0]->GetGeneratorConfigs(
- cmMakefile::IncludeEmptyConfig)) {
+ for (std::string const& config : this->GetConfigNames()) {
if (this->ImplFileStreams[config]) {
this->ImplFileStreams[config].reset();
} else {
@@ -3206,8 +3201,7 @@ std::string cmGlobalNinjaMultiGenerator::GetNinjaConfigFilename(
void cmGlobalNinjaMultiGenerator::AddRebuildManifestOutputs(
cmNinjaDeps& outputs) const
{
- for (auto const& config : this->Makefiles.front()->GetGeneratorConfigs(
- cmMakefile::IncludeEmptyConfig)) {
+ for (std::string const& config : this->GetConfigNames()) {
outputs.push_back(this->NinjaOutputPath(GetNinjaImplFilename(config)));
outputs.push_back(this->NinjaOutputPath(GetNinjaConfigFilename(config)));
}
@@ -3219,18 +3213,15 @@ void cmGlobalNinjaMultiGenerator::AddRebuildManifestOutputs(
void cmGlobalNinjaMultiGenerator::GetQtAutoGenConfigs(
std::vector<std::string>& configs) const
{
- auto allConfigs =
- this->Makefiles[0]->GetGeneratorConfigs(cmMakefile::IncludeEmptyConfig);
+ std::vector<std::string> const& allConfigs = this->GetConfigNames();
configs.insert(configs.end(), cm::cbegin(allConfigs), cm::cend(allConfigs));
}
bool cmGlobalNinjaMultiGenerator::InspectConfigTypeVariables()
{
- cmList configsList{ this->Makefiles.front()->GetDefinition(
- "CMAKE_CONFIGURATION_TYPES") };
- if (configsList.empty()) {
- configsList.emplace_back();
- }
+ std::vector<std::string> configsList =
+ this->Makefiles.front()->GetGeneratorConfigs(
+ cmMakefile::IncludeEmptyConfig);
std::set<std::string> configs(configsList.cbegin(), configsList.cend());
this->DefaultFileConfig =
diff --git a/Source/cmGlobalNinjaGenerator.h b/Source/cmGlobalNinjaGenerator.h
index 9758627..6ad38fb 100644
--- a/Source/cmGlobalNinjaGenerator.h
+++ b/Source/cmGlobalNinjaGenerator.h
@@ -485,6 +485,8 @@ public:
bool CheckCxxModuleSupport(CxxModuleSupportQuery query) override;
protected:
+ std::vector<std::string> const& GetConfigNames() const;
+
void Generate() override;
bool CheckALLOW_DUPLICATE_CUSTOM_TARGETS() const override { return true; }
diff --git a/Source/cmLocalCommonGenerator.cxx b/Source/cmLocalCommonGenerator.cxx
index aa953f4..14b3040 100644
--- a/Source/cmLocalCommonGenerator.cxx
+++ b/Source/cmLocalCommonGenerator.cxx
@@ -2,10 +2,12 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmLocalCommonGenerator.h"
+#include <memory>
#include <utility>
#include <vector>
#include "cmGeneratorTarget.h"
+#include "cmGlobalGenerator.h"
#include "cmMakefile.h"
#include "cmOutputConverter.h"
#include "cmStateDirectory.h"
@@ -13,14 +15,18 @@
#include "cmStringAlgorithms.h"
#include "cmValue.h"
-class cmGlobalGenerator;
-
cmLocalCommonGenerator::cmLocalCommonGenerator(cmGlobalGenerator* gg,
cmMakefile* mf)
: cmLocalGenerator(gg, mf)
{
- this->ConfigNames =
- this->Makefile->GetGeneratorConfigs(cmMakefile::IncludeEmptyConfig);
+ // Multi-config generators define one set of configurations at the top.
+ // Single-config generators nominally define one configuration at the top,
+ // but the implementation has never been strict about that, so look up the
+ // per-directory config to preserve behavior.
+ this->ConfigNames = (gg->IsMultiConfig() && !gg->GetMakefiles().empty()
+ ? gg->GetMakefiles().front().get()
+ : this->Makefile)
+ ->GetGeneratorConfigs(cmMakefile::IncludeEmptyConfig);
}
cmLocalCommonGenerator::~cmLocalCommonGenerator() = default;
diff --git a/Source/cmLocalNinjaGenerator.cxx b/Source/cmLocalNinjaGenerator.cxx
index bc3da6e..46a95af 100644
--- a/Source/cmLocalNinjaGenerator.cxx
+++ b/Source/cmLocalNinjaGenerator.cxx
@@ -743,8 +743,6 @@ void cmLocalNinjaGenerator::WriteCustomCommandBuildStatement(
bool cmLocalNinjaGenerator::HasUniqueByproducts(
std::vector<std::string> const& byproducts, cmListFileBacktrace const& bt)
{
- std::vector<std::string> configs =
- this->GetMakefile()->GetGeneratorConfigs(cmMakefile::IncludeEmptyConfig);
cmGeneratorExpression ge(*this->GetCMakeInstance(), bt);
for (std::string const& p : byproducts) {
if (cmGeneratorExpression::Find(p) == std::string::npos) {
@@ -752,7 +750,7 @@ bool cmLocalNinjaGenerator::HasUniqueByproducts(
}
std::set<std::string> seen;
std::unique_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(p);
- for (std::string const& config : configs) {
+ for (std::string const& config : this->GetConfigNames()) {
for (std::string const& b :
this->ExpandCustomCommandOutputPaths(*cge, config)) {
if (!seen.insert(b).second) {
@@ -800,8 +798,7 @@ std::string cmLocalNinjaGenerator::CreateUtilityOutput(
std::string const base = cmStrCat(this->GetCurrentBinaryDirectory(),
"/CMakeFiles/", targetName, '-');
// The output is not actually created so mark it symbolic.
- for (std::string const& config :
- this->Makefile->GetGeneratorConfigs(cmMakefile::IncludeEmptyConfig)) {
+ for (std::string const& config : this->GetConfigNames()) {
std::string const force = cmStrCat(base, config);
if (cmSourceFile* sf = this->Makefile->GetOrCreateGeneratedSource(force)) {
sf->SetProperty("SYMBOLIC", "1");
diff --git a/Source/cmNinjaTargetGenerator.cxx b/Source/cmNinjaTargetGenerator.cxx
index 160689c..a10635a 100644
--- a/Source/cmNinjaTargetGenerator.cxx
+++ b/Source/cmNinjaTargetGenerator.cxx
@@ -87,8 +87,7 @@ cmNinjaTargetGenerator::cmNinjaTargetGenerator(cmGeneratorTarget* target)
, LocalGenerator(
static_cast<cmLocalNinjaGenerator*>(target->GetLocalGenerator()))
{
- for (auto const& fileConfig :
- target->Makefile->GetGeneratorConfigs(cmMakefile::IncludeEmptyConfig)) {
+ for (auto const& fileConfig : this->LocalGenerator->GetConfigNames()) {
this->Configs[fileConfig].MacOSXContentGenerator =
cm::make_unique<MacOSXContentGeneratorType>(this, fileConfig);
}
diff --git a/Tests/RunCMake/add_subdirectory/ChangeConfigMulti.cmake b/Tests/RunCMake/add_subdirectory/ChangeConfigMulti.cmake
new file mode 100644
index 0000000..449c5c8
--- /dev/null
+++ b/Tests/RunCMake/add_subdirectory/ChangeConfigMulti.cmake
@@ -0,0 +1 @@
+add_subdirectory(ChangeConfigMulti)
diff --git a/Tests/RunCMake/add_subdirectory/ChangeConfigMulti/CMakeLists.txt b/Tests/RunCMake/add_subdirectory/ChangeConfigMulti/CMakeLists.txt
new file mode 100644
index 0000000..3ea7fc5
--- /dev/null
+++ b/Tests/RunCMake/add_subdirectory/ChangeConfigMulti/CMakeLists.txt
@@ -0,0 +1 @@
+set(CMAKE_CONFIGURATION_TYPES NotDebug NotRelease)
diff --git a/Tests/RunCMake/add_subdirectory/RunCMakeTest.cmake b/Tests/RunCMake/add_subdirectory/RunCMakeTest.cmake
index 3c70d07..801abae 100644
--- a/Tests/RunCMake/add_subdirectory/RunCMakeTest.cmake
+++ b/Tests/RunCMake/add_subdirectory/RunCMakeTest.cmake
@@ -7,6 +7,10 @@ set(RunCMake_TEST_OPTIONS -DCMAKE_Fortran_COMPILER=${CMAKE_Fortran_COMPILER})
run_cmake(System)
unset(RunCMake_TEST_OPTIONS)
+if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
+ run_cmake_with_options(ChangeConfigMulti "-DCMAKE_CONFIGURATION_TYPES=Debug\\;Release")
+endif()
+
macro(run_cmake_install case)
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${case}-build)
set(RunCMake_TEST_NO_CLEAN 1)