aboutsummaryrefslogtreecommitdiff
path: root/src/GlobalLib.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/GlobalLib.cpp')
-rw-r--r--src/GlobalLib.cpp97
1 files changed, 58 insertions, 39 deletions
diff --git a/src/GlobalLib.cpp b/src/GlobalLib.cpp
index fde7797..ac8fd59 100644
--- a/src/GlobalLib.cpp
+++ b/src/GlobalLib.cpp
@@ -64,11 +64,11 @@ namespace sibs
return _tinydir_strncmp(path, subPathOf.c_str(), subPathOf.size()) == 0;
}
- Result<string> GlobalLib::getLibsLinkerFlags(const SibsConfig &parentConfig, const FileString &globalLibRootDir, const std::string &name, const std::string &version, LinkerFlagCallbackFunc staticLinkerFlagCallbackFunc, LinkerFlagCallbackFunc dynamicLinkerFlagCallbackFunc)
+ Result<bool> GlobalLib::getLibsLinkerFlags(const SibsConfig &parentConfig, const FileString &globalLibRootDir, const std::string &name, const std::string &version, LinkerFlagCallbackFunc staticLinkerFlagCallbackFunc, LinkerFlagCallbackFunc dynamicLinkerFlagCallbackFunc, GlobalIncludeDirCallbackFunc globalIncludeDirCallback)
{
Result<bool> packageExistsResult = validatePackageExists(globalLibRootDir, name);
- if(packageExistsResult.isErr())
- return Result<string>::Err(packageExistsResult);
+ if (packageExistsResult.isErr())
+ return packageExistsResult;
#if OS_FAMILY == OS_FAMILY_POSIX
FileString namePlatformNative = name;
@@ -95,7 +95,7 @@ namespace sibs
});
if(foundVersion.empty())
- return Result<string>::Err("Global lib dependency found, but version doesn't match dependency version", DependencyError::DEPENDENCY_VERSION_NO_MATCH);
+ return Result<bool>::Err("Global lib dependency found, but version doesn't match dependency version", DependencyError::DEPENDENCY_VERSION_NO_MATCH);
packageDir += TINYDIR_STRING("/");
packageDir += versionPlatformNative;
@@ -111,41 +111,55 @@ namespace sibs
string errMsg = "Global lib dependency found: ";
errMsg += toUtf8(packageDir);
errMsg += ", but it's missing a project.conf file";
- return Result<string>::Err(errMsg);
+ return Result<bool>::Err(errMsg);
}
case FileType::DIRECTORY:
{
string errMsg = "Global lib dependency found: ";
errMsg += toUtf8(packageDir);
errMsg += ", but it's corrupt (Found directory instead of file)";
- return Result<string>::Err(errMsg);
+ return Result<bool>::Err(errMsg);
}
}
SibsConfig sibsConfig(parentConfig.getCompiler(), packageDir, parentConfig.getOptimizationLevel());
Result<bool> result = Config::readFromFile(projectConfFilePath.c_str(), sibsConfig);
- if(result.isErr())
- return Result<string>::Err(result.getErrMsg());
+ if (result.isErr())
+ return result;
if(sibsConfig.getPackageName().empty())
- return Result<string>::Err("project.conf is missing required field package.name");
+ return Result<bool>::Err("project.conf is missing required field package.name");
if(sibsConfig.getPackageType() == PackageType::EXECUTABLE)
{
string errMsg = "The dependency ";
errMsg += name;
errMsg += " is an executable. Only libraries can be dependencies";
- return Result<string>::Err(errMsg);
+ return Result<bool>::Err(errMsg);
+ }
+
+ if (!containsPlatform(sibsConfig.getPlatforms(), SYSTEM_PLATFORM))
+ {
+ string errMsg = "The dependency ";
+ errMsg += name;
+ errMsg += " does not support your platform (";
+ errMsg += asString(SYSTEM_PLATFORM);
+ errMsg += ")";
+ return Result<bool>::Err(errMsg);
}
backend::Ninja ninja;
FileWalkCallbackFunc collectSourceFiles = [&ninja, &sibsConfig, &collectSourceFiles](tinydir_file *file)
{
+ FileString pathNative = file->path;
+#if OS_FAMILY == OS_FAMILY_WINDOWS
+ replaceChar(pathNative, L'/', L'\\');
+#endif
if(file->is_reg)
{
if (isSourceFile(file))
{
- string fileNameNative = toUtf8(file->path + sibsConfig.getProjectPath().size() + 1);
+ string fileNameNative = toUtf8(pathNative.c_str() + sibsConfig.getProjectPath().size() + 1);
ninja.addSourceFile(fileNameNative.c_str());
}
else
@@ -158,9 +172,9 @@ namespace sibs
// TODO: If compiling without "test" option, do not add test source dir to ninja. Ninja logic will then not build tests...
// OR I believe there is no reason to run tests in dependencies. The main projects tests should cover that?
// But you might want to know exactly which dependency is causing issue and which part of it...
- if (!sibsConfig.getTestPath().empty() && isPathSubPathOf(file->path, sibsConfig.getTestPath()))
+ if (!sibsConfig.getTestPath().empty() && isPathSubPathOf(pathNative.c_str(), sibsConfig.getTestPath()))
{
- string filePathUtf8 = toUtf8(file->path);
+ string filePathUtf8 = toUtf8(pathNative.c_str());
ninja.addTestSourceDir(filePathUtf8.c_str());
}
else
@@ -169,24 +183,39 @@ namespace sibs
};
walkDir(packageDir.c_str(), collectSourceFiles);
- // TODO: Dont do this. Unit tests wont be built. Need to call the below ninja.createBuildFile
- if(ninja.getSourceFiles().empty())
- {
- return Result<string>::Ok("No source files in dependency (header only library?)");
- }
- else
+ FileString buildPath = packageDir + TINYDIR_STRING("/sibs-build/");
+ switch (sibsConfig.getOptimizationLevel())
{
- FileString buildPath = packageDir + TINYDIR_STRING("/sibs-build/");
- switch(sibsConfig.getOptimizationLevel())
+ case OPT_LEV_DEBUG:
{
- case OPT_LEV_DEBUG:
- buildPath += TINYDIR_STRING("debug");
- break;
- case OPT_LEV_RELEASE:
- buildPath += TINYDIR_STRING("release");
- break;
+ buildPath += TINYDIR_STRING("debug");
+ // TODO: Check if this dependency is static or dynamic and decide which lib path to use from that
+ for(const string &staticLib : sibsConfig.getDebugStaticLibs())
+ {
+ string staticLibCmd = "\"";
+ staticLibCmd += staticLib;
+ staticLibCmd += "\"";
+ staticLinkerFlagCallbackFunc(staticLibCmd);
+ }
+ break;
+ }
+ case OPT_LEV_RELEASE:
+ {
+ buildPath += TINYDIR_STRING("release");
+ // TODO: Check if this dependency is static or dynamic and decide which lib path to use from that
+ for (const string &staticLib : sibsConfig.getReleaseStaticLibs())
+ {
+ string staticLibCmd = "\"";
+ staticLibCmd += staticLib;
+ staticLibCmd += "\"";
+ staticLinkerFlagCallbackFunc(staticLibCmd);
+ }
+ break;
}
+ }
+ if (!ninja.getSourceFiles().empty())
+ {
string libPath = toUtf8(buildPath);
switch (sibsConfig.getCompiler())
{
@@ -235,19 +264,9 @@ namespace sibs
break;
}
}
-
- // 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
- Result<bool> createBuildDirResult = createDirectoryRecursive(buildPath.c_str());
- if(createBuildDirResult.isErr())
- return Result<string>::Err(createBuildDirResult);
-
- Result<bool> buildFileResult = ninja.build(sibsConfig, buildPath.c_str(), staticLinkerFlagCallbackFunc, dynamicLinkerFlagCallbackFunc);
- if (buildFileResult.isErr())
- return Result<string>::Err(buildFileResult.getErrMsg());
-
- return Result<string>::Ok(libPath);
}
+
+ return ninja.build(sibsConfig, buildPath.c_str(), staticLinkerFlagCallbackFunc, dynamicLinkerFlagCallbackFunc, globalIncludeDirCallback);
}
Result<bool> GlobalLib::downloadDependency(const Dependency &dependency)