cmFindPackageCommand.h 5.34 KB
Newer Older
1
2
/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing for details.  */
3
4
5
#ifndef cmFindPackageCommand_h
#define cmFindPackageCommand_h

6
#include "cmConfigure.h"
7

8
#include "cm_kwiml.h"
9
10
11
12
13
#include <map>
#include <set>
#include <string>
#include <vector>

14
15
#include "cmFindCommon.h"

16
17
18
class cmCommand;
class cmExecutionStatus;
class cmSearchPath;
19
20
21
22
23
24

/** \class cmFindPackageCommand
 * \brief Load settings from an external project.
 *
 * cmFindPackageCommand
 */
25
class cmFindPackageCommand : public cmFindCommon
26
27
{
public:
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
  /*! A sorting order strategy to be applied to recovered package folders (see
   * FIND_PACKAGE_SORT_ORDER)*/
  enum /*class*/ SortOrderType
  {
    None,
    Name_order,
    Natural
  };
  /*! A sorting direction to be applied to recovered package folders (see
   * FIND_PACKAGE_SORT_DIRECTION)*/
  enum /*class*/ SortDirectionType
  {
    Asc,
    Dec
  };

  /*! sorts a given list of string based on the input sort parameters */
  static void Sort(std::vector<std::string>::iterator begin,
                   std::vector<std::string>::iterator end, SortOrderType order,
                   SortDirectionType dir);

49
50
  cmFindPackageCommand();

51
52
53
  /**
   * This is a virtual constructor for the command.
   */
54
  cmCommand* Clone() CM_OVERRIDE { return new cmFindPackageCommand; }
55
56
57
58
59

  /**
   * This is called when the command is first encountered in
   * the CMakeLists.txt file.
   */
60
61
  bool InitialPass(std::vector<std::string> const& args,
                   cmExecutionStatus& status) CM_OVERRIDE;
62
63

private:
64
65
66
67
  class PathLabel : public cmFindCommon::PathLabel
  {
  protected:
    PathLabel();
68

69
  public:
70
71
72
73
    PathLabel(const std::string& label)
      : cmFindCommon::PathLabel(label)
    {
    }
74
75
76
77
78
79
80
81
82
    static PathLabel UserRegistry;
    static PathLabel Builds;
    static PathLabel SystemRegistry;
  };

  // Add additional search path labels and groups not present in the
  // parent class
  void AppendSearchPathGroups();

83
  void AppendSuccessInformation();
84
  void AppendToFoundProperty(bool found);
85
  void SetModuleVariables(const std::string& components);
86
  bool FindModule(bool& found);
87
  void AddFindDefinition(const std::string& var, const char* val);
88
  void RestoreFindDefinitions();
89
  bool HandlePackageMode();
90
  bool FindConfig();
91
92
93
  bool FindPrefixedConfig();
  bool FindFrameworkConfig();
  bool FindAppBundleConfig();
94
95
96
97
98
  enum PolicyScopeRule
  {
    NoPolicyScope,
    DoPolicyScope
  };
99
  bool ReadListFile(const char* f, PolicyScopeRule psr);
100
  void StoreVersionFound();
101

102
  void ComputePrefixes();
103
  void FillPrefixesPackageRoot();
104
105
106
107
108
109
110
111
  void FillPrefixesCMakeEnvironment();
  void FillPrefixesCMakeVariable();
  void FillPrefixesSystemEnvironment();
  void FillPrefixesUserRegistry();
  void FillPrefixesSystemRegistry();
  void FillPrefixesCMakeSystemVariable();
  void FillPrefixesUserGuess();
  void FillPrefixesUserHints();
112
  void LoadPackageRegistryDir(std::string const& dir, cmSearchPath& outPaths);
113
114
  void LoadPackageRegistryWinUser();
  void LoadPackageRegistryWinSystem();
115
  void LoadPackageRegistryWin(bool user, unsigned int view,
116
                              cmSearchPath& outPaths);
117
  bool CheckPackageRegistryEntry(const std::string& fname,
118
                                 cmSearchPath& outPaths);
119
120
121
  bool SearchDirectory(std::string const& dir);
  bool CheckDirectory(std::string const& dir);
  bool FindConfigFile(std::string const& dir, std::string& file);
122
  bool CheckVersion(std::string const& config_file);
123
124
  bool CheckVersionFile(std::string const& version_file,
                        std::string& result_version);
125
126
127
128
129
130
  bool SearchPrefix(std::string const& prefix);
  bool SearchFrameworkPrefix(std::string const& prefix_in);
  bool SearchAppBundlePrefix(std::string const& prefix_in);

  friend class cmFindPackageFileList;

131
132
133
134
135
  struct OriginalDef
  {
    bool exists;
    std::string value;
  };
136
  std::map<std::string, OriginalDef> OriginalDefs;
137

138
139
140
  std::string Name;
  std::string Variable;
  std::string Version;
141
142
143
  unsigned int VersionMajor;
  unsigned int VersionMinor;
  unsigned int VersionPatch;
144
  unsigned int VersionTweak;
145
  unsigned int VersionCount;
146
  bool VersionExact;
147
148
  std::string FileFound;
  std::string VersionFound;
149
150
151
  unsigned int VersionFoundMajor;
  unsigned int VersionFoundMinor;
  unsigned int VersionFoundPatch;
152
  unsigned int VersionFoundTweak;
153
  unsigned int VersionFoundCount;
Brad King's avatar
Brad King committed
154
  KWIML_INT_uint64_t RequiredCMakeVersion;
155
156
  bool Quiet;
  bool Required;
157
  bool UseConfigFiles;
158
  bool UseFindModules;
159
  bool NoUserRegistry;
160
  bool NoSystemRegistry;
161
  bool DebugMode;
162
  bool UseLib32Paths;
163
  bool UseLib64Paths;
Steven Newbury's avatar
Steven Newbury committed
164
  bool UseLibx32Paths;
165
  bool PolicyScope;
166
  std::string LibraryArchitecture;
167
168
  std::vector<std::string> Names;
  std::vector<std::string> Configs;
169
  std::set<std::string> IgnoredPaths;
170

171
172
173
174
175
  /*! the selected sortOrder (None by default)*/
  SortOrderType SortOrder;
  /*! the selected sortDirection (Asc by default)*/
  SortDirectionType SortDirection;

176
177
178
179
  struct ConfigFileInfo
  {
    std::string filename;
    std::string version;
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194

    bool operator<(ConfigFileInfo const& rhs) const
    {
      return this->filename < rhs.filename;
    }

    bool operator==(ConfigFileInfo const& rhs) const
    {
      return this->filename == rhs.filename;
    }

    bool operator!=(ConfigFileInfo const& rhs) const
    {
      return !(*this == rhs);
    }
195
  };
196
  std::vector<ConfigFileInfo> ConsideredConfigs;
197
198
199
};

#endif