summaryrefslogtreecommitdiffstats
path: root/Source/cmNinjaNormalTargetGenerator.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Source/cmNinjaNormalTargetGenerator.cxx')
-rw-r--r--Source/cmNinjaNormalTargetGenerator.cxx69
1 files changed, 55 insertions, 14 deletions
diff --git a/Source/cmNinjaNormalTargetGenerator.cxx b/Source/cmNinjaNormalTargetGenerator.cxx
index 5a12855..f853ac5 100644
--- a/Source/cmNinjaNormalTargetGenerator.cxx
+++ b/Source/cmNinjaNormalTargetGenerator.cxx
@@ -11,8 +11,8 @@
#include <utility>
#include <cm/memory>
+#include <cm/vector>
-#include "cmAlgorithms.h"
#include "cmComputeLinkInformation.h"
#include "cmCustomCommand.h" // IWYU pragma: keep
#include "cmCustomCommandGenerator.h"
@@ -72,6 +72,10 @@ void cmNinjaNormalTargetGenerator::Generate(const std::string& config)
// Write the build statements
bool firstForConfig = true;
for (auto const& fileConfig : this->GetConfigNames()) {
+ if (fileConfig != config &&
+ !this->GetGlobalGenerator()->EnableCrossConfigBuild()) {
+ continue;
+ }
this->WriteObjectBuildStatements(config, fileConfig, firstForConfig);
firstForConfig = false;
}
@@ -79,17 +83,23 @@ void cmNinjaNormalTargetGenerator::Generate(const std::string& config)
if (this->GetGeneratorTarget()->GetType() == cmStateEnums::OBJECT_LIBRARY) {
this->WriteObjectLibStatement(config);
} else {
- // If this target has cuda language link inputs, and we need to do
- // device linking
- this->WriteDeviceLinkStatement(config);
firstForConfig = true;
for (auto const& fileConfig : this->GetConfigNames()) {
+ if (fileConfig != config &&
+ !this->GetGlobalGenerator()->EnableCrossConfigBuild()) {
+ continue;
+ }
+ // If this target has cuda language link inputs, and we need to do
+ // device linking
+ this->WriteDeviceLinkStatement(config, fileConfig, firstForConfig);
this->WriteLinkStatement(config, fileConfig, firstForConfig);
firstForConfig = false;
}
}
- this->GetGlobalGenerator()->AddTargetAlias(
- this->GetTargetName(), this->GetGeneratorTarget(), "all");
+ if (this->GetGlobalGenerator()->EnableCrossConfigBuild()) {
+ this->GetGlobalGenerator()->AddTargetAlias(
+ this->GetTargetName(), this->GetGeneratorTarget(), "all");
+ }
// Find ADDITIONAL_CLEAN_FILES
this->AdditionalCleanFiles(config);
@@ -243,7 +253,7 @@ void cmNinjaNormalTargetGenerator::WriteDeviceLinkRule(
}
// If there is no ranlib the command will be ":". Skip it.
- cmEraseIf(linkCmds, cmNinjaRemoveNoOpCommands());
+ cm::erase_if(linkCmds, cmNinjaRemoveNoOpCommands());
rule.Command = this->GetLocalGenerator()->BuildCommandLine(linkCmds);
@@ -379,7 +389,7 @@ void cmNinjaNormalTargetGenerator::WriteLinkRule(bool useResponseFile,
}
// If there is no ranlib the command will be ":". Skip it.
- cmEraseIf(linkCmds, cmNinjaRemoveNoOpCommands());
+ cm::erase_if(linkCmds, cmNinjaRemoveNoOpCommands());
linkCmds.insert(linkCmds.begin(), "$PRE_LINK");
linkCmds.emplace_back("$POST_BUILD");
@@ -551,7 +561,8 @@ std::vector<std::string> cmNinjaNormalTargetGenerator::ComputeLinkCmd(
}
void cmNinjaNormalTargetGenerator::WriteDeviceLinkStatement(
- const std::string& config)
+ const std::string& config, const std::string& fileConfig,
+ bool firstForConfig)
{
cmGlobalNinjaGenerator* globalGen = this->GetGlobalGenerator();
if (!globalGen->GetLanguageEnabled("CUDA")) {
@@ -574,12 +585,42 @@ void cmNinjaNormalTargetGenerator::WriteDeviceLinkStatement(
std::string const& objExt =
this->Makefile->GetSafeDefinition("CMAKE_CUDA_OUTPUT_EXTENSION");
- std::string const targetOutputReal = ConvertToNinjaPath(
- genTarget->ObjectDirectory + "cmake_device_link" + objExt);
+ std::string targetOutputDir =
+ cmStrCat(this->GetLocalGenerator()->GetTargetDirectory(genTarget),
+ globalGen->ConfigDirectory(config), "/");
+ targetOutputDir = globalGen->ExpandCFGIntDir(targetOutputDir, config);
- std::string const targetOutputImplib = ConvertToNinjaPath(
+ std::string targetOutputReal =
+ ConvertToNinjaPath(targetOutputDir + "cmake_device_link" + objExt);
+
+ std::string targetOutputImplib = ConvertToNinjaPath(
genTarget->GetFullPath(config, cmStateEnums::ImportLibraryArtifact));
+ if (config != fileConfig) {
+ std::string targetOutputFileConfigDir =
+ cmStrCat(this->GetLocalGenerator()->GetTargetDirectory(genTarget),
+ globalGen->ConfigDirectory(fileConfig), "/");
+ targetOutputFileConfigDir =
+ globalGen->ExpandCFGIntDir(targetOutputDir, fileConfig);
+ if (targetOutputDir == targetOutputFileConfigDir) {
+ return;
+ }
+
+ if (!genTarget->GetFullName(config, cmStateEnums::ImportLibraryArtifact)
+ .empty() &&
+ !genTarget
+ ->GetFullName(fileConfig, cmStateEnums::ImportLibraryArtifact)
+ .empty() &&
+ targetOutputImplib ==
+ ConvertToNinjaPath(genTarget->GetFullPath(
+ fileConfig, cmStateEnums::ImportLibraryArtifact))) {
+ return;
+ }
+ }
+
+ if (firstForConfig) {
+ globalGen->GetByproductsForCleanTarget(config).push_back(targetOutputReal);
+ }
this->DeviceLinkObject = targetOutputReal;
// Write comments.
@@ -884,10 +925,10 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement(
vars["TARGET_FILE"] =
localGen.ConvertToOutputFormat(targetOutputReal, cmOutputConverter::SHELL);
- std::unique_ptr<cmLinkLineComputer> linkLineComputer(
+ std::unique_ptr<cmLinkLineComputer> linkLineComputer =
globalGen->CreateLinkLineComputer(
this->GetLocalGenerator(),
- this->GetLocalGenerator()->GetStateSnapshot().GetDirectory()));
+ this->GetLocalGenerator()->GetStateSnapshot().GetDirectory());
linkLineComputer->SetUseWatcomQuote(useWatcomQuote);
linkLineComputer->SetUseNinjaMulti(globalGen->IsMultiConfig());