diff options
Diffstat (limited to 'src/GlobalLib.cpp')
-rw-r--r-- | src/GlobalLib.cpp | 97 |
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) |