From de3dc16b64188a18b3607939f336525ce955589e Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Sat, 6 Jan 2024 10:12:34 -0500 Subject: cmNinjaTargetGenerator: use `.` for the needed phony order-only dependency It is only required for Ninja < 1.7 though. --- Source/cmGlobalNinjaGenerator.cxx | 8 ++++++++ Source/cmGlobalNinjaGenerator.h | 3 +++ Source/cmNinjaTargetGenerator.cxx | 16 ++++++++++------ 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx index 55eb9b5..74a6bea 100644 --- a/Source/cmGlobalNinjaGenerator.cxx +++ b/Source/cmGlobalNinjaGenerator.cxx @@ -828,6 +828,9 @@ void cmGlobalNinjaGenerator::CheckNinjaFeatures() this->NinjaExpectedEncoding = codecvt_Encoding::ANSI; } #endif + this->NinjaSupportsCWDDepend = + !cmSystemTools::VersionCompare(cmSystemTools::OP_LESS, this->NinjaVersion, + RequiredNinjaVersionForCWDDepend()); } void cmGlobalNinjaGenerator::CheckNinjaCodePage() @@ -1996,6 +1999,11 @@ bool cmGlobalNinjaGenerator::SupportsMultilineDepfile() const return this->NinjaSupportsMultilineDepfile; } +bool cmGlobalNinjaGenerator::SupportsCWDDepend() const +{ + return this->NinjaSupportsCWDDepend; +} + bool cmGlobalNinjaGenerator::WriteTargetCleanAdditional(std::ostream& os) { const auto& lgr = this->LocalGenerators.at(0); diff --git a/Source/cmGlobalNinjaGenerator.h b/Source/cmGlobalNinjaGenerator.h index 3443643..64eed4d 100644 --- a/Source/cmGlobalNinjaGenerator.h +++ b/Source/cmGlobalNinjaGenerator.h @@ -415,10 +415,12 @@ public: return "1.10.2"; } static std::string RequiredNinjaVersionForCodePage() { return "1.11"; } + static std::string RequiredNinjaVersionForCWDDepend() { return "1.7"; } bool SupportsDirectConsole() const override; bool SupportsImplicitOuts() const; bool SupportsManifestRestat() const; bool SupportsMultilineDepfile() const; + bool SupportsCWDDepend() const; std::string NinjaOutputPath(std::string const& path) const; bool HasOutputPathPrefix() const { return !this->OutputPathPrefix.empty(); } @@ -597,6 +599,7 @@ private: bool NinjaSupportsMultipleOutputs = false; bool NinjaSupportsMetadataOnRegeneration = false; bool NinjaSupportsCodePage = false; + bool NinjaSupportsCWDDepend = false; codecvt_Encoding NinjaExpectedEncoding = codecvt_Encoding::None; diff --git a/Source/cmNinjaTargetGenerator.cxx b/Source/cmNinjaTargetGenerator.cxx index 016705e..1f94569 100644 --- a/Source/cmNinjaTargetGenerator.cxx +++ b/Source/cmNinjaTargetGenerator.cxx @@ -1023,7 +1023,7 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatements( } } - { + if (!this->GetGlobalGenerator()->SupportsCWDDepend()) { // Ensure that the object directory exists. If there are no objects in the // target (e.g., an empty `OBJECT` library), the directory is still listed // as an order-only depends in the build files. Alternate `ninja` @@ -1106,11 +1106,15 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatements( // that "output ... of phony edge with no inputs doesn't exist" and // consider the phony output "dirty". if (orderOnlyDeps.empty()) { - // Any path that always exists will work here. It would be nice to - // use just "." but that is not supported by Ninja < 1.7. - std::string tgtDir = cmStrCat( - this->LocalGenerator->GetCurrentBinaryDirectory(), '/', - this->LocalGenerator->GetTargetDirectory(this->GeneratorTarget)); + std::string tgtDir; + if (this->GetGlobalGenerator()->SupportsCWDDepend()) { + tgtDir = "."; + } else { + // Any path that always exists will work here. + tgtDir = cmStrCat( + this->LocalGenerator->GetCurrentBinaryDirectory(), '/', + this->LocalGenerator->GetTargetDirectory(this->GeneratorTarget)); + } orderOnlyDeps.push_back(this->ConvertToNinjaPath(tgtDir)); } -- cgit v0.12