mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-14 02:08:27 +08:00

Before there were a lot of duplicated shared across "ExecInput" and "PreBuildDependencies".
158 lines
5.1 KiB
C++
158 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;
|
|
class cmSourceFile;
|
|
|
|
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 AddLinkerNodeDependnecies(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;
|
|
};
|