/* 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 "cmPkgConfigParser.h" 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 cmPkgConfigEnv { cm::optional> Path; cm::optional> LibDirs; cm::optional> SysCflags; cm::optional> SysLibs; cm::optional SysrootDir; cm::optional TopBuildDir; std::vector search; cm::optional DisableUninstalled; bool AllowSysCflags = true; bool AllowSysLibs = true; }; class cmPkgConfigResolver { public: enum class Strictness { Strict, Permissive, BestEffort, }; cmPkgConfigResolver(cmPkgConfigParser parser, cmPkgConfigEnv const& env, std::string const& pcFileDir); static cm::optional Resolve( cmPkgConfigParser parser, cmPkgConfigEnv const& env, Strictness strictness, std::string const& pcFileDir); static cm::optional ResolveStrict( cmPkgConfigParser parser, cmPkgConfigEnv const& env, std::string const& pcFileDir); static cm::optional ResolvePermissive( cmPkgConfigParser parser, cmPkgConfigEnv const& env, std::string const& pcFileDir); static cmPkgConfigResolver ResolveBestEffort(cmPkgConfigParser parser, cmPkgConfigEnv const& env, std::string const& pcFileDir); std::string Literal(std::string const& key) const; std::string Name() const; std::string Description() const; std::string Version() const; std::vector Conflicts() const; std::vector Provides() const; std::vector Requires(bool priv = false) const; cmPkgConfigCflagsResult Cflags(bool priv = false) const; cmPkgConfigLibsResult Libs(bool priv = false) const; static std::string VersionReqString(cmPkgConfigDependencySpec const& spec); static bool CheckVersion(cmPkgConfigDependencySpec 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: void ConfigureParser(std::string const& pcFileDir); bool HasRequiredFields() const; bool HasStrictConflicts() const; std::vector Fragments(std::string const& key) const; std::vector Dependencies( std::string const& key) const; static cmPkgConfigCflagsResult MangleCflags( std::vector const& flags, cmPkgConfigEnv const& env); static cmPkgConfigLibsResult MangleLibs( std::vector const& flags, cmPkgConfigEnv const& env); static std::string Reroot(std::string const& flag, char const* prefix, std::string const& sysroot); mutable cmPkgConfigParser Parser; cmPkgConfigEnv const* Env; };