Files
CMake/Source/cmFastbuildTargetGenerator.h
Brad King f49b0e6759 IWYU: Update for Debian 13 CI job
`include-what-you-use` diagnostics, in practice, are specific to
the environment's compiler and standard library.  Update includes
to satisfy IWYU for our CI job under Debian 13.  Some patterns:

* Types named in virtual `override` signatures no longer require
  includes since the overridden signature already names them.

* A function argument's type needs to be included even if its constructor
  is called only by implicit conversion.  For example, constructing a
  `std::function` from a lambda now requires `<functional>`.

* Some prior mysterious `<type_traits>` inclusions are no longer required.
2025-11-12 14:54:16 -05:00

157 lines
5.1 KiB
C++

/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file LICENSE.rst or https://cmake.org/licensing for details. */
#pragma once
#include <memory>
#include <set>
#include <string>
#include <unordered_map>
#include <utility>
#include <vector>
#include "cmsys/FStream.hxx"
#include "cmCommonTargetGenerator.h"
#include "cmGeneratorTarget.h"
#include "cmGlobalFastbuildGenerator.h"
#include "cmGlobalGenerator.h"
#include "cmOSXBundleGenerator.h"
class cmCustomCommand;
class cmCustomCommandGenerator;
class cmLocalFastbuildGenerator;
class cmMakefile;
enum class FastbuildBuildStep
{
PRE_BUILD,
PRE_LINK,
POST_BUILD,
REST,
};
class cmFastbuildTargetGenerator : public cmCommonTargetGenerator
{
public:
/// Create a cmFastbuildTargetGenerator according to the @a target's type and
/// config.
static cmFastbuildTargetGenerator* New(cmGeneratorTarget* target,
std::string config);
cmFastbuildTargetGenerator(cmGeneratorTarget* target, std::string config);
virtual void Generate() {}
std::string GetClangTidyReplacementsFilePath(
std::string const& directory, cmSourceFile const& source,
std::string const& Config) const override;
void AddIncludeFlags(std::string& languageFlags, std::string const& language,
std::string const&) override;
cmGeneratorTarget::Names DetectOutput() const;
void AddObjectDependencies(FastbuildTarget& fastbuildTarget,
std::vector<std::string>& allObjectDepends) const;
void AddLinkerNodeDependencies(FastbuildTarget& fastbuildTarget);
std::string ConvertToFastbuildPath(std::string const& path) const;
cmGlobalFastbuildGenerator* GetGlobalGenerator() const;
std::string GetName();
cmMakefile* GetMakefile() const { return this->Makefile; }
cmGeneratorTarget* GetGeneratorTarget() const
{
return this->GeneratorTarget;
}
void LogMessage(std::string const& m) const;
private:
std::string GetUtilityAliasFromBuildStep(FastbuildBuildStep step) const;
protected:
cmLocalFastbuildGenerator* GetLocalGenerator() const
{
return this->LocalGenerator;
}
std::string GetTargetName() const;
std::string GetCdCommand(cmCustomCommandGenerator const& ccg) const;
std::string GetScriptWorkingDir(cmCustomCommandGenerator const& ccg) const;
std::string GetScriptFilename(std::string const& utilityTargetName) const;
void GetDepends(cmCustomCommandGenerator const& ccg,
std::string const& currentCCName,
std::vector<std::string>& fileLevelDeps,
std::set<FastbuildTargetDep>& targetDep) const;
void AddCommentPrinting(std::vector<std::string>& cmdLines,
cmCustomCommandGenerator const& ccg) const;
void WriteCmdsToFile(cmsys::ofstream& file,
std::vector<std::string> const& cmds) const;
void AddOutput(cmCustomCommandGenerator const& ccg, FastbuildExecNode& exec);
void AddExecArguments(FastbuildExecNode& exec,
std::string const& scriptFilename) const;
void ReplaceProblematicMakeVars(std::string& command) const;
FastbuildExecNodes GenerateCommands(FastbuildBuildStep buildStep);
FastbuildExecNode GetAppleTextStubCommand() const;
FastbuildExecNode GetDepsCheckExec(FastbuildExecNode const& depender);
std::string MakeCustomLauncher(cmCustomCommandGenerator const& ccg);
std::string GetCustomCommandTargetName(cmCustomCommand const& cc,
FastbuildBuildStep step) const;
void WriteScriptProlog(cmsys::ofstream& file) const;
void WriteScriptEpilog(cmsys::ofstream& file) const;
void AdditionalCleanFiles();
// write rules for Mac OS X Application Bundle content.
struct MacOSXContentGeneratorType
: cmOSXBundleGenerator::MacOSXContentGeneratorType
{
MacOSXContentGeneratorType(cmFastbuildTargetGenerator* g, std::string cfg)
: Generator(g)
, Config(std::move(cfg))
{
}
void operator()(cmSourceFile const& source, char const* pkgloc,
std::string const& config) override;
private:
cmFastbuildTargetGenerator* Generator;
std::string const Config;
};
friend struct MacOSXContentGeneratorType;
// "MacOSXContentGenerator" has to be per-config once multiconfig generator
// is implemented.
std::unique_ptr<MacOSXContentGeneratorType> MacOSXContentGenerator;
std::unique_ptr<cmOSXBundleGenerator> OSXBundleGenerator;
std::set<std::string> MacContentFolders;
std::vector<FastbuildCopyNode> CopyNodes;
cmLocalFastbuildGenerator* LocalGenerator;
cmGlobalGenerator::TargetDependSet const TargetDirectDependencies;
std::string const Config;
// Sometimes CMake adds equivalent custom commands to different targets.
// Not really supported by FBuild (can't have different exec nodes producing
// same output). So, in such cases we need to "re-map" the exec to produce a
// "dummy" output (and update all deps within the target).
// TODO: potentially 1 map should be enough?
std::unordered_map<std::string, std::string> OutputsToReplace;
std::unordered_map<std::string, std::string> OutputToExecName;
};