From 61f9c3ee0dc15f784ac1f256d4ca0b0609d6b3ea Mon Sep 17 00:00:00 2001 From: Thraix Date: Sun, 26 Apr 2020 20:13:52 +0200 Subject: [PATCH] Fix relative paths not being included as include dependency --- Makefile | 6 +++--- src/Common.h | 2 +- src/FileUtils.h | 34 ++++++++++++++++++++++++++++++++++ src/IncludeDeps.cpp | 2 +- src/IncludeDeps.h | 2 +- 5 files changed, 40 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 2868e32..3c37325 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -# This Makefile was generated using MakeGen v1.3.0 made by Tim HÃ¥kansson +# This Makefile was generated using MakeGen v1.3.1 made by Tim HÃ¥kansson # and is licensed under MIT. Full source of the project can be found at # https://github.com/Thraix/MakeGen CC=@g++ @@ -51,7 +51,7 @@ $(OBJPATH)/Makefile.o : src/Makefile.cpp src/IncludeDeps.h src/ConfigFile.h src/ $(OBJPATH)/Utils.o : src/Utils.cpp src/ConfigFile.h src/ConfigUtils.h src/Common.h src/FileUtils.h src/Utils.h src/xml/XMLObject.h $(info -[60%]- $<) $(CC) $(CFLAGS) -o $@ $< -$(OBJPATH)/ConfigFileConf.o : src/compatibility/ConfigFileConf.cpp src/compatibility/ConfigFileConf.h +$(OBJPATH)/ConfigFileConf.o : src/compatibility/ConfigFileConf.cpp src/ConfigFile.h src/ConfigUtils.h src/Common.h src/FileUtils.h src/Utils.h src/xml/XMLObject.h src/compatibility/ConfigFileConf.h $(info -[70%]- $<) $(CC) $(CFLAGS) -o $@ $< $(OBJPATH)/main.o : src/main.cpp src/Common.h src/ConfigCLI.h src/ConfigFile.h src/ConfigUtils.h src/FileUtils.h src/Utils.h src/xml/XMLObject.h src/HFileGen.h src/Makefile.h src/Timer.h @@ -60,6 +60,6 @@ $(OBJPATH)/main.o : src/main.cpp src/Common.h src/ConfigCLI.h src/ConfigFile.h s $(OBJPATH)/XML.o : src/xml/XML.cpp src/xml/XML.h src/xml/XMLObject.h src/xml/XMLException.h $(info -[90%]- $<) $(CC) $(CFLAGS) -o $@ $< -$(OBJPATH)/XMLObject.o : src/xml/XMLObject.cpp src/xml/XMLException.h src/xml/XMLObject.h +$(OBJPATH)/XMLObject.o : src/xml/XMLObject.cpp src/Common.h src/Utils.h src/xml/XMLException.h src/xml/XMLObject.h $(info -[100%]- $<) $(CC) $(CFLAGS) -o $@ $< diff --git a/src/Common.h b/src/Common.h index 5a91d5e..2a4b62b 100755 --- a/src/Common.h +++ b/src/Common.h @@ -12,7 +12,7 @@ // Release, should be backwards compatible with any minor version #define MAKEGEN_VERSION_RELEASE 3 // Minor changes, generally bug fixes -#define MAKEGEN_VERSION_MINOR 0 +#define MAKEGEN_VERSION_MINOR 1 #define MAKEGEN_VERSION ("v" STR(MAKEGEN_VERSION_MAJOR) "." STR(MAKEGEN_VERSION_RELEASE) "." STR(MAKEGEN_VERSION_MINOR)) diff --git a/src/FileUtils.h b/src/FileUtils.h index e58b33f..5b9b1c6 100644 --- a/src/FileUtils.h +++ b/src/FileUtils.h @@ -37,6 +37,40 @@ struct FileUtils return GetTopDirectory(path); } + // Collapsed "..", ie "example/../file.h" -> "file.h" + static std::string CollapseDirectory(const std::string& dir) + { + std::string ret = dir; + size_t pos2 = dir.find_last_of("/"); + size_t pos1 = dir.find_last_of("/", pos2-1); + size_t collapse = 0; + size_t collapsePos = 0; + while(pos2 != std::string::npos) + { + if(pos1 == std::string::npos) + pos1 = 0; + + if(std::string_view(dir.c_str()+pos1, pos2 - pos1 + 1) == "/../") + { + if(collapse == 0) + collapsePos = pos2; + collapse++; + } + else if(collapse > 0) + { + collapse--; + ret = ret.substr(0, pos1) + ret.substr(pos2 + 3); + } + if(pos1 == 0) + break; + pos2 = pos1; + pos1 = dir.find_last_of("/", pos1-1); + } + if(ret[0] == '/' && dir[0] != '/') + ret = ret.substr(1); + return ret; + } + static std::string GetTopDirectory(const std::string& dir) { if(dir.size() == 0) diff --git a/src/IncludeDeps.cpp b/src/IncludeDeps.cpp index 2f97345..bc8531d 100755 --- a/src/IncludeDeps.cpp +++ b/src/IncludeDeps.cpp @@ -23,7 +23,7 @@ IncludeDeps::IncludeDeps(const std::string& filename, const std::string& dir, bo size_t pos = line.find("#include"); if(pos != std::string::npos) { - std::string include = GetIncludeFile(line, pos, filename); + std::string include = FileUtils::CollapseDirectory(GetIncludeFile(line, pos, filename)); auto it = files.find({include, "", false}); if(it != files.end()) { diff --git a/src/IncludeDeps.h b/src/IncludeDeps.h index 3ba496c..13dce2a 100755 --- a/src/IncludeDeps.h +++ b/src/IncludeDeps.h @@ -29,7 +29,7 @@ class IncludeDeps { if(printSet.find(filepath) != printSet.end()) return stream; - printCounter++; + printCounter++; printSet.emplace(filepath); if(!projectHFile) stream << FileUtils::GetRelativePath(conf.GetConfigPath(), filepath);