aboutsummaryrefslogtreecommitdiff
path: root/src/GlobalLib.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2017-12-31 05:24:40 +0100
committerdec05eba <dec05eba@protonmail.com>2017-12-31 05:26:07 +0100
commit017ec45e94204f977dcd7b04c8035d48f230ded3 (patch)
tree7778ecc069f05fb527329f36876ed13a17a48ab3 /src/GlobalLib.cpp
parent7a5910121ab0ad2ea8a4a60e5b6599b7255e5a5e (diff)
Sibs can now build itself on windows
Fixed several bugs. The windows implementation IS QUICK AND DIRTY! It links things as static even if you wish to link as dynamic etc..... NEED TO FIX THIS !!!
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)