From fb4a849730a81672b62520ab6a03683f733621ad Mon Sep 17 00:00:00 2001 From: Thraix Date: Sat, 5 Oct 2019 01:16:05 +0200 Subject: [PATCH] Change so that project h files are not listed as include dependency --- Makefile | 25 ++++++++------- src/Common.h | 16 +--------- src/FileUtils.h | 3 +- src/IncludeDeps.cpp | 17 ++++++---- src/IncludeDeps.h | 26 +++++++++------- src/Makefile.cpp | 64 +++++++------------------------------- src/Makefile.h | 3 +- src/Utils.cpp | 76 +++++++++++++++++++++++++++++++++++++++++++++ src/Utils.h | 33 ++++++++++++++++++++ 9 files changed, 163 insertions(+), 100 deletions(-) create mode 100644 src/Utils.cpp create mode 100644 src/Utils.h diff --git a/Makefile b/Makefile index 1f62278..66df2a4 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -# This Makefile was generated using MakeGen v1.1.4 made by Tim Håkansson +# This Makefile was generated using MakeGen v1.1.5 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++ @@ -7,7 +7,7 @@ MKDIR_P=mkdir -p BIN=bin/ OBJPATH=$(BIN)intermediates INCLUDES= -OBJECTS=$(OBJPATH)/ConfigFile.o $(OBJPATH)/HFileGen.o $(OBJPATH)/IncludeDeps.o $(OBJPATH)/Makefile.o $(OBJPATH)/main.o +OBJECTS=$(OBJPATH)/ConfigFile.o $(OBJPATH)/HFileGen.o $(OBJPATH)/IncludeDeps.o $(OBJPATH)/Makefile.o $(OBJPATH)/Utils.o $(OBJPATH)/main.o CFLAGS=$(INCLUDES) -std=c++17 -c -w -g3 -D_DEBUG LIBDIR= LDFLAGS= @@ -33,18 +33,21 @@ $(OUTPUT): $(OBJECTS) install: all $(info Installing MakeGen to /usr/bin/) @cp $(OUTPUT) /usr/bin/makegen -$(OBJPATH)/ConfigFile.o : src/ConfigFile.cpp src/Common.h src/ConfigFile.h src/FileUtils.h - $(info -[20%]- $<) +$(OBJPATH)/ConfigFile.o : src/ConfigFile.cpp src/Common.h src/ConfigFile.h src/FileUtils.h src/Utils.h + $(info -[16%]- $<) $(CC) $(CFLAGS) -o $@ $< -$(OBJPATH)/HFileGen.o : src/HFileGen.cpp src/FileUtils.h src/Common.h src/HFileGen.h src/ConfigFile.h - $(info -[40%]- $<) +$(OBJPATH)/HFileGen.o : src/HFileGen.cpp src/FileUtils.h src/Common.h src/Utils.h src/ConfigFile.h src/HFileGen.h + $(info -[33%]- $<) $(CC) $(CFLAGS) -o $@ $< -$(OBJPATH)/IncludeDeps.o : src/IncludeDeps.cpp src/Common.h src/IncludeDeps.h src/ConfigFile.h src/FileUtils.h - $(info -[60%]- $<) +$(OBJPATH)/IncludeDeps.o : src/IncludeDeps.cpp src/Common.h src/IncludeDeps.h src/ConfigFile.h src/FileUtils.h src/Utils.h + $(info -[50%]- $<) $(CC) $(CFLAGS) -o $@ $< -$(OBJPATH)/Makefile.o : src/Makefile.cpp src/Common.h src/FileUtils.h src/IncludeDeps.h src/ConfigFile.h src/Makefile.h - $(info -[80%]- $<) +$(OBJPATH)/Makefile.o : src/Makefile.cpp src/Common.h src/FileUtils.h src/Utils.h src/ConfigFile.h src/IncludeDeps.h src/Makefile.h + $(info -[66%]- $<) $(CC) $(CFLAGS) -o $@ $< -$(OBJPATH)/main.o : src/main.cpp src/Common.h src/ConfigFile.h src/FileUtils.h src/HFileGen.h src/IncludeDeps.h src/Makefile.h src/Timer.h +$(OBJPATH)/Utils.o : src/Utils.cpp src/FileUtils.h src/Common.h src/Utils.h src/ConfigFile.h + $(info -[83%]- $<) + $(CC) $(CFLAGS) -o $@ $< +$(OBJPATH)/main.o : src/main.cpp src/Common.h src/ConfigFile.h src/FileUtils.h src/Utils.h src/HFileGen.h src/IncludeDeps.h src/Makefile.h src/Timer.h $(info -[100%]- $<) $(CC) $(CFLAGS) -o $@ $< diff --git a/src/Common.h b/src/Common.h index bb34caf..b1c3bf7 100755 --- a/src/Common.h +++ b/src/Common.h @@ -13,7 +13,7 @@ // Release , should be backwards compatible with any minor version #define MAKEGEN_VERSION_RELEASE 1 // Minor changes, should be compatible with any other minor version with same major and release. -#define MAKEGEN_VERSION_MINOR 4 +#define MAKEGEN_VERSION_MINOR 5 #define MAKEGEN_VERSION ("v" STR(MAKEGEN_VERSION_MAJOR) "." STR(MAKEGEN_VERSION_RELEASE) "." STR(MAKEGEN_VERSION_MINOR)) const static unsigned int FLAG_HELP = BIT(0); @@ -44,17 +44,3 @@ void Log(const T& var, const Ts& ...vars) Log(var); Log(vars...); } - -inline std::string CommonPrefix(const std::string& s1, const std::string& s2) -{ - size_t n = 0; - for(size_t i = 0; i #include #include @@ -74,7 +75,7 @@ struct FileUtils else { // Find the most common directory - std::string commonPath = CommonPrefix(from,to); + std::string commonPath = Utils::CommonPrefix(from,to); while(commonPath.back() != '/') commonPath.pop_back(); commonPath.pop_back(); diff --git a/src/IncludeDeps.cpp b/src/IncludeDeps.cpp index 2248d42..34447c2 100755 --- a/src/IncludeDeps.cpp +++ b/src/IncludeDeps.cpp @@ -3,8 +3,13 @@ std::set IncludeDeps::printSet; int IncludeDeps::printCounter = 0; -IncludeDeps::IncludeDeps(const std::string& filename, const std::string& dir, const std::map& files, std::map& allDeps) - : filepath(dir+filename) + +IncludeDeps::IncludeDeps(const std::string& filename, const std::string& dir, const std::set& files, std::map& allDeps) + : IncludeDeps{filename, dir, false, files, allDeps} +{} + +IncludeDeps::IncludeDeps(const std::string& filename, const std::string& dir, bool projectHFile, const std::set& files, std::map& allDeps) + : filepath(dir+filename), projectHFile{projectHFile} { if(filename[filename.length() - 1] =='h') { @@ -18,14 +23,14 @@ IncludeDeps::IncludeDeps(const std::string& filename, const std::string& dir, co if(pos != std::string::npos) { std::string include = GetIncludeFile(line, pos, filename); - auto it = files.find(include); + auto it = files.find({include, "", false}); if(it != files.end()) { - auto itD = allDeps.find(it->second + it->first); + auto itD = allDeps.find(it->filepath); if(itD == allDeps.end()) { - IncludeDeps* inc = new IncludeDeps(it->first, it->second,files,allDeps); - dependencies.emplace(it->second + it->first, inc); + IncludeDeps* inc = new IncludeDeps(it->filename,it->directory, it->isProjectHFile, files,allDeps); + dependencies.emplace(it->filepath, inc); }else{ dependencies.emplace(itD->first, itD->second); } diff --git a/src/IncludeDeps.h b/src/IncludeDeps.h index 9d8d039..b399e6f 100755 --- a/src/IncludeDeps.h +++ b/src/IncludeDeps.h @@ -1,13 +1,15 @@ #pragma once -#include -#include -#include -#include -#include -#include #include "ConfigFile.h" #include "FileUtils.h" +#include "Utils.h" + +#include +#include +#include +#include +#include +#include struct CompareIncludeDeps; @@ -16,10 +18,13 @@ class IncludeDeps public: std::map dependencies; std::string filepath; + bool projectHFile; static std::set printSet; static int printCounter; - IncludeDeps(const std::string& filename, const std::string& dir, const std::map& files, std::map& allDeps); + IncludeDeps(const std::string& filename, const std::string& dir, const std::set& files, std::map& allDeps); + + IncludeDeps(const std::string& filename, const std::string& dir, bool projectHFile, const std::set& files, std::map& allDeps); std::string GetIncludeFile(const std::string& line, size_t pos, const std::string& filename); @@ -29,7 +34,8 @@ class IncludeDeps return stream; printCounter++; printSet.emplace(filepath); - stream << FileUtils::GetRelativePath(conf.configPath, filepath); + if(!projectHFile) + stream << FileUtils::GetRelativePath(conf.configPath, filepath); for(auto it = dependencies.begin();it!=dependencies.end();++it) { stream << " "; @@ -40,10 +46,6 @@ class IncludeDeps printSet.clear(); return stream; } - - IncludeDeps(const std::string& filename, const std::string& dir) - : filepath(dir+filename){} - }; struct CompareIncludeDeps diff --git a/src/Makefile.cpp b/src/Makefile.cpp index a598091..8e983f9 100755 --- a/src/Makefile.cpp +++ b/src/Makefile.cpp @@ -1,18 +1,20 @@ #include "Makefile.h" -#include -#include -#include -#include -#include -#include "IncludeDeps.h" + #include "Common.h" #include "FileUtils.h" +#include "IncludeDeps.h" +#include "Utils.h" + +#include +#include +#include +#include void Makefile::Save(const ConfigFile& conf) { - std::map hFiles; // hFile, directory + std::set hFiles; // hFile, directory std::set cppFiles; - GetCppAndHFiles(conf,hFiles,cppFiles); + Utils::GetCppAndHFiles(conf, hFiles, cppFiles); std::ofstream outputFile(conf.configPath + "Makefile"); outputFile << "# This Makefile was generated using MakeGen "<< MAKEGEN_VERSION<< " made by Tim Håkansson" << std::endl; @@ -141,7 +143,7 @@ void Makefile::Save(const ConfigFile& conf) std::map dependencies; size_t i = 0; - for(auto it = cppFiles.begin(); it!=cppFiles.end();++it) + for(auto it = cppFiles.begin(); it!= cppFiles.end();++it) { i++; auto itD = dependencies.find(conf.srcdir + *it); @@ -161,47 +163,3 @@ void Makefile::Save(const ConfigFile& conf) } } } - -void Makefile::GetCppAndHFiles(const ConfigFile& conf, std::map& hFiles, std::set& cppFiles) -{ - std::vector files; - std::string path = conf.configPath + conf.srcdir; - FileUtils::GetAllFiles(path,files); - // include paramenter with the path of the file - // For example src/graphics/Window.h -> graphics/Window.h if src is a src folder - for(auto it = files.begin(); it!=files.end();++it) - { - size_t extensionPos = it->find_last_of("."); - if(extensionPos != std::string::npos) - { - std::string extension = it->substr(extensionPos+1); - std::string filename = it->substr(path.length()); - if(extension == "cpp" || extension == "c") - { - cppFiles.emplace(filename); - } - else if(extension == "hpp" || extension == "h") - { - hFiles.emplace(filename,path); - } - } - } - for(size_t i = 0; i < conf.dependencies.size(); ++i) - { - std::vector files; - std::string depSrcDir = conf.dependencies[i] + conf.dependencyConfigs[i].srcdir; - FileUtils::GetAllFiles(depSrcDir, files); - for(auto it = files.begin(); it!=files.end();++it) - { - size_t extensionPos = it->find_last_of("."); - if(extensionPos != std::string::npos) - { - std::string extension = it->substr(extensionPos+1); - if(extension == "hpp" || extension == "h") - { - hFiles.emplace(it->substr(depSrcDir.length()),depSrcDir); - } - } - } - } -} diff --git a/src/Makefile.h b/src/Makefile.h index 0b946c1..bfe90bb 100755 --- a/src/Makefile.h +++ b/src/Makefile.h @@ -1,6 +1,7 @@ #pragma once #include "ConfigFile.h" + #include #include @@ -8,6 +9,4 @@ class Makefile { public: static void Save(const ConfigFile& conf); - private: - static void GetCppAndHFiles(const ConfigFile& conf, std::map& hFiles, std::set& cppFiles); }; diff --git a/src/Utils.cpp b/src/Utils.cpp new file mode 100644 index 0000000..40cfef3 --- /dev/null +++ b/src/Utils.cpp @@ -0,0 +1,76 @@ +#include "Utils.h" + +#include "FileUtils.h" + +std::string Utils::CommonPrefix(const std::string& s1, const std::string& s2) +{ + size_t n = 0; + for(size_t i = 0; i& hFiles, std::set& cppFiles) +{ + std::vector files; + std::string path = conf.configPath + conf.srcdir; + FileUtils::GetAllFiles(path,files); + // include paramenter with the path of the file + // For example src/graphics/Window.h -> graphics/Window.h if src is a src folder + for(auto it = files.begin(); it!=files.end();++it) + { + size_t extensionPos = it->find_last_of("."); + if(extensionPos != std::string::npos) + { + std::string extension = it->substr(extensionPos+1); + std::string filename = it->substr(path.length()); + if(extension == "cpp" || extension == "c") + { + cppFiles.emplace(filename); + } + else if(extension == "hpp" || extension == "h") + { + hFiles.emplace(HFile{filename,path,false}); + } + } + } + + for(size_t i = 0; i < conf.dependencies.size(); ++i) + { + GetHFiles(conf.dependencies[i], conf.dependencyConfigs[i], hFiles); + } +} + +void Utils::GetHFiles(const std::string& dependencyDir, const ConfigFile& conf, std::set& hFiles) +{ + // TODO: Fix so that cyclic dependencies doesn't crash the tool. + // Cyclic dependencies probably shouldn't exist. + // so just warn the user that it does and terminate. + for(size_t i = 0; i < conf.dependencies.size(); ++i) + { + GetHFiles(conf.dependencies[i], conf.dependencyConfigs[i], hFiles); + } + + std::vector files; + std::string depSrcDir = dependencyDir + conf.srcdir; + FileUtils::GetAllFiles(depSrcDir, files); + for(auto it = files.begin(); it!=files.end();++it) + { + size_t extensionPos = it->find_last_of("."); + if(extensionPos != std::string::npos) + { + std::string extension = it->substr(extensionPos+1); + if(extension == "hpp" || extension == "h") + { + std::string filename = it->substr(depSrcDir.length()); + hFiles.emplace(HFile{filename, depSrcDir, conf.generateHFile && filename == conf.hFile}); + } + } + } +} diff --git a/src/Utils.h b/src/Utils.h new file mode 100644 index 0000000..781bb44 --- /dev/null +++ b/src/Utils.h @@ -0,0 +1,33 @@ +#pragma once + +#include "ConfigFile.h" + +#include +#include +#include + + +struct HFile +{ + std::string filename; + std::string directory; + bool isProjectHFile; + + std::string filepath; + + HFile(const std::string& filename, const std::string& directory, bool isProjectHFile) + : filename{filename}, directory{directory}, isProjectHFile{isProjectHFile}, filepath{directory+filename} + {} + + friend bool operator<(const HFile& h1, const HFile& h2) + { + return h1.filename < h2.filename; + } +}; + +struct Utils +{ + static std::string CommonPrefix(const std::string& s1, const std::string& s2); + static void GetCppAndHFiles(const ConfigFile& conf, std::set& hFiles, std::set& cppFiles); + static void GetHFiles(const std::string& dependencyDir, const ConfigFile& conf, std::set& hFiles); +};