From 6bb79ef033c2a2e8f12c9da6409e3547af40417c Mon Sep 17 00:00:00 2001 From: dec05eba Date: Thu, 18 Oct 2018 07:05:43 +0200 Subject: Use ranges for dependency version --- src/PkgConfig.cpp | 48 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 9 deletions(-) (limited to 'src/PkgConfig.cpp') diff --git a/src/PkgConfig.cpp b/src/PkgConfig.cpp index e8f742c..89d3a44 100644 --- a/src/PkgConfig.cpp +++ b/src/PkgConfig.cpp @@ -1,6 +1,7 @@ #include "../include/PkgConfig.hpp" #include "../include/Exec.hpp" #include "../include/Dependency.hpp" +#include "../include/VersionParser.hpp" using namespace std; @@ -32,9 +33,12 @@ namespace sibs if(dependencyValidationResult.isErr()) return Result::Err(dependencyValidationResult.getErrMsg()); - Result dependencyVersionValidationResult = PkgConfig::validatePackageVersionAtLeast(dependency->name, dependency->version); - if(dependencyVersionValidationResult.isErr()) - return Result::Err(dependencyVersionValidationResult.getErrMsg()); + Result dependencyVersionResult = PkgConfig::getPackageVersion(dependency->name); + if(!dependencyVersionResult) + return Result::Err(dependencyVersionResult); + + if(!dependency->version.isInRange(dependencyVersionResult.unwrap())) + return Result::Err("pkg-config package " + dependency->name + " exists but the version does not match our expected version range"); return Result::Ok(true); } @@ -70,11 +74,6 @@ namespace sibs Result PkgConfig::validatePackageVersionAtLeast(const string &name, const string &version) { - // TODO: Instead of checking if package version is same or newer, check if package is same major version - // and same or newer minor version - - // Use --modversion instead and check if the version returned is newer or equal to dependency version. - // This way we can output installed version vs expected dependency version FileString command = pkgConfigPath + TINYDIR_STRING(" '--atleast-version="); command += toFileString(version); command += TINYDIR_STRING("' '"); @@ -98,7 +97,7 @@ namespace sibs } else if(execResult.unwrap().exitCode != 0) { - string errMsg = "Failed to check dependency version, Unknown error, exit code: "; + string errMsg = "Failed to check pkg-config package version, Unknown error, exit code: "; errMsg += to_string(execResult.unwrap().exitCode); return Result::Err(errMsg); } @@ -106,6 +105,37 @@ namespace sibs return Result::Ok(true); } + Result PkgConfig::getPackageVersion(const std::string &name) + { + FileString command = pkgConfigPath + TINYDIR_STRING(" --modversion '"); + command += toFileString(name); + command += TINYDIR_STRING("'"); + Result execResult = exec(command.c_str()); + if(!execResult) + return Result::Err(execResult.getErrMsg()); + + if(execResult.unwrap().exitCode == 1) + { + string errMsg = "Dependency "; + errMsg += name; + errMsg += " not found in pkg-config"; + return Result::Err(errMsg); + } + else if(execResult.unwrap().exitCode == 127) + { + return Result::Err("pkg-config is not installed"); + } + else if(execResult.unwrap().exitCode != 0) + { + string errMsg = "Failed to get pkg-config package version, Unknown error, exit code: "; + errMsg += to_string(execResult.unwrap().exitCode); + return Result::Err(errMsg); + } + + // Intentionally allow packages which have a version that contains more data after patch number, since some pkg-config packages are not in semver format + return parsePackageVersion({ execResult.unwrap().execStdout.data(), execResult.unwrap().execStdout.size() }, nullptr); + } + Result PkgConfig::getDynamicLibsLinkerFlags(const vector &libs) { if(libs.empty()) return Result::Ok(""); -- cgit v1.2.3