From 28d6b571139998915bce147abb58617884431192 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Thu, 14 Dec 2017 15:22:06 +0100 Subject: Add support for dynamic libraries (shared objects) --- src/GlobalLib.cpp | 52 +++++++++++++++++++++++++++++++++++++++------------- src/PkgConfig.cpp | 4 ---- 2 files changed, 39 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/GlobalLib.cpp b/src/GlobalLib.cpp index 617f993..a07e23d 100644 --- a/src/GlobalLib.cpp +++ b/src/GlobalLib.cpp @@ -55,7 +55,7 @@ namespace sibs return false; } - Result GlobalLib::getStaticLibsLinkerFlags(const string &globalLibRootDir, const string &name, const string &version, LinkerFlagCallbackFunc linkerFlagCallbackFunc) + Result GlobalLib::getLibsLinkerFlags(const string &globalLibRootDir, const string &name, const string &version, LinkerFlagCallbackFunc staticLinkerFlagCallbackFunc, LinkerFlagCallbackFunc dynamicLinkerFlagCallbackFunc) { Result packageExistsResult = validatePackageExists(globalLibRootDir, name); if(packageExistsResult.isErr()) @@ -121,7 +121,22 @@ namespace sibs return Result::Err(errMsg); } - backend::Ninja ninja(backend::Ninja::LibraryType::STATIC); + backend::Ninja::LibraryType libraryType; + switch(sibsConfig.getPackageType()) + { + case PackageType::STATIC: + libraryType = backend::Ninja::LibraryType::STATIC; + break; + case PackageType::DYNAMIC: + case PackageType::LIBRARY: + libraryType = backend::Ninja::LibraryType::DYNAMIC; + break; + default: + assert(false); + return Result::Err("Unexpected error"); + } + + backend::Ninja ninja(libraryType); walkDirFilesRecursive(packageDir.c_str(), [&ninja, &packageDir](tinydir_file *file) { if (isSourceFile(file)) @@ -141,15 +156,26 @@ namespace sibs else { string debugBuildPath = packageDir + "/sibs-build/debug"; - string staticLibPath = debugBuildPath; - staticLibPath += "/lib"; - staticLibPath += name; - staticLibPath += ".a"; - - string staticLibPathCmd = "'"; - staticLibPathCmd += staticLibPath; - staticLibPathCmd += "'"; - linkerFlagCallbackFunc(staticLibPathCmd); + string libPath = debugBuildPath; + libPath += "/lib"; + libPath += name; + if(libraryType == backend::Ninja::LibraryType::STATIC) + { + libPath += ".a"; + string libPathCmd = "'"; + libPathCmd += libPath; + libPathCmd += "'"; + staticLinkerFlagCallbackFunc(libPathCmd); + libPath += ".a"; + } + else + { + libPath += ".so"; + string libPathCmd = "'"; + libPathCmd += libPath; + libPathCmd += "'"; + dynamicLinkerFlagCallbackFunc(libPathCmd); + } // TODO: Use different directories depending on the project type, but .o build files should be in the same directory // no matter what project type, since they are used for executables, static/dynamic libraries @@ -157,7 +183,7 @@ namespace sibs if(createBuildDirResult.isErr()) return Result::Err(createBuildDirResult); - Result buildFileResult = ninja.createBuildFile(sibsConfig.getPackageName(), sibsConfig.getDependencies(), debugBuildPath.c_str(), linkerFlagCallbackFunc); + Result buildFileResult = ninja.createBuildFile(sibsConfig.getPackageName(), sibsConfig.getDependencies(), debugBuildPath.c_str(), staticLinkerFlagCallbackFunc, dynamicLinkerFlagCallbackFunc); if (buildFileResult.isErr()) return Result::Err(buildFileResult.getErrMsg()); @@ -165,7 +191,7 @@ namespace sibs if (buildResult.isErr()) return Result::Err(buildResult.getErrMsg()); - return Result::Ok(staticLibPath); + return Result::Ok(libPath); } } diff --git a/src/PkgConfig.cpp b/src/PkgConfig.cpp index 5f85549..620b1a7 100644 --- a/src/PkgConfig.cpp +++ b/src/PkgConfig.cpp @@ -25,9 +25,7 @@ namespace sibs command += "'"; Result execResult = exec(command.c_str()); if(execResult.isErr()) - { return Result::Err(execResult.getErrMsg()); - } if(execResult.unwrap().exitCode == 1) { @@ -63,9 +61,7 @@ namespace sibs command += "'"; Result execResult = exec(command.c_str()); if(execResult.isErr()) - { return Result::Err(execResult.getErrMsg()); - } if(execResult.unwrap().exitCode == 1) { -- cgit v1.2.3-70-g09d2