/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file LICENSE.rst or https://cmake.org/licensing for details. */ #pragma once #include "cmConfigure.h" // IWYU pragma: keep #include #include #include #include #include // From cmPkgConfigParser.h, IWYU doesn't like including the header struct cmPkgConfigEntry; struct cmPkgConfigCflagsResult { std::string Flagline; std::vector Includes; std::vector CompileOptions; }; struct cmPkgConfigLibsResult { std::string Flagline; std::vector LibDirs; std::vector LibNames; std::vector LinkOptions; }; struct cmPkgConfigVersionReq { enum { ANY = 0, LT, LT_EQ, EQ, NEQ, GT_EQ, GT, } Operation = ANY; std::string Version; }; struct cmPkgConfigDependency { std::string Name; cmPkgConfigVersionReq VerReq; }; struct cmPkgConfigEnv { cm::optional> Path; cm::optional> LibDirs; cm::optional> SysCflags; cm::optional> SysLibs; cm::optional SysrootDir; cm::optional TopBuildDir; cm::optional DisableUninstalled; bool AllowSysCflags = true; bool AllowSysLibs = true; }; class cmPkgConfigResult { public: std::unordered_map Keywords; std::unordered_map Variables; std::string Name(); std::string Description(); std::string Version(); std::vector Conflicts(); std::vector Provides(); std::vector Requires(bool priv = false); cmPkgConfigCflagsResult Cflags(bool priv = false); cmPkgConfigLibsResult Libs(bool priv = false); cmPkgConfigEnv env; private: std::string StrOrDefault(std::string const& key, cm::string_view def = ""); }; class cmPkgConfigResolver { friend class cmPkgConfigResult; public: static cm::optional ResolveStrict( std::vector const& entries, cmPkgConfigEnv env); static cm::optional ResolvePermissive( std::vector const& entries, cmPkgConfigEnv env); static cmPkgConfigResult ResolveBestEffort( std::vector const& entries, cmPkgConfigEnv env); static cmPkgConfigVersionReq ParseVersion(std::string const& version); static bool CheckVersion(cmPkgConfigVersionReq const& desired, std::string const& provided); static void ReplaceSep(std::string& list); #ifdef _WIN32 static char const Sep = ';'; #else static char const Sep = ':'; #endif private: static std::string HandleVariablePermissive( cmPkgConfigEntry const& entry, std::unordered_map const& variables); static cm::optional HandleVariableStrict( cmPkgConfigEntry const& entry, std::unordered_map const& variables); static std::string HandleKeyword( cmPkgConfigEntry const& entry, std::unordered_map const& variables); static std::vector TokenizeFlags( std::string const& flagline); static cmPkgConfigCflagsResult MangleCflags( std::vector const& flags); static cmPkgConfigCflagsResult MangleCflags( std::vector const& flags, std::string const& sysroot); static cmPkgConfigCflagsResult MangleCflags( std::vector const& flags, std::vector const& syspaths); static cmPkgConfigCflagsResult MangleCflags( std::vector const& flags, std::string const& sysroot, std::vector const& syspaths); static cmPkgConfigLibsResult MangleLibs( std::vector const& flags); static cmPkgConfigLibsResult MangleLibs( std::vector const& flags, std::string const& sysroot); static cmPkgConfigLibsResult MangleLibs( std::vector const& flags, std::vector const& syspaths); static cmPkgConfigLibsResult MangleLibs( std::vector const& flags, std::string const& sysroot, std::vector const& syspaths); static std::string Reroot(cm::string_view flag, cm::string_view prefix, std::string const& sysroot); static cmPkgConfigVersionReq ParseVersion(std::string::const_iterator& cur, std::string::const_iterator end); static std::vector ParseDependencies( std::string const& deps); };