From 577ac677db5e2ce9bb5a6c64076e1679845233f5 Mon Sep 17 00:00:00 2001 From: Thraix Date: Tue, 12 May 2026 21:49:47 +0200 Subject: [PATCH] Add generate-compile-flags as argument - generate-compile-flags (or shorthand gcf), will generate a compile_flags.txt file based on the makegen.xml configuration. - Fix IncludeDirExclDep not generating in the Makefile correctly --- .gitignore | 1 + Makefile | 25 ++++++++++++++----------- src/Common.h | 3 ++- src/CompileFlags.cpp | 28 ++++++++++++++++++++++++++++ src/CompileFlags.h | 9 +++++++++ src/ConfigFile.cpp | 1 + src/Makefile.cpp | 2 +- src/main.cpp | 27 +++++++++++++++++++-------- 8 files changed, 75 insertions(+), 21 deletions(-) create mode 100644 src/CompileFlags.cpp create mode 100644 src/CompileFlags.h diff --git a/.gitignore b/.gitignore index 947d143..71408a1 100755 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ bin/* .ycm_extra_conf.py +compile_flags.txt diff --git a/Makefile b/Makefile index 062e34b..5ea2ad3 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -# This Makefile was generated using MakeGen v1.3.10 made by Tim HÃ¥kansson +# This Makefile was generated using MakeGen v1.3.12 made by Tim HÃ¥kansson # and is licensed under MIT. Full source of the project can be found at # https://gitea.timha.se/Thraix/MakeGen CC=@g++ @@ -7,7 +7,7 @@ MKDIR_P=mkdir -p BIN=bin/Release/ OBJPATH=$(BIN)intermediates INCLUDES= -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 +OBJECTS=$(OBJPATH)/src/CompileFlags.o $(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= @@ -34,29 +34,32 @@ $(OUTPUT): $(OBJECTS) install: all $(info Installing MakeGen to /usr/bin/) @cp $(OUTPUT) /usr/bin/makegen +$(OBJPATH)/src/CompileFlags.o: src/CompileFlags.cpp src/CompileFlags.h src/ConfigFile.h src/ConfigUtils.h src/Common.h src/AssertException.h src/Dependency.h src/FlagData.h src/xml/XMLObject.h + $(info -[9%]- $<) + $(CC) $(CFLAGS) -o $@ $< $(OBJPATH)/src/ConfigCLI.o: src/ConfigCLI.cpp src/Common.h src/AssertException.h src/ConfigCLI.h src/ConfigFile.h src/ConfigUtils.h src/Dependency.h src/FlagData.h src/xml/XMLObject.h src/FileUtils.h src/Utils.h - $(info -[10%]- $<) + $(info -[18%]- $<) $(CC) $(CFLAGS) -o $@ $< $(OBJPATH)/src/ConfigFile.o: src/ConfigFile.cpp src/ConfigFile.h src/ConfigUtils.h src/Common.h src/AssertException.h src/Dependency.h src/FlagData.h src/xml/XMLObject.h src/FileUtils.h src/Utils.h src/compatibility/ConfigFileConf.h src/xml/XML.h - $(info -[20%]- $<) + $(info -[27%]- $<) $(CC) $(CFLAGS) -o $@ $< $(OBJPATH)/src/HFileGen.o: src/HFileGen.cpp src/FileUtils.h src/Common.h src/AssertException.h src/Utils.h src/HFileGen.h src/ConfigFile.h src/ConfigUtils.h src/Dependency.h src/FlagData.h src/xml/XMLObject.h - $(info -[30%]- $<) + $(info -[36%]- $<) $(CC) $(CFLAGS) -o $@ $< $(OBJPATH)/src/IncludeDeps.o: src/IncludeDeps.cpp src/Common.h src/AssertException.h src/IncludeDeps.h src/ConfigFile.h src/ConfigUtils.h src/Dependency.h src/FlagData.h src/xml/XMLObject.h src/FileUtils.h src/Utils.h - $(info -[40%]- $<) + $(info -[45%]- $<) $(CC) $(CFLAGS) -o $@ $< $(OBJPATH)/src/Makefile.o: src/Makefile.cpp src/Common.h src/AssertException.h src/IncludeDeps.h src/ConfigFile.h src/ConfigUtils.h src/Dependency.h src/FlagData.h src/xml/XMLObject.h src/FileUtils.h src/Utils.h src/Makefile.h - $(info -[50%]- $<) + $(info -[54%]- $<) $(CC) $(CFLAGS) -o $@ $< $(OBJPATH)/src/Utils.o: src/Utils.cpp src/ConfigFile.h src/ConfigUtils.h src/Common.h src/AssertException.h src/Dependency.h src/FlagData.h src/xml/XMLObject.h src/FileUtils.h src/Utils.h - $(info -[60%]- $<) + $(info -[63%]- $<) $(CC) $(CFLAGS) -o $@ $< $(OBJPATH)/src/compatibility/ConfigFileConf.o: src/compatibility/ConfigFileConf.cpp src/Common.h src/AssertException.h src/xml/XMLObject.h src/compatibility/ConfigFileConf.h - $(info -[70%]- $<) + $(info -[72%]- $<) $(CC) $(CFLAGS) -o $@ $< -$(OBJPATH)/src/main.o: src/main.cpp src/Common.h src/AssertException.h src/ConfigCLI.h src/ConfigFile.h src/ConfigUtils.h src/Dependency.h src/FlagData.h src/xml/XMLObject.h src/HFileGen.h src/Makefile.h src/Timer.h src/Utils.h - $(info -[80%]- $<) +$(OBJPATH)/src/main.o: src/main.cpp src/Common.h src/AssertException.h src/CompileFlags.h src/ConfigFile.h src/ConfigUtils.h src/Dependency.h src/FlagData.h src/xml/XMLObject.h src/ConfigCLI.h src/HFileGen.h src/Makefile.h src/Timer.h src/Utils.h + $(info -[81%]- $<) $(CC) $(CFLAGS) -o $@ $< $(OBJPATH)/src/xml/XML.o: src/xml/XML.cpp src/xml/XML.h src/xml/XMLObject.h src/xml/XMLException.h $(info -[90%]- $<) diff --git a/src/Common.h b/src/Common.h index 941ff84..12fccc7 100644 --- a/src/Common.h +++ b/src/Common.h @@ -16,7 +16,7 @@ // Release, should be backwards compatible with any minor version #define MAKEGEN_VERSION_RELEASE 3 // Minor changes, generally bug fixes -#define MAKEGEN_VERSION_MINOR 11 +#define MAKEGEN_VERSION_MINOR 12 #define MAKEGEN_VERSION ("v" STR(MAKEGEN_VERSION_MAJOR) "." STR(MAKEGEN_VERSION_RELEASE) "." STR(MAKEGEN_VERSION_MINOR)) @@ -32,6 +32,7 @@ const static unsigned int FLAG_DEPENDENCY = BIT(8); const static unsigned int FLAG_SIMPLE = BIT(9); const static unsigned int FLAG_CONFIG = BIT(10); const static unsigned int FLAG_TARGET = BIT(11); +const static unsigned int FLAG_GEN_COMP_FLAGS = BIT(12); #define LOG_INFO(...) LogHelper(__VA_ARGS__) #define LOG_WARNING(...) LogHelper(__VA_ARGS__) diff --git a/src/CompileFlags.cpp b/src/CompileFlags.cpp new file mode 100644 index 0000000..2728e18 --- /dev/null +++ b/src/CompileFlags.cpp @@ -0,0 +1,28 @@ +#include "CompileFlags.h" + +#include + +void CompileFlags::Save(ConfigFile& conf) +{ + std::ofstream file{"compile_flags.txt"}; + file << "-xc++" << std::endl; + file << "-std=" << conf.GetCppVersion() << std::endl; + + const std::vector& includeDirs = conf.GetIncludeDirs(); + for (const auto& includeDir : includeDirs) + { + file << "-I" << includeDir << std::endl; + } + + const std::vector& includeDirExclDeps = conf.GetIncludeDirExclDeps(); + for (const auto& includeDirExclDep : includeDirExclDeps) + { + file << "-I" << includeDirExclDep << std::endl; + } + + const std::vector& defines = conf.GetDefines(); + for (const auto& defines : defines) + { + file << "-D" << defines << std::endl; + } +} diff --git a/src/CompileFlags.h b/src/CompileFlags.h new file mode 100644 index 0000000..28bbb26 --- /dev/null +++ b/src/CompileFlags.h @@ -0,0 +1,9 @@ +#pragma once + +#include "ConfigFile.h" + +class CompileFlags +{ +public: + static void Save(ConfigFile& conf); +}; diff --git a/src/ConfigFile.cpp b/src/ConfigFile.cpp index 5a0a1f9..25f7636 100644 --- a/src/ConfigFile.cpp +++ b/src/ConfigFile.cpp @@ -78,6 +78,7 @@ void ConfigFile::Init(const FlagData& flagData) InitOptionalDir(sourceDir); InitDirs(libraryDirs); InitDirs(includeDirs); + InitDirs(includeDirExclDeps); } void ConfigFile::InitTarget(const FlagData& flagData) diff --git a/src/Makefile.cpp b/src/Makefile.cpp index eadf002..cc02189 100755 --- a/src/Makefile.cpp +++ b/src/Makefile.cpp @@ -46,7 +46,7 @@ void Makefile::Save(ConfigFile& conf, unsigned int flags) const std::vector& includeDirExclDeps = conf.GetIncludeDirExclDeps(); for (const auto& includeDirExclDep : includeDirExclDeps) { - outputFile << "-I " << includeDirExclDeps << " "; + outputFile << "-I " << includeDirExclDep << " "; } outputFile << std::endl; outputFile << "OBJECTS="; diff --git a/src/main.cpp b/src/main.cpp index adbdf61..b52d9a9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,6 +5,7 @@ #include #include "Common.h" +#include "CompileFlags.h" #include "ConfigCLI.h" #include "ConfigFile.h" #include "FlagData.h" @@ -44,6 +45,8 @@ Usage: makegen [options] (no --jobs=X flag) --simple Creates a simple Makefile without include dependencies --target= Run the makegen.xml file with the specified target + gcf, generate-compile-flags + Generates a Makefile and runs If no option is given it will run "make all" @@ -103,6 +106,10 @@ FlagData ReadFlags(int argc, char** argv) { flagData.flags |= FLAG_SINGLE_THREAD; } + else if (flag == "gcf" || flag == "generate-compile-flags") + { + flagData.flags |= FLAG_GEN_COMP_FLAGS; + } else if (flag == "--simple") { flagData.flags |= FLAG_SIMPLE; @@ -204,18 +211,22 @@ int Run(int argc, char** argv) { return ConfigCLI::Main(argc - 1, &argv[1]); } - std::map files{}; + auto conf = ConfigFile::GetConfigFile("./", flagData); - if (conf) - { - bool success = MakeGen("./", flagData, *conf); - return success ? 0 : 1; - } - else + if (!conf.has_value()) { LOG_ERROR("Couldn\'t load config file"); + return 1; } - return 0; + + if (flagData.flags & FLAG_GEN_COMP_FLAGS) + { + CompileFlags::Save(conf.value()); + return 0; + } + + bool success = MakeGen("./", flagData, conf.value()); + return success ? 0 : 1; } int main(int argc, char** argv)