Coverage Report

Created: 2026-04-29 07:01

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/CMake/Source/cmNinjaTargetGenerator.h
Line
Count
Source
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
5
#include "cmConfigure.h" // IWYU pragma: keep
6
7
#include <map>
8
#include <memory>
9
#include <set>
10
#include <string>
11
#include <utility>
12
#include <vector>
13
14
#include <cm/string_view>
15
16
#include <cm3p/json/value.h>
17
18
#include "cmCommonTargetGenerator.h"
19
#include "cmGlobalNinjaGenerator.h"
20
#include "cmImportedCxxModuleInfo.h"
21
#include "cmNinjaTypes.h"
22
#include "cmOSXBundleGenerator.h"
23
24
class cmGeneratedFileStream;
25
class cmGeneratorTarget;
26
class cmLocalNinjaGenerator;
27
class cmMakefile;
28
class cmSourceFile;
29
30
class cmNinjaTargetGenerator : public cmCommonTargetGenerator
31
{
32
public:
33
  /// Create a cmNinjaTargetGenerator according to the @a target's type.
34
  static std::unique_ptr<cmNinjaTargetGenerator> New(
35
    cmGeneratorTarget* target);
36
37
  /// Build a NinjaTargetGenerator.
38
  cmNinjaTargetGenerator(cmGeneratorTarget* target);
39
40
  /// Destructor.
41
  ~cmNinjaTargetGenerator() override;
42
43
  virtual void Generate(std::string const& config) = 0;
44
45
  std::string GetTargetName() const;
46
47
  std::string ConvertToOutputFormatForShell(cm::string_view path) const;
48
49
  void AddDepfileBinding(cmNinjaVars& vars, std::string depfile) const;
50
  void RemoveDepfileBinding(cmNinjaVars& vars) const;
51
52
protected:
53
  bool SetMsvcTargetPdbVariable(cmNinjaVars&, std::string const& config) const;
54
55
  cmGeneratedFileStream& GetImplFileStream(std::string const& config) const;
56
  cmGeneratedFileStream& GetCommonFileStream() const;
57
  cmGeneratedFileStream& GetRulesFileStream() const;
58
59
  cmGeneratorTarget* GetGeneratorTarget() const
60
0
  {
61
0
    return this->GeneratorTarget;
62
0
  }
63
64
  cmLocalNinjaGenerator* GetLocalGenerator() const
65
0
  {
66
0
    return this->LocalGenerator;
67
0
  }
68
69
  cmGlobalNinjaGenerator* GetGlobalGenerator() const;
70
71
0
  cmMakefile* GetMakefile() const { return this->Makefile; }
72
73
  enum class WithScanning
74
  {
75
    No,
76
    Yes,
77
  };
78
  std::string LanguageCompilerRule(std::string const& lang,
79
                                   std::string const& config,
80
                                   WithScanning withScanning) const;
81
  std::string LanguageEmitModuleRule(std::string const& lang,
82
                                     std::string const& config) const;
83
  std::string LanguagePreprocessAndScanRule(std::string const& lang,
84
                                            std::string const& config) const;
85
  std::string LanguageScanRule(std::string const& lang,
86
                               std::string const& config) const;
87
  std::string LanguageDyndepRule(std::string const& lang,
88
                                 std::string const& config) const;
89
  bool NeedExplicitPreprocessing(std::string const& lang) const;
90
  bool CompileWithDefines(std::string const& lang) const;
91
92
  std::string OrderDependsTargetForTarget(std::string const& config);
93
  std::string OrderDependsTargetForTargetPrivate(std::string const& config);
94
95
  std::string ComputeOrderDependsForTarget();
96
97
  /**
98
   * Compute the flags for compilation of object files for a given @a language.
99
   * @note Generally it is the value of the variable whose name is computed
100
   *       by LanguageFlagsVarName().
101
   */
102
  std::string ComputeFlagsForObject(cmSourceFile const* source,
103
                                    std::string const& language,
104
                                    std::string const& config,
105
                                    std::string const& objectFileName);
106
107
  void AddIncludeFlags(std::string& flags, std::string const& lang,
108
                       std::string const& config) override;
109
110
  std::string ComputeDefines(cmSourceFile const* source,
111
                             std::string const& language,
112
                             std::string const& config);
113
114
  std::string ComputeIncludes(cmSourceFile const* source,
115
                              std::string const& language,
116
                              std::string const& config);
117
118
  std::string const& ConvertToNinjaPath(std::string const& path) const
119
0
  {
120
0
    return this->GetGlobalGenerator()->ConvertToNinjaPath(path);
121
0
  }
122
  cmGlobalNinjaGenerator::MapToNinjaPathImpl MapToNinjaPath() const
123
0
  {
124
0
    return this->GetGlobalGenerator()->MapToNinjaPath();
125
0
  }
126
127
  std::string ConvertToNinjaAbsPath(std::string path) const
128
0
  {
129
0
    return this->GetGlobalGenerator()->ConvertToNinjaAbsPath(std::move(path));
130
0
  }
131
132
  /// @return the list of link dependency for the given target @a target.
133
  cmNinjaDeps ComputeLinkDeps(std::string const& linkLanguage,
134
                              std::string const& config,
135
                              bool ignoreType = false) const;
136
137
  /// @return the source file path for the given @a source.
138
  std::string GetCompiledSourceNinjaPath(cmSourceFile const* source) const;
139
140
  std::string GetObjectFileDir(std::string const& config) const;
141
  /// @return the object file path for the given @a source.
142
  std::string GetObjectFilePath(cmSourceFile const* source,
143
                                std::string const& config) const;
144
  std::string GetBmiFilePath(cmSourceFile const* source,
145
                             std::string const& config) const;
146
147
  /// @return the preprocessed source file path for the given @a source.
148
  std::string GetPreprocessedFilePath(cmSourceFile const* source,
149
                                      std::string const& config) const;
150
151
  /// @return the clang-tidy replacements file path for the given @a source.
152
  std::string GetClangTidyReplacementsFilePath(
153
    std::string const& directory, cmSourceFile const& source,
154
    std::string const& config) const override;
155
156
  /// @return the dyndep file path for this target.
157
  std::string GetDyndepFilePath(std::string const& lang,
158
                                std::string const& config) const;
159
160
  /// @return the target dependency scanner info file path
161
  std::string GetTargetDependInfoPath(std::string const& lang,
162
                                      std::string const& config) const;
163
164
  /// @return the file path where the target named @a name is generated.
165
  std::string GetTargetFilePath(std::string const& name,
166
                                std::string const& config) const;
167
168
  /// @return the output path for the target.
169
  virtual std::string GetTargetOutputDir(std::string const& config) const;
170
171
  void WriteLanguageRules(std::string const& language,
172
                          std::string const& config);
173
  std::string GetCompileTemplateVar(std::string const& lang) const;
174
  void WriteCompileRule(std::string const& language,
175
                        std::string const& config);
176
  void WriteCompileRule(std::string const& language, std::string const& config,
177
                        WithScanning withScanning);
178
  void WriteObjectBuildStatements(std::string const& config,
179
                                  std::string const& fileConfig,
180
                                  bool firstForConfig);
181
  void WriteCxxModuleBmiBuildStatement(cmSourceFile const* source,
182
                                       std::string const& config,
183
                                       std::string const& fileConfig,
184
                                       bool firstForConfig);
185
  void WriteSwiftObjectBuildStatement(
186
    std::vector<cmSourceFile const*> const& sources, std::string const& config,
187
    std::string const& fileConfig, bool firstForConfig);
188
  void WriteObjectBuildStatement(cmSourceFile const* source,
189
                                 std::string const& config,
190
                                 std::string const& fileConfig,
191
                                 bool firstForConfig);
192
  void WriteTargetDependInfo(std::string const& lang,
193
                             std::string const& config);
194
195
  void EmitSwiftDependencyInfo(cmSourceFile const* source,
196
                               std::string const& config);
197
198
  void GenerateSwiftOutputFileMap(std::string const& config,
199
                                  std::string& flags);
200
201
  void ExportObjectCompileCommand(
202
    std::string const& language, std::string const& sourceFileName,
203
    std::string const& objectDir, std::string const& targetSupportDir,
204
    std::string const& objectFileName, std::string const& objectFileDir,
205
    std::string const& flags, std::string const& defines,
206
    std::string const& includes, std::string const& targetCompilePdb,
207
    std::string const& targetPdb, std::string const& outputConfig,
208
    WithScanning withScanning);
209
210
  void ExportSwiftObjectCompileCommand(
211
    std::vector<cmSourceFile const*> const& moduleSourceFiles,
212
    std::string const& moduleObjectFilename, std::string const& flags,
213
    std::string const& defines, std::string const& includes,
214
    std::string const& outputConfig, bool singleOutput);
215
216
  void AdditionalCleanFiles(std::string const& config);
217
218
  cmNinjaDeps GetObjects(std::string const& config) const;
219
220
  void EnsureDirectoryExists(std::string const& dir) const;
221
  void EnsureParentDirectoryExists(std::string const& path) const;
222
223
  // write rules for macOS Application Bundle content.
224
  struct MacOSXContentGeneratorType
225
    : cmOSXBundleGenerator::MacOSXContentGeneratorType
226
  {
227
    MacOSXContentGeneratorType(cmNinjaTargetGenerator* g,
228
                               std::string fileConfig)
229
0
      : Generator(g)
230
0
      , FileConfig(std::move(fileConfig))
231
0
    {
232
0
    }
233
234
    void operator()(cmSourceFile const& source, char const* pkgloc,
235
                    std::string const& config) override;
236
237
  private:
238
    cmNinjaTargetGenerator* Generator;
239
    std::string FileConfig;
240
  };
241
  friend struct MacOSXContentGeneratorType;
242
243
  // Properly initialized by sub-classes.
244
  std::unique_ptr<cmOSXBundleGenerator> OSXBundleGenerator;
245
  std::set<std::string> MacContentFolders;
246
247
  /// @param source may be nullptr.
248
  void addPoolNinjaVariable(std::string const& pool_property,
249
                            cmGeneratorTarget* target,
250
                            cmSourceFile const* source, cmNinjaVars& vars);
251
252
  bool ForceResponseFile();
253
254
private:
255
  cmLocalNinjaGenerator* LocalGenerator;
256
  bool HasPrivateGeneratedSources = false;
257
258
  struct ScanningFiles
259
  {
260
    bool IsEmpty() const
261
0
    {
262
0
      return this->ScanningOutput.empty() && this->ModuleMapFile.empty();
263
0
    }
264
265
    std::string ScanningOutput;
266
    std::string ModuleMapFile;
267
  };
268
269
  struct ByConfig
270
  {
271
    /// List of object files for this target.
272
    cmNinjaDeps Objects;
273
    // Dyndep Support
274
    std::map<std::string, std::vector<ScanningFiles>> ScanningInfo;
275
    // Imported C++ module info.
276
    mutable ImportedCxxModuleLookup ImportedCxxModules;
277
    // Swift Support
278
    Json::Value SwiftOutputMap;
279
    cmNinjaDeps ExtraFiles;
280
    std::unique_ptr<MacOSXContentGeneratorType> MacOSXContentGenerator;
281
  };
282
283
  std::map<std::string, ByConfig> Configs;
284
};