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 157 158 159 160 161
|
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file LICENSE.rst or https://cmake.org/licensing for details. */
#pragma once
#include <map>
#include <memory>
#include <set>
#include <string>
#include <unordered_map>
#include <utility>
#include <vector>
#include "cmComputeLinkInformation.h"
#include "cmFastbuildTargetGenerator.h"
#include "cmGeneratorTarget.h"
#include "cmGlobalFastbuildGenerator.h"
#include "cmRulePlaceholderExpander.h"
class cmSourceFile;
class cmFastbuildNormalTargetGenerator : public cmFastbuildTargetGenerator
{
std::unique_ptr<cmRulePlaceholderExpander> const RulePlaceholderExpander;
std::string const ObjectOutDir;
std::set<std::string> const Languages;
std::unordered_map<std::string, std::string> const CompileObjectCmakeRules;
std::string const CudaCompileMode;
// Now we're adding our link deps to command line and using .Libraries2 for
// tracking deps.
bool UsingCommandLine = false;
std::unordered_map<std::string, std::string> TargetIncludesByLanguage;
std::map<std::pair<std::string, std::string>, std::string>
CompileFlagsByLangAndArch;
public:
cmFastbuildNormalTargetGenerator(cmGeneratorTarget* gt, std::string config);
void Generate() override;
private:
void GenerateLink(FastbuildTarget& target,
std::vector<std::string> const& objectDepends);
bool DetectBaseLinkerCommand(std::string& command, std::string const& arch,
cmGeneratorTarget::Names const& targetNames);
// Get languages used by the target.
std::set<std::string> GetLanguages();
// Returns mapping from language to command how to compile object file for
// the it.
// Example return value: {"CXX" : "<CMAKE_CXX_COMPILER> <DEFINES> <INCLUDES>
// <FLAGS> -o <OBJECT> -c <SOURCE>" }
std::unordered_map<std::string, std::string> GetCompileObjectCommand() const;
std::string GetCudaCompileMode() const;
std::string GetLinkCommand() const;
void AddCompilerLaunchersForLanguages();
void AddLinkerLauncher();
void AddCMakeLauncher();
void ComputePaths(FastbuildTarget& fastbuildTarget) const;
std::string ComputeCodeCheckOptions(cmSourceFile const& srcFile);
cmRulePlaceholderExpander::RuleVariables ComputeRuleVariables() const;
std::vector<std::string> GetSourceProperty(cmSourceFile const& srcFile,
std::string const& prop) const;
std::string GetCompileOptions(cmSourceFile const& srcFile,
std::string const& arch);
std::vector<std::string> GetArches() const;
void GetCudaDeviceLinkLinkerAndArgs(std::string& linker,
std::string& args) const;
void GenerateCudaDeviceLink(FastbuildTarget& target) const;
void GenerateObjects(FastbuildTarget& target);
FastbuildUnityNode GetOneUnity(std::set<std::string> const& isolatedFiles,
std::vector<std::string>& files,
int unitySize) const;
int GetUnityBatchSize() const;
std::vector<FastbuildUnityNode> GenerateUnity(
std::vector<FastbuildObjectListNode>& objects,
std::set<std::string> const& isolatedSources,
std::map<std::string, std::vector<std::string>> const& sourcesWithGroups);
FastbuildUnityNode GenerateGroupedUnityNode(
std::vector<std::string>& inputFiles,
std::map<std::string, std::vector<std::string>> const& sourcesWithGroups,
int& groupId);
// Computes .CompilerOptions for the ObjectList node.
void ComputeCompilerAndOptions(std::string const& compilerOptions,
std::string const& staticCheckOptions,
std::string const& language,
FastbuildObjectListNode& outObjectList);
std::string GetImportedLoc(cmComputeLinkInformation::Item const& item) const;
std::string ResolveIfAlias(std::string const& targetName) const;
void AppendExtraResources(std::set<std::string>& deps) const;
void AppendExternalObject(FastbuildLinkerNode& linkerNode,
std::set<std::string>& linkedObjects) const;
void AppendExeToLink(FastbuildLinkerNode& linkerNode,
cmComputeLinkInformation::Item const& item) const;
void AppendTargetDep(FastbuildLinkerNode& linkerNode,
std::set<std::string>& linkedObjects,
cmComputeLinkInformation::Item const& item) const;
void AppendPrebuildDeps(FastbuildLinkerNode& linkerNode,
cmComputeLinkInformation::Item const& item) const;
void AppendTransitivelyLinkedObjects(
cmGeneratorTarget const& target,
std::set<std::string>& linkedObjects) const;
void AppendCommandLineDep(FastbuildLinkerNode& linkerNode,
cmComputeLinkInformation::Item const& item) const;
void AppendToLibraries2IfApplicable(FastbuildLinkerNode& linkerNode,
std::string dep) const;
void AppendLINK_DEPENDS(FastbuildLinkerNode& linkerNode) const;
void AppendLinkDep(FastbuildLinkerNode& linkerNode, std::string dep) const;
void AppendDirectObjectLibs(FastbuildLinkerNode& linkerNode,
std::set<std::string>& linkedObjects);
void AppendLinkDeps(std::set<FastbuildTargetDep>& preBuildDeps,
FastbuildLinkerNode& linkerNode,
FastbuildLinkerNode& cudaDeviceLinkLinkerNode);
void AddLipoCommand(FastbuildTarget& target);
void GenerateModuleDefinitionInfo(FastbuildTarget& target) const;
std::vector<FastbuildExecNode> GetSymlinkExecs() const;
void ProcessManifests(FastbuildLinkerNode& linkerNode) const;
void AddStampExeIfApplicable(FastbuildTarget& fastbuildTarget) const;
void ProcessPostBuildForStaticLib(FastbuildTarget& fastbuildTarget) const;
void CollapseAllExecsIntoOneScriptfile(
std::string const& scriptFileName,
std::vector<FastbuildExecNode> const& execs) const;
void AddPrebuildDeps(FastbuildTarget& target) const;
std::string DetectCompilerFlags(cmSourceFile const& srcFile,
std::string const& arch);
void SplitLinkerFromArgs(std::string const& command,
std::string& outLinkerExecutable,
std::string& outLinkerArgs) const;
void GetLinkerExecutableAndArgs(std::string const& command,
std::string& outLinkerExecutable,
std::string& outLinkerArgs);
void ApplyLinkRuleLauncher(std::string& command);
void ApplyLWYUToLinkerCommand(FastbuildLinkerNode& linkerNode);
std::string ComputeDefines(cmSourceFile const& srcFile);
void ComputePCH(cmSourceFile const& srcFile, FastbuildObjectListNode& node,
std::set<std::string>& createdPCH);
std::vector<std::string> GetManifestsAsFastbuildPath() const;
void EnsureDirectoryExists(std::string const& path) const;
void EnsureParentDirectoryExists(std::string const& path) const;
};
|