Ninja Multi-Config: Use build.ninja if cmake --build has no --config

If cmake --build is called with no --config argument, and a
build.ninja file is available, use that instead of defaulting to the
Debug config.
This commit is contained in:
Kyle Edwards
2020-02-04 11:06:46 -05:00
parent 2ac835b9f9
commit 16a4ba5b31
6 changed files with 54 additions and 13 deletions

View File

@@ -800,8 +800,7 @@ cmGlobalNinjaGenerator::GenerateBuildCommand(
makeCommand.Add("-j", std::to_string(jobs));
}
this->AppendNinjaFileArgument(makeCommand,
config.empty() ? "Debug" : config);
this->AppendNinjaFileArgument(makeCommand, config);
makeCommand.Add(makeOptions.begin(), makeOptions.end());
for (const auto& tname : targetNames) {
@@ -2559,8 +2558,10 @@ void cmGlobalNinjaMultiGenerator::CloseBuildFileStreams()
void cmGlobalNinjaMultiGenerator::AppendNinjaFileArgument(
GeneratedMakeCommand& command, const std::string& config) const
{
command.Add("-f");
command.Add(GetNinjaConfigFilename(config));
if (!config.empty()) {
command.Add("-f");
command.Add(GetNinjaConfigFilename(config));
}
}
std::string cmGlobalNinjaMultiGenerator::GetNinjaImplFilename(
@@ -2601,11 +2602,30 @@ void cmGlobalNinjaMultiGenerator::GetQtAutoGenConfigs(
bool cmGlobalNinjaMultiGenerator::InspectConfigTypeVariables()
{
auto configsVec = this->Makefiles.front()->GetGeneratorConfigs();
return this->ReadCacheEntriesForBuild(*this->Makefiles.front()->GetState());
}
std::string cmGlobalNinjaMultiGenerator::GetDefaultBuildConfig() const
{
if (this->DefaultFileConfig.empty()) {
return "Debug";
}
return "";
}
bool cmGlobalNinjaMultiGenerator::ReadCacheEntriesForBuild(
const cmState& state)
{
std::vector<std::string> configsVec;
cmExpandList(state.GetSafeCacheEntryValue("CMAKE_CONFIGURATION_TYPES"),
configsVec);
if (configsVec.empty()) {
configsVec.emplace_back();
}
std::set<std::string> configs(configsVec.cbegin(), configsVec.cend());
this->DefaultFileConfig = this->Makefiles.front()->GetSafeDefinition(
"CMAKE_NMC_DEFAULT_BUILD_FILE_CONFIG");
this->DefaultFileConfig =
state.GetSafeCacheEntryValue("CMAKE_NMC_DEFAULT_BUILD_FILE_CONFIG");
if (!this->DefaultFileConfig.empty() &&
!configs.count(this->DefaultFileConfig)) {
std::ostringstream msg;
@@ -2618,9 +2638,8 @@ bool cmGlobalNinjaMultiGenerator::InspectConfigTypeVariables()
}
std::vector<std::string> crossConfigsVec;
cmExpandList(
this->Makefiles.front()->GetSafeDefinition("CMAKE_NMC_CROSS_CONFIGS"),
crossConfigsVec);
cmExpandList(state.GetSafeCacheEntryValue("CMAKE_NMC_CROSS_CONFIGS"),
crossConfigsVec);
auto crossConfigs = ListSubsetWithAll(configs, crossConfigsVec);
if (!crossConfigs) {
std::ostringstream msg;
@@ -2633,7 +2652,7 @@ bool cmGlobalNinjaMultiGenerator::InspectConfigTypeVariables()
this->CrossConfigs = *crossConfigs;
auto defaultConfigsString =
this->Makefiles.front()->GetSafeDefinition("CMAKE_NMC_DEFAULT_CONFIGS");
state.GetSafeCacheEntryValue("CMAKE_NMC_DEFAULT_CONFIGS");
if (defaultConfigsString.empty()) {
defaultConfigsString = this->DefaultFileConfig;
}

View File

@@ -32,6 +32,7 @@ class cmLinkLineComputer;
class cmLocalGenerator;
class cmMakefile;
class cmOutputConverter;
class cmState;
class cmStateDirectory;
class cmake;
struct cmDocumentationEntry;
@@ -633,6 +634,10 @@ public:
bool InspectConfigTypeVariables() override;
std::string GetDefaultBuildConfig() const override;
bool ReadCacheEntriesForBuild(const cmState& state) override;
protected:
bool OpenBuildFileStreams() override;
void CloseBuildFileStreams() override;

View File

@@ -141,6 +141,16 @@ const char* cmState::GetCacheEntryValue(std::string const& key) const
return e->Value.c_str();
}
std::string cmState::GetSafeCacheEntryValue(std::string const& key) const
{
std::string retval;
auto val = this->GetCacheEntryValue(key);
if (val) {
retval = val;
}
return retval;
}
const std::string* cmState::GetInitializedCacheValue(
std::string const& key) const
{

View File

@@ -88,6 +88,7 @@ public:
std::vector<std::string> GetCacheEntryKeys() const;
const char* GetCacheEntryValue(std::string const& key) const;
std::string GetSafeCacheEntryValue(std::string const& key) const;
const std::string* GetInitializedCacheValue(std::string const& key) const;
cmStateEnums::CacheEntryType GetCacheEntryType(std::string const& key) const;
void SetCacheEntryValue(std::string const& key, std::string const& value);

View File

@@ -62,7 +62,12 @@ function(run_cmake_build case suffix config)
foreach(tgt IN LISTS ARGN)
list(APPEND tgts --target ${tgt})
endforeach()
run_cmake_command(${case}-${suffix}-build "${CMAKE_COMMAND}" --build . --config ${config} ${tgts})
if(config)
set(config_arg --config ${config})
else()
set(config_arg)
endif()
run_cmake_command(${case}-${suffix}-build "${CMAKE_COMMAND}" --build . ${config_arg} ${tgts})
endfunction()
function(run_ninja case suffix file)
@@ -122,7 +127,8 @@ run_cmake_configure(SimpleDefaultBuildAliasList)
unset(RunCMake_TEST_OPTIONS)
include(${RunCMake_TEST_BINARY_DIR}/target_files.cmake)
run_ninja(SimpleDefaultBuildAliasList target-configs build.ninja simpleexe)
run_ninja(SimpleDefaultBuildAliasList all-configs build.ninja all)
# IMPORTANT: This tests cmake --build . with no config using build.ninja
run_cmake_build(SimpleDefaultBuildAliasList all-configs "" all)
run_ninja(SimpleDefaultBuildAliasList all-relwithdebinfo build.ninja all:RelWithDebInfo)
run_ninja(SimpleDefaultBuildAliasList clean-configs build.ninja clean)