Files
CMake/Source/cmLocalFastbuildGenerator.cxx
T
Eduard Voronkin 2f51a7d83f FASTBuild: use relative paths in more places when enabled
When CMAKE_FASTBUILD_USE_RELATIVE_PATHS is set -
use relative paths for Unity nodes as well as for include directories.
It makes it possible to share cache across different location of
the same repo (or potentially across different machines)
2025-09-21 17:25:26 -07:00

113 lines
3.6 KiB
C++

/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file LICENSE.rst or https://cmake.org/licensing for details. */
#include "cmLocalFastbuildGenerator.h"
#include <memory>
#include <utility>
#include <vector>
#include "cmFastbuildTargetGenerator.h"
#include "cmGeneratorExpression.h"
#include "cmGeneratorTarget.h"
#include "cmGlobalFastbuildGenerator.h"
#include "cmList.h"
#include "cmMakefile.h"
#include "cmObjectLocation.h"
#include "cmSystemTools.h"
#include "cmValue.h"
#include "cmake.h"
class cmGlobalGenerator;
cmLocalFastbuildGenerator::cmLocalFastbuildGenerator(cmGlobalGenerator* gg,
cmMakefile* makefile)
: cmLocalCommonGenerator(gg, makefile)
{
}
void cmLocalFastbuildGenerator::Generate()
{
auto const& targets = this->GetGeneratorTargets();
for (auto const& target : targets) {
if (!target->IsInBuildSystem()) {
continue;
}
for (std::string config : this->GetConfigNames()) {
cmFastbuildTargetGenerator* tg =
cmFastbuildTargetGenerator::New(target.get(), std::move(config));
if (tg) {
tg->Generate();
delete tg;
}
// Directory level.
this->AdditionalCleanFiles(config);
}
}
}
cmGlobalFastbuildGenerator const*
cmLocalFastbuildGenerator::GetGlobalFastbuildGenerator() const
{
return static_cast<cmGlobalFastbuildGenerator const*>(
this->GetGlobalGenerator());
}
cmGlobalFastbuildGenerator*
cmLocalFastbuildGenerator::GetGlobalFastbuildGenerator()
{
return static_cast<cmGlobalFastbuildGenerator*>(this->GetGlobalGenerator());
}
void cmLocalFastbuildGenerator::ComputeObjectFilenames(
std::map<cmSourceFile const*, cmObjectLocations>& mapping,
std::string const& config, cmGeneratorTarget const* gt)
{
for (auto& si : mapping) {
cmSourceFile const* sf = si.first;
si.second.LongLoc =
this->GetObjectFileNameWithoutTarget(*sf, gt->ObjectDirectory);
this->FillCustomInstallObjectLocations(*sf, config, nullptr,
si.second.InstallLongLoc);
}
}
void cmLocalFastbuildGenerator::AppendFlagEscape(
std::string& flags, std::string const& rawFlag) const
{
std::string escapedFlag = this->EscapeForShell(rawFlag);
// Other make systems will remove the double $ but
// fastbuild uses ^$ to escape it. So switch to that.
// cmSystemTools::ReplaceString(escapedFlag, "$$", "^$");
this->AppendFlags(flags, escapedFlag);
}
void cmLocalFastbuildGenerator::AdditionalCleanFiles(std::string const& config)
{
if (cmValue prop_value =
this->Makefile->GetProperty("ADDITIONAL_CLEAN_FILES")) {
cmList cleanFiles{ cmGeneratorExpression::Evaluate(*prop_value, this,
config) };
std::string const& binaryDir = this->GetCurrentBinaryDirectory();
auto* gg = this->GetGlobalFastbuildGenerator();
for (auto const& cleanFile : cleanFiles) {
// Support relative paths
gg->AddFileToClean(gg->ConvertToFastbuildPath(
cmSystemTools::CollapseFullPath(cleanFile, binaryDir)));
}
}
}
std::string cmLocalFastbuildGenerator::ConvertToIncludeReference(
std::string const& path, cmOutputConverter::OutputFormat format)
{
std::string converted = this->ConvertToOutputForExisting(path, format);
cmGlobalFastbuildGenerator const* GG = this->GetGlobalFastbuildGenerator();
if (GG->UsingRelativePaths && cmSystemTools::FileIsFullPath(path)) {
std::string const& binDir =
GG->GetCMakeInstance()->GetHomeOutputDirectory();
return cmSystemTools::RelativePath(binDir, converted);
}
return converted;
}