From c6e8fe8125f8900f3019716aa1cfbf18ff8264bd Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sat, 28 Mar 2020 07:15:16 +0100 Subject: Add support for absolute paths in include_dirs config --- backend/ninja/Ninja.cpp | 13 ++++++++++--- include/FileUtil.hpp | 1 + src/CmakeModule.cpp | 13 ++++++++++--- src/FileUtil.cpp | 21 +++++++++++++++++++++ 4 files changed, 42 insertions(+), 6 deletions(-) diff --git a/backend/ninja/Ninja.cpp b/backend/ninja/Ninja.cpp index 87370cf..99b276e 100644 --- a/backend/ninja/Ninja.cpp +++ b/backend/ninja/Ninja.cpp @@ -796,10 +796,17 @@ namespace backend #endif for(const auto &includeDir : config.getIncludeDirs()) { - string includeDirRelative = "../../../"; - includeDirRelative += includeDir; globalIncDir += " "; - globalIncDir += getIncludeOptionFlag(config.getCompiler(), includeDirRelative); + if(isPathAbsolute(includeDir)) + { + globalIncDir += getIncludeOptionFlag(config.getCompiler(), includeDir); + } + else + { + string includeDirRelative = "../../../"; + includeDirRelative += includeDir; + globalIncDir += getIncludeOptionFlag(config.getCompiler(), includeDirRelative); + } } auto parentGlobalIncludeDirCallback = globalIncludeDirCallback; diff --git a/include/FileUtil.hpp b/include/FileUtil.hpp index b88d58a..0108b24 100644 --- a/include/FileUtil.hpp +++ b/include/FileUtil.hpp @@ -72,6 +72,7 @@ namespace sibs Result getRealPath(const _tinydir_char_t *path); bool pathEquals(const std::string &path, const std::string &otherPath); Result getFileLastModifiedTime(const _tinydir_char_t *path); + bool isPathAbsolute(const std::string &path); } #endif //SIBS_FILEUTIL_HPP diff --git a/src/CmakeModule.cpp b/src/CmakeModule.cpp index 8c97b6e..a690948 100644 --- a/src/CmakeModule.cpp +++ b/src/CmakeModule.cpp @@ -190,10 +190,17 @@ namespace sibs #endif for(const auto &includeDir : config.getIncludeDirs()) { - FileString includeDirRelative = FileString("../../../"); - includeDirRelative += toFileString(includeDir); cflags += TINYDIR_STRING(" "); - cflags += getIncludeOptionFlag(config.getCompiler(), includeDirRelative); + if(isPathAbsolute(includeDir)) + { + cflags += getIncludeOptionFlag(config.getCompiler(), toFileString(includeDir)); + } + else + { + FileString includeDirRelative = FileString("../../../"); + includeDirRelative += toFileString(includeDir); + cflags += getIncludeOptionFlag(config.getCompiler(), includeDirRelative); + } } cxxflags = cflags; diff --git a/src/FileUtil.cpp b/src/FileUtil.cpp index a03161f..1fd86d6 100644 --- a/src/FileUtil.cpp +++ b/src/FileUtil.cpp @@ -178,6 +178,27 @@ namespace sibs } #endif +#if OS_FAMILY == OS_FAMILY_POSIX + bool isPathAbsolute(const std::string &path) + { + return !path.empty() && path[0] == '/'; + } +#else + static bool isAlpha(char c) + { + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); + } + + bool isPathAbsolute(const std::string &path) + { + if(path.size() >= 3 && isAlpha(path[0]) && path[1] == ':' && (path[2] == '\\' || path[2] == '/')) + return true; + else if(path.size() >= 4 && memcmp(path.data(), "\\\\?\\", 4) == 0) + return true; + return false; + } +#endif + // TODO: Handle failure (directory doesn't exist, no permission etc) void walkDir(const _tinydir_char_t *directory, FileWalkCallbackFunc callbackFunc) { -- cgit v1.2.3