mirror of
https://github.com/reactos/CMake.git
synced 2024-11-25 04:29:52 +00:00
eb35d8884b
This feature was originally added by commit v3.9.0-rc1~71^2~2 (find_*: Add a new PackageRoot search path group, 2017-05-03) and documented by commit v3.9.0-rc1~71^2 (find_*: Add docs for PackageRoot search path group, 2017-05-03). However, we had to disable the feature and remove the documentation in commit v3.9.1~2^2 (find_*: Disable the PACKAGE_ROOT search path group for CMake 3.9, 2017-08-08) due to breaking projects that used `PackageName_ROOT` variables themselves. Add policy `CMP0074` to restore the `PackageName_ROOT` variable behavior in a compatible way. Also revise the stack of root paths to store the paths themselves rather than the package names. This way the policy can be considered at the `find_package` call site instead of individual `find_` calls inside a find module. Co-Author: Chuck Atkins <chuck.atkins@kitware.com> Issue: #17144
130 lines
3.1 KiB
C++
130 lines
3.1 KiB
C++
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file Copyright.txt or https://cmake.org/licensing for details. */
|
|
#ifndef cmFindCommon_h
|
|
#define cmFindCommon_h
|
|
|
|
#include "cmConfigure.h" // IWYU pragma: keep
|
|
|
|
#include <map>
|
|
#include <set>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "cmCommand.h"
|
|
#include "cmPathLabel.h"
|
|
#include "cmSearchPath.h"
|
|
|
|
/** \class cmFindCommon
|
|
* \brief Base class for FIND_XXX implementations.
|
|
*
|
|
* cmFindCommon is a parent class for cmFindBase,
|
|
* cmFindProgramCommand, cmFindPathCommand, cmFindLibraryCommand,
|
|
* cmFindFileCommand, and cmFindPackageCommand.
|
|
*/
|
|
class cmFindCommon : public cmCommand
|
|
{
|
|
public:
|
|
cmFindCommon();
|
|
~cmFindCommon() override;
|
|
|
|
protected:
|
|
friend class cmSearchPath;
|
|
|
|
/** Used to define groups of path labels */
|
|
class PathGroup : public cmPathLabel
|
|
{
|
|
protected:
|
|
PathGroup();
|
|
|
|
public:
|
|
PathGroup(const std::string& label)
|
|
: cmPathLabel(label)
|
|
{
|
|
}
|
|
static PathGroup All;
|
|
};
|
|
|
|
/* Individual path types */
|
|
class PathLabel : public cmPathLabel
|
|
{
|
|
protected:
|
|
PathLabel();
|
|
|
|
public:
|
|
PathLabel(const std::string& label)
|
|
: cmPathLabel(label)
|
|
{
|
|
}
|
|
static PathLabel PackageRoot;
|
|
static PathLabel CMake;
|
|
static PathLabel CMakeEnvironment;
|
|
static PathLabel Hints;
|
|
static PathLabel SystemEnvironment;
|
|
static PathLabel CMakeSystem;
|
|
static PathLabel Guess;
|
|
};
|
|
|
|
enum RootPathMode
|
|
{
|
|
RootPathModeNever,
|
|
RootPathModeOnly,
|
|
RootPathModeBoth
|
|
};
|
|
|
|
/** Construct the various path groups and labels */
|
|
void InitializeSearchPathGroups();
|
|
|
|
/** Place a set of search paths under the search roots. */
|
|
void RerootPaths(std::vector<std::string>& paths);
|
|
|
|
/** Get ignored paths from CMAKE_[SYSTEM_]IGNORE_path variables. */
|
|
void GetIgnoredPaths(std::vector<std::string>& ignore);
|
|
void GetIgnoredPaths(std::set<std::string>& ignore);
|
|
|
|
/** Compute final search path list (reroot + trailing slash). */
|
|
void ComputeFinalPaths();
|
|
|
|
/** Compute the current default root path mode. */
|
|
void SelectDefaultRootPathMode();
|
|
|
|
/** Compute the current default bundle/framework search policy. */
|
|
void SelectDefaultMacMode();
|
|
|
|
// Path arguments prior to path manipulation routines
|
|
std::vector<std::string> UserHintsArgs;
|
|
std::vector<std::string> UserGuessArgs;
|
|
|
|
std::string CMakePathName;
|
|
RootPathMode FindRootPathMode;
|
|
|
|
bool CheckCommonArgument(std::string const& arg);
|
|
void AddPathSuffix(std::string const& arg);
|
|
|
|
bool NoDefaultPath;
|
|
bool NoPackageRootPath;
|
|
bool NoCMakePath;
|
|
bool NoCMakeEnvironmentPath;
|
|
bool NoSystemEnvironmentPath;
|
|
bool NoCMakeSystemPath;
|
|
|
|
std::vector<std::string> SearchPathSuffixes;
|
|
|
|
std::map<PathGroup, std::vector<PathLabel>> PathGroupLabelMap;
|
|
std::vector<PathGroup> PathGroupOrder;
|
|
std::map<std::string, PathLabel> PathLabelStringMap;
|
|
std::map<PathLabel, cmSearchPath> LabeledPaths;
|
|
|
|
std::vector<std::string> SearchPaths;
|
|
std::set<std::string> SearchPathsEmitted;
|
|
|
|
bool SearchFrameworkFirst;
|
|
bool SearchFrameworkOnly;
|
|
bool SearchFrameworkLast;
|
|
|
|
bool SearchAppBundleFirst;
|
|
bool SearchAppBundleOnly;
|
|
bool SearchAppBundleLast;
|
|
};
|
|
|
|
#endif
|