From a548abb5a6a83c9318e9db3cf71170a7610e2758 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Thu, 4 Jan 2018 01:01:35 +0100 Subject: Use packages list to find packages --- src/CmakeModule.cpp | 97 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 71 insertions(+), 26 deletions(-) (limited to 'src/CmakeModule.cpp') diff --git a/src/CmakeModule.cpp b/src/CmakeModule.cpp index 7d5509c..d82eaf6 100644 --- a/src/CmakeModule.cpp +++ b/src/CmakeModule.cpp @@ -1,6 +1,7 @@ #include "../include/CmakeModule.hpp" #include "../include/Exec.hpp" #include "../include/GlobalLib.hpp" +#include "../include/PkgConfig.hpp" #if OS_FAMILY == OS_FAMILY_POSIX #define nprintf printf @@ -23,42 +24,86 @@ namespace sibs if(createGlobalLibDirResult.isErr()) return createGlobalLibDirResult; +// TODO: This code was copied from Ninja.cpp, convert it to work for CMake +#if OS_TYPE == OS_TYPE_LINUX + // TODO: Allow configuring default linking flags. Maybe have `package.useThreads = false` to disable this flag + string allLinkerFlags = "-pthread"; +#else + string allLinkerFlags = ""; +#endif + +#if 0 + // TODO: Somehow check loading order, because it has to be correct to work.. Or does it for dynamic libraries? + // Anyways it's required for static libraries (especially on Windows) + for (const string &binaryDependency : binaryDependencies) + { + allLinkerFlags += " "; + allLinkerFlags += binaryDependency; + } +#endif + if (!staticLinkerFlagCallbackFunc || (config.getPackageType() == PackageType::DYNAMIC || config.getPackageType() == PackageType::LIBRARY)) + { + staticLinkerFlagCallbackFunc = [&allLinkerFlags](const string &linkerFlag) + { + allLinkerFlags += " "; + allLinkerFlags += linkerFlag; + }; + } + + // TODO: If project contains no source files, then we shouldn't override this function + dynamicLinkerFlagCallbackFunc = [&allLinkerFlags](const string &linkerFlag) + { + allLinkerFlags += " "; + allLinkerFlags += linkerFlag; + }; + // TODO: Create a cmake module that contains library/include path for the dependencies (https://cmake.org/Wiki/CMake:How_To_Find_Libraries). // Modify the project CMakeLists.txt and add: list(APPEND CMAKE_MODULE_PATH "PathToDependenciesCmakeModulesGoesHere"). // CMakeLists.txt may contain: set(CMAKE_MODULE_PATH "PathToModules"). This needs to be replaced with list append, // otherwise our added module path is replaced. // It may work to do like vcpkg instead - to use -DCMAKE_TOOLCHAIN_FILE program argument to specify path to script (https://github.com/Microsoft/vcpkg/blob/master/docs/examples/using-sqlite.md) - for(const Dependency &globalLibDependency : config.getDependencies()) + vector globalLibDependencies; +#if OS_FAMILY == OS_FAMILY_POSIX + vector pkgConfigDependencies; + for(const Dependency &dependency : config.getDependencies()) { - Result globalLibLinkerFlagsResult = GlobalLib::getLibsLinkerFlags(config, globalLibDir, globalLibDependency.name, globalLibDependency.version, staticLinkerFlagCallbackFunc, dynamicLinkerFlagCallbackFunc, globalIncludeDirCallback); - if(globalLibLinkerFlagsResult.isErr()) + Result pkgConfigDependencyValidation = PkgConfig::validatePkgConfigPackageVersionExists(dependency); + if(pkgConfigDependencyValidation.isOk()) { - if(globalLibLinkerFlagsResult.getErrorCode() == GlobalLib::DependencyError::DEPENDENCY_NOT_FOUND || globalLibLinkerFlagsResult.getErrorCode() == GlobalLib::DependencyError::DEPENDENCY_VERSION_NO_MATCH) - { - printf("Dependency not found in global lib, trying to download from github\n"); - // TODO: Download several dependencies at the same time by adding them to a list - // and then iterate them and download them all using several threads. - // All dependecies should be downloaded at the same time, this includes dependencies of dependencies. - // If a dependency is missing, fail build BEFORE downloading dependencies and before compiling anything. - // You do not want to possibly wait several minutes only for build to fail when there is no compilation error. - - // TODO: If return error is invalid url, then the message should be converted to - // invalid package name/version. A check should be done if it is the name or version - // that is invalid. - Result downloadDependencyResult = GlobalLib::downloadDependency(globalLibDependency); - if(downloadDependencyResult.isErr()) - return downloadDependencyResult; + pkgConfigDependencies.push_back(dependency); + } + else + { + globalLibDependencies.push_back(dependency); + } + } - globalLibLinkerFlagsResult = GlobalLib::getLibsLinkerFlags(config, globalLibDir, globalLibDependency.name, globalLibDependency.version, staticLinkerFlagCallbackFunc, dynamicLinkerFlagCallbackFunc, globalIncludeDirCallback); - if(globalLibLinkerFlagsResult.isErr()) - return Result::Err(globalLibLinkerFlagsResult); - } - else - { - return Result::Err(globalLibLinkerFlagsResult); - } + Result pkgConfigLinkerFlagsResult = PkgConfig::getDynamicLibsLinkerFlags(pkgConfigDependencies); + if (pkgConfigLinkerFlagsResult.isErr()) + { + printf("%s, using global lib...\n", pkgConfigLinkerFlagsResult.getErrMsg().c_str()); + globalLibDependencies.reserve(globalLibDependencies.size() + pkgConfigDependencies.size()); + for (const Dependency &pkgConfigDependency : pkgConfigDependencies) + { + globalLibDependencies.push_back(pkgConfigDependency); } + pkgConfigDependencies.clear(); } + else + { + if (!pkgConfigLinkerFlagsResult.unwrap().empty()) + dynamicLinkerFlagCallbackFunc(pkgConfigLinkerFlagsResult.unwrap()); + } +#else + for (const Dependency &dependency : dependencies) + { + globalLibDependencies.push_back(dependency); + } +#endif + + Result globalLibResult = GlobalLib::getLibs(globalLibDependencies, config, globalLibDir, staticLinkerFlagCallbackFunc, dynamicLinkerFlagCallbackFunc, globalIncludeDirCallback); + if(!globalLibResult) + return globalLibResult; Result createBuildDirResult = createDirectoryRecursive(buildPath.c_str()); if (createBuildDirResult.isErr()) -- cgit v1.2.3