diff --git a/Makefile b/Makefile index 260c62f..5d439d9 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -# This Makefile was generated using MakeGen v1.3.6 made by Tim HÃ¥kansson +# This Makefile was generated using MakeGen v1.3.7 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)/ConfigCLI.o $(OBJPATH)/ConfigFile.o $(OBJPATH)/HFileGen.o $(OBJPATH)/IncludeDeps.o $(OBJPATH)/Makefile.o $(OBJPATH)/Utils.o $(OBJPATH)/ConfigFileConf.o $(OBJPATH)/main.o $(OBJPATH)/XML.o $(OBJPATH)/XMLObject.o +OBJECTS=$(OBJPATH)/src/ConfigCLI.o $(OBJPATH)/src/ConfigFile.o $(OBJPATH)/src/HFileGen.o $(OBJPATH)/src/IncludeDeps.o $(OBJPATH)/src/Makefile.o $(OBJPATH)/src/Utils.o $(OBJPATH)/src/compatibility/ConfigFileConf.o $(OBJPATH)/src/main.o $(OBJPATH)/src/xml/XML.o $(OBJPATH)/src/xml/XMLObject.o CFLAGS=$(INCLUDES) -std=c++17 -c LIBDIR= LDFLAGS= @@ -15,51 +15,52 @@ LIBS=$(LIBDIR) OUTPUT=$(BIN)makegen .PHONY: all directories rebuild clean run all: directories $(OUTPUT) -directories: $(BIN) $(OBJPATH) -$(BIN): - $(info Creating output directories) - @$(MKDIR_P) $(BIN) -$(OBJPATH): - @$(MKDIR_P) $(OBJPATH) +directories: $(OBJPATH)/src $(OBJPATH)/src/compatibility $(OBJPATH)/src/xml +$(OBJPATH)/src: + @$(MKDIR_P) $@ +$(OBJPATH)/src/compatibility: + @$(MKDIR_P) $@ +$(OBJPATH)/src/xml: + @$(MKDIR_P) $@ run: all @./$(OUTPUT) rebuild: clean all clean: - $(info Removing intermediates) - rm -rf $(OBJPATH)/*.o + $(info Removing $(OBJPATH)) + @rm -rf $(OBJPATH)/ $(OUTPUT): $(OBJECTS) - $(info Generating output file) + $(info Generating output file $(OUTPUT)) $(CO) $(OUTPUT) $(OBJECTS) $(LDFLAGS) $(LIBS) install: all $(info Installing MakeGen to /usr/bin/) @cp $(OUTPUT) /usr/bin/makegen -$(OBJPATH)/ConfigCLI.o : src/ConfigCLI.cpp src/Common.h src/ConfigCLI.h src/ConfigFile.h src/ConfigUtils.h src/FileUtils.h src/Utils.h src/FlagData.h src/xml/XMLObject.h +$(OBJPATH)/src/ConfigCLI.o: src/ConfigCLI.cpp src/Common.h src/ConfigCLI.h src/ConfigFile.h src/ConfigUtils.h src/FileUtils.h src/Utils.h src/FlagData.h src/xml/XMLObject.h $(info -[10%]- $<) $(CC) $(CFLAGS) -o $@ $< -$(OBJPATH)/ConfigFile.o : src/ConfigFile.cpp src/ConfigFile.h src/ConfigUtils.h src/Common.h src/FileUtils.h src/Utils.h src/FlagData.h src/xml/XMLObject.h src/compatibility/ConfigFileConf.h src/xml/XML.h +$(OBJPATH)/src/ConfigFile.o: src/ConfigFile.cpp src/ConfigFile.h src/ConfigUtils.h src/Common.h src/FileUtils.h src/Utils.h src/FlagData.h src/xml/XMLObject.h src/compatibility/ConfigFileConf.h src/xml/XML.h $(info -[20%]- $<) $(CC) $(CFLAGS) -o $@ $< -$(OBJPATH)/HFileGen.o : src/HFileGen.cpp src/FileUtils.h src/Common.h src/Utils.h src/HFileGen.h src/ConfigFile.h src/ConfigUtils.h src/FlagData.h src/xml/XMLObject.h +$(OBJPATH)/src/HFileGen.o: src/HFileGen.cpp src/FileUtils.h src/Common.h src/Utils.h src/HFileGen.h src/ConfigFile.h src/ConfigUtils.h src/FlagData.h src/xml/XMLObject.h $(info -[30%]- $<) $(CC) $(CFLAGS) -o $@ $< -$(OBJPATH)/IncludeDeps.o : src/IncludeDeps.cpp src/Common.h src/IncludeDeps.h src/ConfigFile.h src/ConfigUtils.h src/FileUtils.h src/Utils.h src/FlagData.h src/xml/XMLObject.h +$(OBJPATH)/src/IncludeDeps.o: src/IncludeDeps.cpp src/Common.h src/IncludeDeps.h src/ConfigFile.h src/ConfigUtils.h src/FileUtils.h src/Utils.h src/FlagData.h src/xml/XMLObject.h $(info -[40%]- $<) $(CC) $(CFLAGS) -o $@ $< -$(OBJPATH)/Makefile.o : src/Makefile.cpp src/Common.h src/IncludeDeps.h src/ConfigFile.h src/ConfigUtils.h src/FileUtils.h src/Utils.h src/FlagData.h src/xml/XMLObject.h src/Makefile.h +$(OBJPATH)/src/Makefile.o: src/Makefile.cpp src/Common.h src/IncludeDeps.h src/ConfigFile.h src/ConfigUtils.h src/FileUtils.h src/Utils.h src/FlagData.h src/xml/XMLObject.h src/Makefile.h $(info -[50%]- $<) $(CC) $(CFLAGS) -o $@ $< -$(OBJPATH)/Utils.o : src/Utils.cpp src/ConfigFile.h src/ConfigUtils.h src/Common.h src/FileUtils.h src/Utils.h src/FlagData.h src/xml/XMLObject.h +$(OBJPATH)/src/Utils.o: src/Utils.cpp src/ConfigFile.h src/ConfigUtils.h src/Common.h src/FileUtils.h src/Utils.h src/FlagData.h src/xml/XMLObject.h $(info -[60%]- $<) $(CC) $(CFLAGS) -o $@ $< -$(OBJPATH)/ConfigFileConf.o : src/compatibility/ConfigFileConf.cpp src/ConfigFile.h src/ConfigUtils.h src/Common.h src/FileUtils.h src/Utils.h src/FlagData.h src/xml/XMLObject.h src/compatibility/ConfigFileConf.h +$(OBJPATH)/src/compatibility/ConfigFileConf.o: src/compatibility/ConfigFileConf.cpp src/ConfigFile.h src/ConfigUtils.h src/Common.h src/FileUtils.h src/Utils.h src/FlagData.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/FlagData.h src/xml/XMLObject.h src/HFileGen.h src/Makefile.h src/Timer.h +$(OBJPATH)/src/main.o: src/main.cpp src/Common.h src/ConfigCLI.h src/ConfigFile.h src/ConfigUtils.h src/FileUtils.h src/Utils.h src/FlagData.h src/xml/XMLObject.h src/HFileGen.h src/Makefile.h src/Timer.h $(info -[80%]- $<) $(CC) $(CFLAGS) -o $@ $< -$(OBJPATH)/XML.o : src/xml/XML.cpp src/xml/XML.h src/xml/XMLObject.h src/xml/XMLException.h +$(OBJPATH)/src/xml/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/Common.h src/Utils.h src/xml/XMLException.h src/xml/XMLObject.h +$(OBJPATH)/src/xml/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/makegen.xml b/makegen.xml index 8279028..1c485c7 100644 --- a/makegen.xml +++ b/makegen.xml @@ -19,5 +19,5 @@ src/ Release - v1.3.5 + v1.3.7 diff --git a/src/Common.h b/src/Common.h index b84232a..e5febac 100644 --- a/src/Common.h +++ b/src/Common.h @@ -14,7 +14,7 @@ // Release, should be backwards compatible with any minor version #define MAKEGEN_VERSION_RELEASE 3 // Minor changes, generally bug fixes -#define MAKEGEN_VERSION_MINOR 6 +#define MAKEGEN_VERSION_MINOR 7 #define MAKEGEN_VERSION ("v" STR(MAKEGEN_VERSION_MAJOR) "." STR(MAKEGEN_VERSION_RELEASE) "." STR(MAKEGEN_VERSION_MINOR)) diff --git a/src/Makefile.cpp b/src/Makefile.cpp index 11d952e..3e91ce7 100755 --- a/src/Makefile.cpp +++ b/src/Makefile.cpp @@ -42,6 +42,7 @@ void Makefile::Save(ConfigFile& conf, unsigned int flags) { outputFile << "-I " << *it << " "; } + std::vector& includedirsexcldep = conf.GetSettingVectorString(ConfigSetting::IncludeDirExclDep); for (auto it = includedirsexcldep.begin(); it != includedirsexcldep.end(); ++it) { @@ -51,9 +52,9 @@ void Makefile::Save(ConfigFile& conf, unsigned int flags) outputFile << "OBJECTS="; for (auto it = cppFiles.begin(); it != cppFiles.end(); ++it) { - size_t extensionPos = it->find_last_of("."); - size_t slash = it->find_last_of("/") + 1; - outputFile << "$(OBJPATH)/" << it->substr(slash, extensionPos - slash) << ".o "; + std::filesystem::path cppFile(*it); + std::filesystem::path oFile = cppFile.replace_extension("o"); + outputFile << "$(OBJPATH)/" << oFile.string() << " "; } outputFile << std::endl; if (outputtype == "executable" || outputtype != "sharedlibrary") @@ -120,16 +121,20 @@ void Makefile::Save(ConfigFile& conf, unsigned int flags) outputFile << "all: directories $(OUTPUT)" << std::endl; // Directories - outputFile << "directories: $(BIN) $(OBJPATH)" << std::endl; + std::set intermediateDirectories = GetIntermediateDirectories(cppFiles); + outputFile << "directories: "; + for (const auto& intermediateDirectory : intermediateDirectories) + { + outputFile << intermediateDirectory << " "; + } + outputFile << std::endl; - // Bin path - outputFile << "$(BIN):" << std::endl; - outputFile << "\t$(info Creating output directories)" << std::endl; - outputFile << "\t@$(MKDIR_P) $(BIN)" << std::endl; - - // Object path - outputFile << "$(OBJPATH):" << std::endl; - outputFile << "\t@$(MKDIR_P) $(OBJPATH)" << std::endl; + // Intermediate directories + for (const auto& intermediateDirectory : intermediateDirectories) + { + outputFile << intermediateDirectory << ":" << std::endl; + outputFile << "\t@$(MKDIR_P) $@" << std::endl; + } // Run outputFile << "run: all" << std::endl; @@ -150,12 +155,12 @@ void Makefile::Save(ConfigFile& conf, unsigned int flags) // Clean outputFile << "clean:" << std::endl; - outputFile << "\t$(info Removing intermediates)" << std::endl; - outputFile << "\trm -rf $(OBJPATH)/*.o" << std::endl; + outputFile << "\t$(info Removing $(OBJPATH))" << std::endl; + outputFile << "\t@rm -rf $(OBJPATH)/" << std::endl; // Output file outputFile << "$(OUTPUT): $(OBJECTS)" << std::endl; - outputFile << "\t$(info Generating output file)" << std::endl; + outputFile << "\t$(info Generating output file $(OUTPUT))" << std::endl; if (outputtype == "executable") outputFile << "\t$(CO) $(OUTPUT) $(OBJECTS) $(LDFLAGS) $(LIBS)" << std::endl; else @@ -175,11 +180,9 @@ void Makefile::Save(ConfigFile& conf, unsigned int flags) auto itD = dependencies.find(*it); if (itD == dependencies.end()) { - size_t extensionPos = it->find_last_of("."); - size_t slash = it->find_last_of("/") + 1; - std::string oFile = it->substr(slash, extensionPos - slash) + ".o "; - - outputFile << "$(OBJPATH)/" << oFile << ":"; + std::filesystem::path cppFile(*it); + std::filesystem::path oFile = cppFile.replace_extension("o"); + outputFile << "$(OBJPATH)/" << oFile.string() << ":"; if (flags & FLAG_SIMPLE) { outputFile << " " << *it; @@ -195,3 +198,15 @@ void Makefile::Save(ConfigFile& conf, unsigned int flags) } } } + +std::set Makefile::GetIntermediateDirectories(const std::set& cppFiles) +{ + std::set intermediateDirectories; + for (const auto& cppFile : cppFiles) + { + std::filesystem::path cppPath{cppFile}; + std::filesystem::path oFile = cppPath.replace_extension("o"); + intermediateDirectories.emplace("$(OBJPATH)/" + oFile.parent_path().string()); + } + return intermediateDirectories; +} diff --git a/src/Makefile.h b/src/Makefile.h index 722ee14..9585158 100644 --- a/src/Makefile.h +++ b/src/Makefile.h @@ -6,4 +6,7 @@ class Makefile { public: static void Save(ConfigFile& conf, unsigned int flags); + +private: + static std::set GetIntermediateDirectories(const std::set& cppFiles); }; diff --git a/src/main.cpp b/src/main.cpp index 0e7eab7..9888845 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -41,13 +41,12 @@ Usage: makegen [options] -s, single Runs additional makegen options as single thread (no --jobs=X flag) --simple Creates a simple Makefile without include dependencies - (no --jobs=X flag) --target= Run the makegen.xml file with the specified target - If no option is given it will run \"make all\" + If no option is given it will run "make all" If multiple make options are given it will run in the following order: - clean all install run, rebuild will be translated to \"clean make\")"); + clean all install run, rebuild will be translated to "clean make")"); } void GenMakefile(ConfigFile& conf, unsigned int flags)