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/GlobalLib.cpp | 89 +++++++++++++++++++++---------------------------------- 1 file changed, 33 insertions(+), 56 deletions(-) (limited to 'src/GlobalLib.cpp') diff --git a/src/GlobalLib.cpp b/src/GlobalLib.cpp index 8ad1678..b390571 100644 --- a/src/GlobalLib.cpp +++ b/src/GlobalLib.cpp @@ -15,25 +15,20 @@ namespace sibs { Result GlobalLib::validatePackageExists(const FileString &globalLibRootDir, const std::string &name) { - FileString packageDir = globalLibRootDir + TINYDIR_STRING("/"); -#if OS_FAMILY == OS_FAMILY_POSIX - packageDir += name; -#else - packageDir += utf8To16(name); -#endif - FileType packageDirFileType = getFileType(packageDir.c_str()); + Path packageDir = Path(globalLibRootDir).join(toFileString(name)); + FileType packageDirFileType = getFileType(packageDir.data.c_str()); switch(packageDirFileType) { case FileType::FILE_NOT_FOUND: { string errMsg = "Global lib dependency not found: "; - errMsg += toUtf8(packageDir); + errMsg += toUtf8(packageDir.data); return Result::Err(errMsg, DependencyError::DEPENDENCY_NOT_FOUND); } case FileType::REGULAR: { string errMsg = "Corrupt library directory. "; - errMsg += toUtf8(packageDir); + errMsg += toUtf8(packageDir.data); errMsg += " is a file, expected it to be a directory"; return Result::Err(errMsg); } @@ -54,10 +49,8 @@ namespace sibs if (!libPathResult) return Result::Err(libPathResult); - FileString libArchivedFilePath = libPathResult.unwrap(); - libArchivedFilePath += TINYDIR_STRING("/.cache/sibs/archive/"); - libArchivedFilePath += toFileString(name); - FileType archive_path_file_type = getFileType(libArchivedFilePath.c_str()); + Path libArchivedFilePath = Path(libPathResult.unwrap()).join(".cache/sibs/archive").join(toFileString(name)); + FileType archive_path_file_type = getFileType(libArchivedFilePath.data.c_str()); if(archive_path_file_type == FileType::FILE_NOT_FOUND) return Result::Ok(true); @@ -66,7 +59,7 @@ namespace sibs return Result::Err("A previous download of package is corrupt, attempting to redownload..."); bool isEmpty = true; - walkDir(libArchivedFilePath.c_str(), [&isEmpty](tinydir_file *file) + walkDir(libArchivedFilePath.data.c_str(), [&isEmpty](tinydir_file *file) { isEmpty = false; return false; @@ -78,13 +71,13 @@ namespace sibs return Result::Ok(true); } - Result GlobalLib::getLibs(const std::vector &libs, const SibsConfig &parentConfig, const FileString &globalLibRootDir, LinkerFlagCallbackFunc staticLinkerFlagCallbackFunc, LinkerFlagCallbackFunc dynamicLinkerFlagCallbackFunc, GlobalIncludeDirCallbackFunc globalIncludeDirCallback) + Result GlobalLib::getLibs(const std::vector &libs, const SibsConfig &parentConfig, const FileString &globalLibRootDir, LinkerFlagCallbackFunc staticLinkerFlagCallbackFunc, LinkerFlagCallbackFunc dynamicLinkerFlagCallbackFunc, GlobalIncludeDirCallbackFunc globalIncludeDirCallback) { - for(PackageListDependency *globalLibDependency : libs) + for(const PackageListDependency &globalLibDependency : libs) { if(!parentConfig.packaging) - printf("Dependency %s in version range %s is missing from pkg-config, trying global lib\n", globalLibDependency->name.c_str(), globalLibDependency->version.toString().c_str()); - Result globalLibLinkerFlagsResult = GlobalLib::getLibsLinkerFlags(parentConfig, globalLibRootDir, globalLibDependency->name, globalLibDependency->version, staticLinkerFlagCallbackFunc, dynamicLinkerFlagCallbackFunc, globalIncludeDirCallback); + printf("Dependency %s in version range %s is missing from pkg-config, trying global lib\n", globalLibDependency.name.c_str(), globalLibDependency.version.toString().c_str()); + Result globalLibLinkerFlagsResult = GlobalLib::getLibsLinkerFlags(parentConfig, globalLibRootDir, globalLibDependency.name, globalLibDependency.version, staticLinkerFlagCallbackFunc, dynamicLinkerFlagCallbackFunc, globalIncludeDirCallback); if(!globalLibLinkerFlagsResult) { if(globalLibLinkerFlagsResult.getErrorCode() == GlobalLib::DependencyError::DEPENDENCY_NOT_FOUND || globalLibLinkerFlagsResult.getErrorCode() == GlobalLib::DependencyError::DEPENDENCY_VERSION_NO_MATCH) @@ -103,7 +96,7 @@ namespace sibs if(!downloadDependencyResult) return downloadDependencyResult; - globalLibLinkerFlagsResult = GlobalLib::getLibsLinkerFlags(parentConfig, globalLibRootDir, globalLibDependency->name, globalLibDependency->version, staticLinkerFlagCallbackFunc, dynamicLinkerFlagCallbackFunc, globalIncludeDirCallback); + globalLibLinkerFlagsResult = GlobalLib::getLibsLinkerFlags(parentConfig, globalLibRootDir, globalLibDependency.name, globalLibDependency.version, staticLinkerFlagCallbackFunc, dynamicLinkerFlagCallbackFunc, globalIncludeDirCallback); if(!globalLibLinkerFlagsResult) return globalLibLinkerFlagsResult; } @@ -122,17 +115,9 @@ namespace sibs if (packageExistsResult.isErr()) return packageExistsResult; -#if OS_FAMILY == OS_FAMILY_POSIX - FileString namePlatformNative = name; -#else - FileString namePlatformNative = utf8To16(name); -#endif - - FileString packageDir = globalLibRootDir + TINYDIR_STRING("/"); - packageDir += namePlatformNative; - + Path packageDir = Path(globalLibRootDir).join(toFileString(name)); FileString foundVersion; - walkDir(packageDir.c_str(), [&foundVersion, &versionRange](tinydir_file *file) + walkDir(packageDir.data.c_str(), [&foundVersion, &versionRange](tinydir_file *file) { if(file->is_dir) { @@ -150,10 +135,8 @@ namespace sibs if(foundVersion.empty()) return Result::Err("Global lib dependency found, but version isn't in range of version", DependencyError::DEPENDENCY_VERSION_NO_MATCH); - packageDir += TINYDIR_STRING("/"); - packageDir += foundVersion; - - return GlobalLib::getLibsLinkerFlagsCommon(parentConfig, packageDir, name, staticLinkerFlagCallbackFunc, dynamicLinkerFlagCallbackFunc, globalIncludeDirCallback); + packageDir.join(foundVersion); + return GlobalLib::getLibsLinkerFlagsCommon(parentConfig, packageDir.data, name, staticLinkerFlagCallbackFunc, dynamicLinkerFlagCallbackFunc, globalIncludeDirCallback); } Result GlobalLib::getLibsLinkerFlagsCommon(const SibsConfig &parentConfig, const FileString &packageDir, const string &dependencyName, LinkerFlagCallbackFunc staticLinkerFlagCallbackFunc, LinkerFlagCallbackFunc dynamicLinkerFlagCallbackFunc, GlobalIncludeDirCallbackFunc globalIncludeDirCallback) @@ -237,9 +220,9 @@ namespace sibs } } - Result GlobalLib::downloadDependency(PackageListDependency *dependency, Platform platform) + Result GlobalLib::downloadDependency(const PackageListDependency &dependency, Platform platform) { - Result packageResult = Package::getPackage(dependency->name.c_str(), dependency->version, platform); + Result packageResult = Package::getPackage(dependency.name.c_str(), dependency.version, platform); if(!packageResult) return Result::Err(packageResult); @@ -248,41 +231,35 @@ namespace sibs Result libPathResult = getHomeDir(); if (!libPathResult) return Result::Err(libPathResult); - FileString libPath = libPathResult.unwrap(); - libPath += TINYDIR_STRING("/.cache/sibs/lib/"); - libPath += toFileString(asString(platform)); - libPath += TINYDIR_STRING("/"); - libPath += toFileString(dependency->name); - libPath += TINYDIR_STRING("/"); - libPath += toFileString(package.version.toString()); + Path libPath = Path(libPathResult.unwrap()) + .join(TINYDIR_STRING(".cache/sibs/lib")) + .join(toFileString(asString(platform))) + .join(toFileString(dependency.name)) + .join(toFileString(package.version.toString())); - FileString libArchivedFilePath = libPathResult.unwrap(); - libArchivedFilePath += TINYDIR_STRING("/.cache/sibs/archive/"); - libArchivedFilePath += toFileString(dependency->name); - Result createArchiveDirResult = createDirectoryRecursive(libArchivedFilePath.c_str()); + Path libArchivedFilePath = Path(libPathResult.unwrap()).join(TINYDIR_STRING("/.cache/sibs/archive/")).join(toFileString(dependency.name)); + Result createArchiveDirResult = createDirectoryRecursive(libArchivedFilePath.data.c_str()); if(!createArchiveDirResult) return createArchiveDirResult; - FileString libArchivedDir = libArchivedFilePath; - libArchivedFilePath += TINYDIR_STRING("/"); - libArchivedFilePath += toFileString(package.version.toString()); - Result downloadResult = curl::downloadFile(package.urls[0].c_str(), libArchivedFilePath.c_str()); + Path libArchivedDir = Path(libArchivedFilePath).join(toFileString(package.version.toString())); + Result downloadResult = curl::downloadFile(package.urls[0].c_str(), libArchivedFilePath.data.c_str()); if(!downloadResult) return downloadResult; // Create build path. This is done here because we dont want to create it if download fails - Result createLibDirResult = createDirectoryRecursive(libPath.c_str()); + Result createLibDirResult = createDirectoryRecursive(libPath.data.c_str()); if(!createLibDirResult) return createLibDirResult; - Result archiveExtractResult = Archive::extract(libArchivedFilePath.c_str(), libPath.c_str()); + Result archiveExtractResult = Archive::extract(libArchivedFilePath.data.c_str(), libPath.data.c_str()); // We have extracted the archive, we dont need to cache it. If remove fails, it doesn't really matter, user can remove it himself #if OS_FAMILY == OS_FAMILY_POSIX - remove(libArchivedFilePath.c_str()); - remove(libArchivedDir.c_str()); + remove(libArchivedFilePath.data.c_str()); + remove(libArchivedDir.data.c_str()); #else - _wremove(libArchivedFilePath.c_str()); - _wremove(libArchivedDir.c_str()); + _wremove(libArchivedFilePath.data.c_str()); + _wremove(libArchivedDir.data.c_str()); #endif return archiveExtractResult; } -- cgit v1.2.3