1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
|
/* 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;
};
|