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)