From 61d9e8699687342c2e32c32c8d4eb71760d5d290 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sat, 26 Jun 2021 17:33:24 +0200 Subject: Use fork/exec instead of popen. Add Path class --- src/PkgConfig.cpp | 83 ++++++++++++------------------------------------------- 1 file changed, 18 insertions(+), 65 deletions(-) (limited to 'src/PkgConfig.cpp') diff --git a/src/PkgConfig.cpp b/src/PkgConfig.cpp index 89d3a44..73df008 100644 --- a/src/PkgConfig.cpp +++ b/src/PkgConfig.cpp @@ -27,28 +27,25 @@ namespace sibs pkgConfigPath = path; } - Result PkgConfig::validatePkgConfigPackageVersionExists(PackageListDependency *dependency) + Result PkgConfig::validatePkgConfigPackageVersionExists(const PackageListDependency &dependency) { - Result dependencyValidationResult = PkgConfig::validatePackageExists(dependency->name); + Result dependencyValidationResult = PkgConfig::validatePackageExists(dependency.name); if(dependencyValidationResult.isErr()) return Result::Err(dependencyValidationResult.getErrMsg()); - Result dependencyVersionResult = PkgConfig::getPackageVersion(dependency->name); + 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"); + 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); } Result PkgConfig::validatePackageExists(const string &name) { - FileString command = pkgConfigPath + TINYDIR_STRING(" --exists '"); - command += toFileString(name); - command += TINYDIR_STRING("'"); - Result execResult = exec(command.c_str()); + Result execResult = exec({ pkgConfigPath, TINYDIR_STRING("--exists"), TINYDIR_STRING("--"), toFileString(name) }); if(execResult.isErr()) return Result::Err(execResult.getErrMsg()); @@ -72,45 +69,9 @@ namespace sibs return Result::Ok(true); } - Result PkgConfig::validatePackageVersionAtLeast(const string &name, const string &version) - { - FileString command = pkgConfigPath + TINYDIR_STRING(" '--atleast-version="); - command += toFileString(version); - command += TINYDIR_STRING("' '"); - command += toFileString(name); - command += TINYDIR_STRING("'"); - Result execResult = exec(command.c_str()); - if(execResult.isErr()) - return Result::Err(execResult.getErrMsg()); - - if(execResult.unwrap().exitCode == 1) - { - string errMsg = "Dependency "; - errMsg += name; - errMsg += " is installed but the version older than "; - errMsg += version; - 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 check pkg-config package version, Unknown error, exit code: "; - errMsg += to_string(execResult.unwrap().exitCode); - return Result::Err(errMsg); - } - - 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()); + Result execResult = exec({ pkgConfigPath, TINYDIR_STRING("--modversion"), TINYDIR_STRING("--"), toFileString(name) }); if(!execResult) return Result::Err(execResult.getErrMsg()); @@ -136,21 +97,17 @@ namespace sibs return parsePackageVersion({ execResult.unwrap().execStdout.data(), execResult.unwrap().execStdout.size() }, nullptr); } - Result PkgConfig::getDynamicLibsLinkerFlags(const vector &libs) + Result PkgConfig::getDynamicLibsLinkerFlags(const vector &libs) { if(libs.empty()) return Result::Ok(""); - string args; - for(PackageListDependency *lib : libs) + std::vector args = { pkgConfigPath, TINYDIR_STRING("--libs"), TINYDIR_STRING("--") }; + for(const PackageListDependency &lib : libs) { - args += " '"; - args += lib->name; - args += "'"; + args.push_back(toFileString(lib.name)); } - FileString command = pkgConfigPath + TINYDIR_STRING(" --libs"); - command += toFileString(args); - Result execResult = exec(command.c_str()); + Result execResult = exec(args); if(execResult.isErr()) return Result::Err(execResult.getErrMsg()); @@ -179,21 +136,17 @@ namespace sibs } } - Result PkgConfig::getDynamicLibsCflags(const vector &libs) + Result PkgConfig::getDynamicLibsCflags(const vector &libs) { if(libs.empty()) return Result::Ok(""); - string args; - for(PackageListDependency *lib : libs) + std::vector args = { pkgConfigPath, TINYDIR_STRING("--cflags"), TINYDIR_STRING("--") }; + for(const PackageListDependency &lib : libs) { - args += " '"; - args += lib->name; - args += "'"; + args.push_back(toFileString(lib.name)); } - FileString command = pkgConfigPath + TINYDIR_STRING(" --cflags"); - command += toFileString(args); - Result execResult = exec(command.c_str()); + Result execResult = exec(args); if(execResult.isErr()) return Result::Err(execResult.getErrMsg()); @@ -222,7 +175,7 @@ namespace sibs } } - Result PkgConfig::getDynamicLibsFlags(const vector &libs) + Result PkgConfig::getDynamicLibsFlags(const vector &libs) { PkgConfigFlags flags; -- cgit v1.2.3