aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/pkgconfig/pkgconfig.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/pkgconfig/pkgconfig.cpp')
-rw-r--r--src/lib/pkgconfig/pkgconfig.cpp176
1 files changed, 10 insertions, 166 deletions
diff --git a/src/lib/pkgconfig/pkgconfig.cpp b/src/lib/pkgconfig/pkgconfig.cpp
index 856c871bf..6b3bde46c 100644
--- a/src/lib/pkgconfig/pkgconfig.cpp
+++ b/src/lib/pkgconfig/pkgconfig.cpp
@@ -106,50 +106,6 @@ constexpr inline char listSeparator() noexcept
#endif
}
-// based on https://stackoverflow.com/a/33135699/295518
-int compareVersions(std::string_view v1, std::string_view v2)
-{
- for (size_t i = 0, j = 0; i < v1.length() || j < v2.length(); ) {
- size_t acc1 = 0;
- size_t acc2 = 0;
-
- while (i < v1.length() && v1[i] != '.') {
- acc1 = acc1 * 10 + (v1[i] - '0');
- i++;
- }
- while (j < v2.length() && v2[j] != '.') {
- acc2 = acc2 * 10 + (v2[j] - '0');
- j++;
- }
-
- if (acc1 < acc2)
- return -1;
- if (acc1 > acc2)
- return +1;
-
- ++i;
- ++j;
- }
- return 0;
-}
-
-using ComparisonType = PcPackage::RequiredVersion::ComparisonType;
-
-bool versionTest(ComparisonType comparison, std::string_view a, std::string_view b)
-{
- switch (comparison) {
- case ComparisonType::LessThan: return compareVersions(a, b) < 0;
- case ComparisonType::GreaterThan: return compareVersions(a, b) > 0;
- case ComparisonType::LessThanEqual: return compareVersions(a, b) <= 0;
- case ComparisonType::GreaterThanEqual: return compareVersions(a, b) >= 0;
- case ComparisonType::Equal: return compareVersions(a, b) == 0;
- case ComparisonType::NotEqual: return compareVersions(a, b) != 0;
- case ComparisonType::AlwaysMatch: return true;
- }
-
- return false;
-}
-
[[noreturn]] void raizeUnknownPackageException(std::string_view package)
{
std::string message;
@@ -217,16 +173,17 @@ const PcPackageVariant &PkgConfig::getPackage(std::string_view baseFileName) con
return *it;
}
-std::string_view PkgConfig::packageGetVariable(const PcPackage &pkg, std::string_view var) const
+std::optional<std::string_view> PkgConfig::packageGetVariable(
+ const PcPackage &pkg, std::string_view var) const
{
- std::string_view varval;
+ std::optional<std::string_view> result;
if (var.empty())
- return varval;
+ return result;
const auto &globals = m_options.globalVariables;
if (auto it = globals.find(var); it != globals.end())
- varval = it->second;
+ result = it->second;
// Allow overriding specific variables using an environment variable of the
// form PKG_CONFIG_$PACKAGENAME_$VARIABLE
@@ -234,15 +191,15 @@ std::string_view PkgConfig::packageGetVariable(const PcPackage &pkg, std::string
const std::string envVariable = varToEnvVar(pkg.baseFileName, var);
const auto it = m_options.systemVariables.find(envVariable);
if (it != m_options.systemVariables.end())
- return it->second;
+ result = it->second;
}
- if (varval.empty()) {
- const auto it = pkg.variables.find(var);
- varval = (it != pkg.variables.end()) ? it->second : std::string_view();
+ if (!result) {
+ if (const auto it = pkg.variables.find(var); it != pkg.variables.end())
+ result = it->second;
}
- return varval;
+ return result;
}
#if HAS_STD_FILESYSTEM
@@ -333,116 +290,6 @@ PcBrokenPackage makeVersionMismatchDependency(
package.filePath, package.baseFileName, std::move(message)};
}
-PkgConfig::Packages PkgConfig::mergeDependencies(const PkgConfig::Packages &packages) const
-{
- std::unordered_map<std::string_view, const PcPackageVariant *> packageHash;
-
- struct MergedHashEntry
- {
- PcPackageVariant package; // merged package or broken package
- std::vector<const PcPackage *> deps; // unmerged transitive deps, including Package itself
- };
- std::unordered_map<std::string, MergedHashEntry> mergedHash;
-
- for (const auto &package: packages)
- packageHash[package.getBaseFileName()] = &package;
-
- auto func = [&](const PcPackageVariant &package, auto &f) -> const MergedHashEntry &
- {
- const auto it = mergedHash.find(package.getBaseFileName());
- if (it != mergedHash.end())
- return it->second;
-
- auto &entry = mergedHash[package.getBaseFileName()];
-
- auto visitor = [&](auto &&package) -> PcPackageVariant {
-
- using T = std::decay_t<decltype(package)>;
- if constexpr (std::is_same_v<T, PcPackage>) { // NOLINT
-
- using Flags = std::vector<PcPackage::Flag>;
-
- // returns true if multiple copies of the flag can present in the same package
- // we can't properly merge flags that have multiple parameters except for
- // -framework which we handle correctly.
- auto canHaveDuplicates = [](const PcPackage::Flag::Type &type) {
- return type == PcPackage::Flag::Type::LinkerFlag
- || type == PcPackage::Flag::Type::CompilerFlag;
- };
-
- std::unordered_set<PcPackage::Flag> visitedFlags;
- // appends only those flags to the target that were not seen before (except for
- // ones that can have duplicates)
- auto mergeFlags = [&](Flags &target, const Flags &source)
- {
- for (const auto &flag: source) {
- if (canHaveDuplicates(flag.type) || visitedFlags.insert(flag).second)
- target.push_back(flag);
- }
- };
-
- std::unordered_set<const PcPackage *> visitedDeps;
-
- PcPackage result;
- // copy only meta info for now
- result.filePath = package.filePath;
- result.baseFileName = package.baseFileName;
- result.name = package.name;
- result.version = package.version;
- result.description = package.description;
- result.url = package.url;
- result.variables = package.variables;
-
- auto allDependencies = package.requiresPublic;
- if (m_options.staticMode)
- allDependencies << package.requiresPrivate;
-
- for (const auto &dependency: allDependencies) {
- const auto it = packageHash.find(dependency.name);
- if (it == packageHash.end())
- return makeMissingDependency(result, dependency);
-
- const auto childEntry = f(*it->second, f);
- if (childEntry.package.isBroken())
- return makeBrokenDependency(result, dependency);
-
- const auto &mergedPackage = childEntry.package.asPackage();
- const bool versionOk = versionTest(
- dependency.comparison, mergedPackage.version, dependency.version);
- if (!versionOk)
- return makeVersionMismatchDependency(result, mergedPackage, dependency);
-
- for (const auto *dep: childEntry.deps) {
- if (visitedDeps.insert(dep).second)
- entry.deps.push_back(dep);
- }
- }
-
- entry.deps.push_back(&package);
-
- for (const auto *dep: entry.deps) {
- mergeFlags(result.libs, dep->libs);
- mergeFlags(result.cflags, dep->cflags);
- }
-
- return result;
- }
- return package;
- };
- entry.package = package.visit(visitor);
-
- return entry;
- };
-
- for (const auto &package: packages)
- func(package, func);
-
- Packages result;
- for (auto &[key, value]: mergedHash)
- result.push_back(std::move(value.package));
- return result;
-}
-
PkgConfig::Packages PkgConfig::findPackages() const
{
Packages result;
@@ -479,9 +326,6 @@ PkgConfig::Packages PkgConfig::findPackages() const
result.emplace_back(std::move(pkg));
}
- if (m_options.mergeDependencies)
- result = mergeDependencies(result);
-
const auto lessThanPackage = [](const PcPackageVariant &lhs, const PcPackageVariant &rhs)
{
return lhs.getBaseFileName() < rhs.getBaseFileName();