cmFastbuildNormalTargetGenerator.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file LICENSE.rst or https://cmake.org/licensing for details. */
  3. #pragma once
  4. #include <map>
  5. #include <memory>
  6. #include <set>
  7. #include <string>
  8. #include <unordered_map>
  9. #include <utility>
  10. #include <vector>
  11. #include "cmComputeLinkInformation.h"
  12. #include "cmFastbuildTargetGenerator.h"
  13. #include "cmGeneratorTarget.h"
  14. #include "cmRulePlaceholderExpander.h"
  15. class cmSourceFile;
  16. struct FastbuildExecNode;
  17. struct FastbuildLinkerNode;
  18. struct FastbuildObjectListNode;
  19. struct FastbuildTarget;
  20. struct FastbuildTargetDep;
  21. class cmFastbuildNormalTargetGenerator : public cmFastbuildTargetGenerator
  22. {
  23. std::unique_ptr<cmRulePlaceholderExpander> const RulePlaceholderExpander;
  24. std::string const ObjectOutDir;
  25. std::set<std::string> const Languages;
  26. std::unordered_map<std::string, std::string> const CompileObjectCmakeRules;
  27. // Now we're adding our link deps to command line and using .Libraries2 for
  28. // tracking deps.
  29. bool UsingCommandLine = false;
  30. std::unordered_map<std::string, std::string> TargetIncludesByLanguage;
  31. std::map<std::pair<std::string, std::string>, std::string>
  32. CompileFlagsByLangAndArch;
  33. public:
  34. cmFastbuildNormalTargetGenerator(cmGeneratorTarget* gt, std::string config);
  35. void Generate() override;
  36. private:
  37. void GenerateLink(FastbuildTarget& target,
  38. std::vector<std::string> const& objectDepends);
  39. bool DetectBaseLinkerCommand(std::string& command, std::string const& arch,
  40. cmGeneratorTarget::Names const& targetNames);
  41. // Get languages used by the target.
  42. std::set<std::string> GetLanguages();
  43. // Returns mapping from language to command how to compile object file for
  44. // the it.
  45. // Example return value: {"CXX" : "<CMAKE_CXX_COMPILER> <DEFINES> <INCLUDES>
  46. // <FLAGS> -o <OBJECT> -c <SOURCE>" }
  47. std::unordered_map<std::string, std::string> GetCompileObjectCommand() const;
  48. std::string GetLinkCommand() const;
  49. void AddCompilerLaunchersForLanguages();
  50. void AddLinkerLauncher();
  51. void AddCMakeLauncher();
  52. void ComputePaths(FastbuildTarget& fastbuildTarget) const;
  53. std::string ComputeCodeCheckOptions(cmSourceFile const& srcFile);
  54. cmRulePlaceholderExpander::RuleVariables ComputeRuleVariables() const;
  55. std::vector<std::string> GetSourceProperty(cmSourceFile const& srcFile,
  56. std::string const& prop) const;
  57. std::string GetCompileOptions(cmSourceFile const& srcFile,
  58. std::string const& arch);
  59. std::vector<std::string> GetArches() const;
  60. std::vector<FastbuildObjectListNode> GenerateObjects();
  61. // Computes .CompilerOptions for the ObjectList node.
  62. void ComputeCompilerAndOptions(std::string const& compilerOptions,
  63. std::string const& staticCheckOptions,
  64. std::string const& language,
  65. FastbuildObjectListNode& outObjectList);
  66. std::string GetImportedLoc(cmComputeLinkInformation::Item const& item) const;
  67. std::string ResolveIfAlias(std::string const& targetName) const;
  68. void AppendExtraResources(std::set<std::string>& deps) const;
  69. void AppendExternalObject(FastbuildLinkerNode& linkerNode,
  70. std::set<std::string>& linkedObjects) const;
  71. void AppendExeToLink(FastbuildLinkerNode& linkerNode,
  72. cmComputeLinkInformation::Item const& item) const;
  73. void AppendTargetDep(FastbuildLinkerNode& linkerNode,
  74. std::set<std::string>& linkedObjects,
  75. cmComputeLinkInformation::Item const& item) const;
  76. void AppendPrebuildDeps(FastbuildLinkerNode& linkerNode,
  77. cmComputeLinkInformation::Item const& item) const;
  78. void AppendTransitivelyLinkedObjects(
  79. cmGeneratorTarget const& target,
  80. std::set<std::string>& linkedObjects) const;
  81. void AppendCommandLineDep(FastbuildLinkerNode& linkerNode,
  82. cmComputeLinkInformation::Item const& item) const;
  83. void AppendToLibraries2IfApplicable(FastbuildLinkerNode& linkerNode,
  84. std::string dep) const;
  85. void AppendLINK_DEPENDS(FastbuildLinkerNode& linkerNode) const;
  86. void AppendLinkDep(FastbuildLinkerNode& linkerNode, std::string dep) const;
  87. void AppendDirectObjectLibs(FastbuildLinkerNode& linkerNode,
  88. std::set<std::string>& linkedObjects);
  89. void AppendLinkDeps(std::set<FastbuildTargetDep>& preBuildDeps,
  90. FastbuildLinkerNode& linkerNode);
  91. void AddLipoCommand(FastbuildTarget& target);
  92. void GenerateModuleDefinitionInfo(FastbuildTarget& target) const;
  93. std::vector<FastbuildExecNode> GetSymlinkExecs() const;
  94. void ProcessManifests(FastbuildLinkerNode& linkerNode) const;
  95. void AddStampExeIfApplicable(FastbuildTarget& fastbuildTarget) const;
  96. void CollapseAllExecsIntoOneScriptfile(
  97. std::string const& scriptFileName,
  98. std::vector<FastbuildExecNode> const& execs) const;
  99. void AddPrebuildDeps(FastbuildTarget& target) const;
  100. std::string DetectCompilerFlags(cmSourceFile const& srcFile,
  101. std::string const& arch);
  102. void GetLinkerExecutableAndArgs(std::string const& command,
  103. std::string& outLinkerExecutable,
  104. std::string& outLinkerArgs);
  105. void ApplyCompileRuleLauncher(std::string& command);
  106. void ApplyLinkRuleLauncher(std::string& command);
  107. void ApplyLWYUToLinkerCommand(FastbuildLinkerNode& linkerNode);
  108. std::string ComputeDefines(cmSourceFile const& srcFile);
  109. void ComputePCH(cmSourceFile const& srcFile, FastbuildObjectListNode& node,
  110. std::set<std::string>& createdPCH);
  111. std::vector<std::string> GetManifestsAsFastbuildPath() const;
  112. void EnsureDirectoryExists(std::string const& path) const;
  113. };