Coverage Report

Created: 2026-10-28 06:38

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/CMake/Source/cmLocalNinjaGenerator.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 <iosfwd>
8
#include <map>
9
#include <set>
10
#include <string>
11
#include <vector>
12
13
#include "cmGeneratorOptions.h"
14
#include "cmLocalCommonGenerator.h"
15
#include "cmNinjaTypes.h"
16
#include "cmOutputConverter.h"
17
#include "cmStateTypes.h"
18
19
class cmCustomCommand;
20
class cmCustomCommandGenerator;
21
class cmGeneratedFileStream;
22
class cmGeneratorTarget;
23
class cmGlobalGenerator;
24
class cmGlobalNinjaGenerator;
25
class cmListFileBacktrace;
26
class cmMakefile;
27
class cmake;
28
29
/**
30
 * \class cmLocalNinjaGenerator
31
 * \brief Write a local build.ninja file.
32
 *
33
 * cmLocalNinjaGenerator produces a local build.ninja file from its
34
 * member Makefile.
35
 */
36
class cmLocalNinjaGenerator : public cmLocalCommonGenerator
37
{
38
public:
39
  cmLocalNinjaGenerator(cmGlobalGenerator* gg, cmMakefile* mf);
40
41
  ~cmLocalNinjaGenerator() override;
42
43
  void Generate() override;
44
45
  std::unique_ptr<cmRulePlaceholderExpander> CreateRulePlaceholderExpander(
46
    cmBuildStep buildStep = cmBuildStep::Compile) const override;
47
48
  cmGlobalNinjaGenerator const* GetGlobalNinjaGenerator() const;
49
  cmGlobalNinjaGenerator* GetGlobalNinjaGenerator();
50
51
  cmake const* GetCMakeInstance() const;
52
  cmake* GetCMakeInstance();
53
54
  std::string const& GetWorkingDirectory() const override;
55
56
  std::string MaybeRelativeToWorkDir(std::string const& path) const override;
57
58
  /// @returns the relative path between the HomeOutputDirectory and this
59
  /// local generators StartOutputDirectory.
60
  std::string GetHomeRelativeOutputPath() const
61
0
  {
62
0
    return this->HomeRelativeOutputPath;
63
0
  }
64
  std::string GetObjectOutputRoot(
65
    cmStateEnums::IntermediateDirKind kind =
66
      cmStateEnums::IntermediateDirKind::ObjectFiles) const override;
67
68
  enum class CommandLineContext
69
  {
70
    Build,
71
    CompileCommands
72
  };
73
74
  std::string BuildCommandLine(
75
    std::vector<std::string> const& cmdLines, std::string const& outputConfig,
76
    std::string const& commandConfig,
77
    std::string const& customStep = std::string(),
78
    cmGeneratorTarget const* target = nullptr,
79
    CommandLineContext context = CommandLineContext::Build) const;
80
81
  void AppendTargetOutputs(cmGeneratorTarget* target, cmNinjaDeps& outputs,
82
                           std::string const& config);
83
  void AppendTargetDepends(cmGeneratorTarget* target, cmNinjaDeps& outputs,
84
                           std::string const& config,
85
                           std::string const& fileConfig,
86
                           cmNinjaTargetDepends depends);
87
88
  std::string CreateUtilityOutput(std::string const& targetName,
89
                                  std::vector<std::string> const& byproducts,
90
                                  cmListFileBacktrace const& bt) override;
91
92
  std::vector<cmCustomCommandGenerator> MakeCustomCommandGenerators(
93
    cmCustomCommand const& cc, std::string const& config) override;
94
95
  void AddCustomCommandTarget(cmCustomCommand const* cc,
96
                              cmGeneratorTarget* target);
97
  void AppendCustomCommandLines(cmCustomCommandGenerator const& ccg,
98
                                std::vector<std::string>& cmdLines);
99
  void AppendCustomCommandDeps(cmCustomCommandGenerator const& ccg,
100
                               cmNinjaDeps& ninjaDeps,
101
                               std::string const& config);
102
103
  bool HasUniqueByproducts(std::vector<std::string> const& byproducts,
104
                           cmListFileBacktrace const& bt);
105
106
  std::string GetLinkDependencyFile(cmGeneratorTarget* target,
107
                                    std::string const& config) const override;
108
109
protected:
110
  std::string ConvertToIncludeReference(
111
    std::string const& path, cmOutputConverter::OutputFormat format) override;
112
113
private:
114
  cmGeneratedFileStream& GetImplFileStream(std::string const& config) const;
115
  cmGeneratedFileStream& GetCommonFileStream() const;
116
  cmGeneratedFileStream& GetRulesFileStream() const;
117
118
  void WriteBuildFileTop();
119
  void WriteProjectHeader(std::ostream& os);
120
  void WriteNinjaRequiredVersion(std::ostream& os);
121
  void WriteNinjaConfigurationVariable(std::ostream& os,
122
                                       std::string const& config);
123
  void WriteNinjaFilesInclusionConfig(std::ostream& os);
124
  void WriteNinjaFilesInclusionCommon(std::ostream& os);
125
  void WriteNinjaWorkDir(std::ostream& os);
126
  void WriteProcessedMakefile(std::ostream& os);
127
  void WritePools(std::ostream& os);
128
129
  void WriteCustomCommandBuildStatement(
130
    cmCustomCommand const* cc, std::set<cmGeneratorTarget*> const& targets,
131
    std::string const& config);
132
133
  void WriteCustomCommandBuildStatements(std::string const& config);
134
135
  std::string MakeCustomLauncher(cmCustomCommandGenerator const& ccg);
136
137
  std::string WriteCommandScript(std::vector<std::string> const& cmdLines,
138
                                 std::string const& outputConfig,
139
                                 std::string const& commandConfig,
140
                                 std::string const& customStep,
141
                                 cmGeneratorTarget const* target) const;
142
143
  void AdditionalCleanFiles(std::string const& config);
144
145
  std::string HomeRelativeOutputPath;
146
147
  using CustomCommandTargetMap =
148
    std::map<cmCustomCommand const*, std::set<cmGeneratorTarget*>>;
149
  CustomCommandTargetMap CustomCommandTargets;
150
  std::vector<cmCustomCommand const*> CustomCommands;
151
};