File: cmCxxModuleMetadata.h

package info (click to toggle)
cmake 4.3.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 158,704 kB
  • sloc: ansic: 406,077; cpp: 309,512; sh: 4,233; python: 3,696; yacc: 3,109; lex: 1,279; f90: 538; asm: 471; lisp: 375; java: 310; cs: 270; fortran: 239; objc: 215; perl: 213; xml: 198; makefile: 110; javascript: 83; pascal: 63; tcl: 55; php: 25; ruby: 22; sed: 2
file content (101 lines) | stat: -rw-r--r-- 2,847 bytes parent folder | download
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
/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file LICENSE.rst or https://cmake.org/licensing for details.  */
#pragma once

#include <string>
#include <vector>

#include <cm/optional>
#include <cm/string_view>

#include <cm3p/json/value.h>

class cmTarget;

class cmCxxModuleMetadata
{
public:
  struct PreprocessorDefineData
  {
    // definition["name"]
    std::string Name;
    // definition["value"]
    cm::optional<std::string> Value;
    // definition["undef"]
    bool Undef = false;
  };

  struct LocalArgumentsData
  {
    // local-arguments["include-directories"]
    std::vector<std::string> IncludeDirectories;
    // local-arguments["system-include-directories"]
    std::vector<std::string> SystemIncludeDirectories;
    // local-arguments["definitions"]
    std::vector<PreprocessorDefineData> Definitions;

    // These are CMake vendor extensions
    // local-arguments["vendor"]["cmake"]["compile-options"]
    std::vector<std::string> CompileOptions;
    // local-arguments["vendor"]["cmake"]["compile-features"]
    std::vector<std::string> CompileFeatures;
  };

  struct ModuleData
  {
    // module["logical-name"]
    std::string LogicalName;
    // module["source-path"]
    std::string SourcePath;
    // module["is-interface"]
    bool IsInterface = true;
    // module["is-std-library"]
    bool IsStdLibrary = false;
    // module["local-arguments"]
    cm::optional<LocalArgumentsData> LocalArguments;
  };

  // root["version"]
  int Version = 1;
  // root["revision"]
  int Revision = 1;
  // root["modules"]
  std::vector<ModuleData> Modules;

  // The path to the manifest file, either absolute or relative to the
  // installation root
  std::string MetadataFilePath;

  struct ParseResult;

  struct SaveResult
  {
    bool Ok = false;
    std::string Error;
    explicit operator bool() const { return Ok; }
  };

  static ParseResult LoadFromFile(std::string const& path);
  static Json::Value ToJsonValue(cmCxxModuleMetadata const& meta);
  static SaveResult SaveToFile(std::string const& path,
                               cmCxxModuleMetadata const& meta);
  static void PopulateTarget(cmTarget& target, cmCxxModuleMetadata const& meta,
                             std::vector<std::string> const& configs);
  static void PopulateTarget(cmTarget& target, cmCxxModuleMetadata const& meta,
                             cm::string_view config)
  {
    PopulateTarget(target, meta,
                   std::vector<std::string>{ std::string(config) });
  }
  static void PopulateTarget(cmTarget& target, cmCxxModuleMetadata const& meta)
  {
    PopulateTarget(target, meta, "NOCONFIG");
  }
};

struct cmCxxModuleMetadata::ParseResult
{
  cm::optional<cmCxxModuleMetadata> Meta;
  std::string Error;
  explicit operator bool() const { return static_cast<bool>(Meta); }
};