aboutsummaryrefslogtreecommitdiff
path: root/src/PkgConfig.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2018-10-18 07:05:43 +0200
committerdec05eba <dec05eba@protonmail.com>2020-07-06 07:39:33 +0200
commit6bb79ef033c2a2e8f12c9da6409e3547af40417c (patch)
tree6fe6c5bea99cc0b38af92a7aa4714e5614de4868 /src/PkgConfig.cpp
parent4e38f2af2b97850ec5b395d4e0ea8310e664e52f (diff)
Use ranges for dependency version
Diffstat (limited to 'src/PkgConfig.cpp')
-rw-r--r--src/PkgConfig.cpp48
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("");