/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #pragma once #include "cmConfigure.h" // IWYU pragma: keep #include #include #include #include #include "cmPathLabel.h" #include "cmSearchPath.h" #include "cmWindowsRegistry.h" class cmExecutionStatus; class cmMakefile; /** \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: cmFindCommon(cmExecutionStatus& status); void SetError(std::string const& e); bool DebugModeEnabled() const { return this->DebugMode; } protected: friend class cmSearchPath; friend class cmFindBaseDebugState; /** 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& paths, std::string* debugBuffer = nullptr); /** Get ignored paths from CMAKE_[SYSTEM_]IGNORE_PATH variables. */ void GetIgnoredPaths(std::vector& ignore); void GetIgnoredPaths(std::set& ignore); /** Get ignored paths from CMAKE_[SYSTEM_]IGNORE_PREFIX_PATH variables. */ void GetIgnoredPrefixPaths(std::vector& ignore); void GetIgnoredPrefixPaths(std::set& ignore); /** Compute final search path list (reroot + trailing slash). */ enum class IgnorePaths { No, Yes, }; void ComputeFinalPaths(IgnorePaths ignorePaths, std::string* debugBuffer = nullptr); /** Compute the current default root path mode. */ void SelectDefaultRootPathMode(); /** Compute the current default bundle/framework search policy. */ void SelectDefaultMacMode(); /** Compute the current default search modes based on global variables. */ void SelectDefaultSearchModes(); /** The `InitialPass` functions of the child classes should set this->DebugMode to the result of these. */ bool ComputeIfDebugModeWanted(); bool ComputeIfDebugModeWanted(std::string const& var); // Path arguments prior to path manipulation routines std::vector UserHintsArgs; std::vector UserGuessArgs; std::string CMakePathName; RootPathMode FindRootPathMode; bool CheckCommonArgument(std::string const& arg); void AddPathSuffix(std::string const& arg); void DebugMessage(std::string const& msg) const; bool DebugMode; bool NoDefaultPath; bool NoPackageRootPath; bool NoCMakePath; bool NoCMakeEnvironmentPath; bool NoSystemEnvironmentPath; bool NoCMakeSystemPath; bool NoCMakeInstallPath; cmWindowsRegistry::View RegistryView = cmWindowsRegistry::View::Target; std::vector SearchPathSuffixes; std::map> PathGroupLabelMap; std::vector PathGroupOrder; std::map PathLabelStringMap; std::map LabeledPaths; std::vector SearchPaths; std::set SearchPathsEmitted; bool SearchFrameworkFirst; bool SearchFrameworkOnly; bool SearchFrameworkLast; bool SearchAppBundleFirst; bool SearchAppBundleOnly; bool SearchAppBundleLast; cmMakefile* Makefile; cmExecutionStatus& Status; };