|
@@ -586,6 +586,7 @@ std::string GetScanCommand(const std::string& cmakeCmd, const std::string& tdi,
|
|
|
// not perform explicit preprocessing too.
|
|
// not perform explicit preprocessing too.
|
|
|
cmNinjaRule GetScanRule(
|
|
cmNinjaRule GetScanRule(
|
|
|
std::string const& ruleName, std::string const& ppFileName,
|
|
std::string const& ruleName, std::string const& ppFileName,
|
|
|
|
|
+ std::string const& deptype,
|
|
|
cmRulePlaceholderExpander::RuleVariables const& vars,
|
|
cmRulePlaceholderExpander::RuleVariables const& vars,
|
|
|
const std::string& responseFlag, const std::string& flags,
|
|
const std::string& responseFlag, const std::string& flags,
|
|
|
cmRulePlaceholderExpander* const rulePlaceholderExpander,
|
|
cmRulePlaceholderExpander* const rulePlaceholderExpander,
|
|
@@ -594,8 +595,13 @@ cmNinjaRule GetScanRule(
|
|
|
{
|
|
{
|
|
|
cmNinjaRule rule(ruleName);
|
|
cmNinjaRule rule(ruleName);
|
|
|
// Scanning always uses a depfile for preprocessor dependencies.
|
|
// Scanning always uses a depfile for preprocessor dependencies.
|
|
|
- rule.DepType = ""; // no deps= for multiple outputs
|
|
|
|
|
- rule.DepFile = "$DEP_FILE";
|
|
|
|
|
|
|
+ if (deptype == "msvc"_s) {
|
|
|
|
|
+ rule.DepType = deptype;
|
|
|
|
|
+ rule.DepFile = "";
|
|
|
|
|
+ } else {
|
|
|
|
|
+ rule.DepType = ""; // no deps= for multiple outputs
|
|
|
|
|
+ rule.DepFile = "$DEP_FILE";
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
cmRulePlaceholderExpander::RuleVariables scanVars;
|
|
cmRulePlaceholderExpander::RuleVariables scanVars;
|
|
|
scanVars.CMTargetName = vars.CMTargetName;
|
|
scanVars.CMTargetName = vars.CMTargetName;
|
|
@@ -699,6 +705,9 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang,
|
|
|
cmSystemTools::GetCMakeCommand(), cmLocalGenerator::SHELL);
|
|
cmSystemTools::GetCMakeCommand(), cmLocalGenerator::SHELL);
|
|
|
|
|
|
|
|
if (needDyndep) {
|
|
if (needDyndep) {
|
|
|
|
|
+ const auto& scanDepType = this->GetMakefile()->GetSafeDefinition(
|
|
|
|
|
+ cmStrCat("CMAKE_EXPERIMENTAL_", lang, "_SCANDEP_DEPFILE_FORMAT"));
|
|
|
|
|
+
|
|
|
// Rule to scan dependencies of sources that need preprocessing.
|
|
// Rule to scan dependencies of sources that need preprocessing.
|
|
|
{
|
|
{
|
|
|
std::vector<std::string> scanCommands;
|
|
std::vector<std::string> scanCommands;
|
|
@@ -726,10 +735,10 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang,
|
|
|
"$DYNDEP_INTERMEDIATE_FILE"));
|
|
"$DYNDEP_INTERMEDIATE_FILE"));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- auto scanRule =
|
|
|
|
|
- GetScanRule(scanRuleName, ppFileName, vars, responseFlag, flags,
|
|
|
|
|
- rulePlaceholderExpander.get(), this->GetLocalGenerator(),
|
|
|
|
|
- std::move(scanCommands), config);
|
|
|
|
|
|
|
+ auto scanRule = GetScanRule(
|
|
|
|
|
+ scanRuleName, ppFileName, scanDepType, vars, responseFlag, flags,
|
|
|
|
|
+ rulePlaceholderExpander.get(), this->GetLocalGenerator(),
|
|
|
|
|
+ std::move(scanCommands), config);
|
|
|
|
|
|
|
|
scanRule.Comment =
|
|
scanRule.Comment =
|
|
|
cmStrCat("Rule for generating ", lang, " dependencies.");
|
|
cmStrCat("Rule for generating ", lang, " dependencies.");
|
|
@@ -757,9 +766,10 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang,
|
|
|
scanCommands.emplace_back(
|
|
scanCommands.emplace_back(
|
|
|
GetScanCommand(cmakeCmd, tdi, lang, "$in", "$out"));
|
|
GetScanCommand(cmakeCmd, tdi, lang, "$in", "$out"));
|
|
|
|
|
|
|
|
- auto scanRule = GetScanRule(
|
|
|
|
|
- scanRuleName, "", vars, "", flags, rulePlaceholderExpander.get(),
|
|
|
|
|
- this->GetLocalGenerator(), std::move(scanCommands), config);
|
|
|
|
|
|
|
+ auto scanRule =
|
|
|
|
|
+ GetScanRule(scanRuleName, "", scanDepType, vars, "", flags,
|
|
|
|
|
+ rulePlaceholderExpander.get(), this->GetLocalGenerator(),
|
|
|
|
|
+ std::move(scanCommands), config);
|
|
|
|
|
|
|
|
// Write the rule for generating dependencies for the given language.
|
|
// Write the rule for generating dependencies for the given language.
|
|
|
scanRule.Comment = cmStrCat("Rule for generating ", lang,
|
|
scanRule.Comment = cmStrCat("Rule for generating ", lang,
|
|
@@ -1249,7 +1259,8 @@ cmNinjaBuild GetScanBuildStatement(const std::string& ruleName,
|
|
|
scanBuild.Variables["PREPROCESSED_OUTPUT_FILE"] = ppFileName;
|
|
scanBuild.Variables["PREPROCESSED_OUTPUT_FILE"] = ppFileName;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // Scanning always uses a depfile for preprocessor dependencies.
|
|
|
|
|
|
|
+ // Scanning always provides a depfile for preprocessor dependencies. This
|
|
|
|
|
+ // variable is unused in `msvc`-deptype scanners.
|
|
|
std::string const& depFileName = cmStrCat(scanBuild.Outputs.front(), ".d");
|
|
std::string const& depFileName = cmStrCat(scanBuild.Outputs.front(), ".d");
|
|
|
scanBuild.Variables["DEP_FILE"] =
|
|
scanBuild.Variables["DEP_FILE"] =
|
|
|
lg->ConvertToOutputFormat(depFileName, cmOutputConverter::SHELL);
|
|
lg->ConvertToOutputFormat(depFileName, cmOutputConverter::SHELL);
|