diff options
author | dec05eba <dec05eba@protonmail.com> | 2018-10-18 07:05:43 +0200 |
---|---|---|
committer | dec05eba <dec05eba@protonmail.com> | 2020-07-06 07:39:33 +0200 |
commit | 6bb79ef033c2a2e8f12c9da6409e3547af40417c (patch) | |
tree | 6fe6c5bea99cc0b38af92a7aa4714e5614de4868 /src/PkgConfig.cpp | |
parent | 4e38f2af2b97850ec5b395d4e0ea8310e664e52f (diff) |
Use ranges for dependency version
Diffstat (limited to 'src/PkgConfig.cpp')
-rw-r--r-- | src/PkgConfig.cpp | 48 |
1 files changed, 39 insertions, 9 deletions
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<bool>::Err(dependencyValidationResult.getErrMsg()); - Result<bool> dependencyVersionValidationResult = PkgConfig::validatePackageVersionAtLeast(dependency->name, dependency->version); - if(dependencyVersionValidationResult.isErr()) - return Result<bool>::Err(dependencyVersionValidationResult.getErrMsg()); + Result<PackageVersion> dependencyVersionResult = PkgConfig::getPackageVersion(dependency->name); + if(!dependencyVersionResult) + return Result<bool>::Err(dependencyVersionResult); + + if(!dependency->version.isInRange(dependencyVersionResult.unwrap())) + return Result<bool>::Err("pkg-config package " + dependency->name + " exists but the version does not match our expected version range"); return Result<bool>::Ok(true); } @@ -70,11 +74,6 @@ namespace sibs Result<bool> 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<bool>::Err(errMsg); } @@ -106,6 +105,37 @@ namespace sibs return Result<bool>::Ok(true); } + Result<PackageVersion> PkgConfig::getPackageVersion(const std::string &name) + { + FileString command = pkgConfigPath + TINYDIR_STRING(" --modversion '"); + command += toFileString(name); + command += TINYDIR_STRING("'"); + Result<ExecResult> execResult = exec(command.c_str()); + if(!execResult) + return Result<PackageVersion>::Err(execResult.getErrMsg()); + + if(execResult.unwrap().exitCode == 1) + { + string errMsg = "Dependency "; + errMsg += name; + errMsg += " not found in pkg-config"; + return Result<PackageVersion>::Err(errMsg); + } + else if(execResult.unwrap().exitCode == 127) + { + return Result<PackageVersion>::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<PackageVersion>::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<string> PkgConfig::getDynamicLibsLinkerFlags(const vector<PackageListDependency*> &libs) { if(libs.empty()) return Result<string>::Ok(""); |