From 5d00ada4310beba28c03ec7e50f0abdfce81838e Mon Sep 17 00:00:00 2001 From: Thraix Date: Fri, 8 May 2026 19:09:00 +0200 Subject: [PATCH] Add support for specifying target for dependencies - Use to specify which target the dependency should be compiled for. - Fix binary not being removed when doing makegen clean --- Makefile | 22 +++++++++++----------- makegen.xml | 4 ++-- src/ConfigFile.cpp | 30 ++++++++++++++++++++++++++---- src/ConfigFile.h | 5 +++++ src/Dependency.h | 15 +++++++++++++++ src/Makefile.cpp | 10 +++++----- src/Utils.cpp | 8 ++++---- src/main.cpp | 10 ++++++---- src/xml/XMLObject.cpp | 12 +++++++++++- src/xml/XMLObject.h | 3 ++- 10 files changed, 87 insertions(+), 32 deletions(-) create mode 100644 src/Dependency.h diff --git a/Makefile b/Makefile index a85ee25..4b09f9f 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ CC=@g++ CO=@g++ -o MKDIR_P=mkdir -p -BIN=bin/ +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 @@ -26,36 +26,36 @@ run: all @./$(OUTPUT) rebuild: clean all clean: - $(info Removing $(OBJPATH)) - @rm -rf $(OBJPATH)/ + $(info Removing $(OBJPATH) and $(OUTPUT)) + @rm -rf $(OBJPATH)/ $(OUTPUT) $(OUTPUT): $(OBJECTS) $(info Generating output file $(OUTPUT)) $(CO) $(OUTPUT) $(OBJECTS) $(LDFLAGS) $(LIBS) install: all $(info Installing MakeGen to /usr/bin/) @cp $(OUTPUT) /usr/bin/makegen -$(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 +$(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/Dependency.h src/FlagData.h src/xml/XMLObject.h $(info -[10%]- $<) $(CC) $(CFLAGS) -o $@ $< -$(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 +$(OBJPATH)/src/ConfigFile.o: src/ConfigFile.cpp src/ConfigFile.h src/ConfigUtils.h src/Common.h src/FileUtils.h src/Utils.h src/Dependency.h src/FlagData.h src/xml/XMLObject.h src/compatibility/ConfigFileConf.h src/xml/XML.h $(info -[20%]- $<) $(CC) $(CFLAGS) -o $@ $< -$(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 +$(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/Dependency.h src/FlagData.h src/xml/XMLObject.h $(info -[30%]- $<) $(CC) $(CFLAGS) -o $@ $< -$(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 +$(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/Dependency.h src/FlagData.h src/xml/XMLObject.h $(info -[40%]- $<) $(CC) $(CFLAGS) -o $@ $< -$(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 +$(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/Dependency.h src/FlagData.h src/xml/XMLObject.h src/Makefile.h $(info -[50%]- $<) $(CC) $(CFLAGS) -o $@ $< -$(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 +$(OBJPATH)/src/Utils.o: src/Utils.cpp src/ConfigFile.h src/ConfigUtils.h src/Common.h src/FileUtils.h src/Utils.h src/Dependency.h src/FlagData.h src/xml/XMLObject.h $(info -[60%]- $<) $(CC) $(CFLAGS) -o $@ $< -$(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 +$(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/Dependency.h src/FlagData.h src/xml/XMLObject.h src/compatibility/ConfigFileConf.h $(info -[70%]- $<) $(CC) $(CFLAGS) -o $@ $< -$(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 +$(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/Dependency.h src/FlagData.h src/xml/XMLObject.h src/HFileGen.h src/Makefile.h src/Timer.h $(info -[80%]- $<) $(CC) $(CFLAGS) -o $@ $< $(OBJPATH)/src/xml/XML.o: src/xml/XML.cpp src/xml/XML.h src/xml/XMLObject.h src/xml/XMLException.h diff --git a/makegen.xml b/makegen.xml index 398e14f..8924304 100644 --- a/makegen.xml +++ b/makegen.xml @@ -1,7 +1,7 @@ false - bin/ + bin/Release/ makegen executable MakeGen @@ -12,7 +12,7 @@ -w _DEBUG false - bin/ + bin/Debug/ makegen executable MakeGen diff --git a/src/ConfigFile.cpp b/src/ConfigFile.cpp index 2980a41..d763808 100644 --- a/src/ConfigFile.cpp +++ b/src/ConfigFile.cpp @@ -69,6 +69,18 @@ void ConfigFile::Init(const FlagData& flagData) if (targetXml->size() > 0) target = (*targetXml)[0].GetText(); } + InitDependencies(); +} + +void ConfigFile::InitDependencies() +{ + const std::vector& values = GetConfiguration().GetObjects("dependency"); + + for (const auto& value : values) + { + std::string dependencyTarget = value.GetAttribute("target", target); + dependencies.emplace_back(value.GetText(), dependencyTarget); + } } std::string& ConfigFile::GetSettingString(ConfigSetting setting) @@ -166,6 +178,11 @@ std::vector ConfigFile::GetSetting(ConfigSetting setting) } } +const std::vector& ConfigFile::GetDependencies() const +{ + return dependencies; +} + bool ConfigFile::SetSettingString(ConfigSetting setting, const std::string& value) { // Check if valid enum @@ -320,7 +337,9 @@ XMLObject& ConfigFile::GetConfiguration() } } - LOG_ERROR("Couldn\'t find given target in config file. Using target=", + LOG_ERROR("Couldn\'t find given target=", + target, + " in config file. Using target=", (*configurations)[0].HasAttribute("name") ? (*configurations)[0].GetAttribute("name") : ""); return (*configurations)[0]; } @@ -373,15 +392,18 @@ std::optional ConfigFile::GetConfigFile(const std::string& filepath, return {}; loadedConfigs.emplace(realPath, conf); - std::vector& dependencies = conf.GetSettingVectorString(ConfigSetting::Dependency); + std::vector dependencies = conf.GetDependencies(); // Create dependency config files. for (size_t i = 0; i < dependencies.size(); ++i) { - std::optional dep = GetConfigFile(conf.configPath + dependencies[i], loadedConfigs, flagData); + FlagData dependencyFlagData = flagData; + dependencyFlagData.target = dependencies[i].target; + std::optional dep = + GetConfigFile(conf.configPath + dependencies[i].path, loadedConfigs, dependencyFlagData); if (dep) { conf.dependencyConfigs.push_back(*dep); - dependencies[i] = dep->configPath; + dependencies[i].path = dep->configPath; } else { diff --git a/src/ConfigFile.h b/src/ConfigFile.h index 2eab02d..f5a9ee4 100644 --- a/src/ConfigFile.h +++ b/src/ConfigFile.h @@ -6,6 +6,7 @@ #include #include "ConfigUtils.h" +#include "Dependency.h" #include "FlagData.h" #include "xml/XMLObject.h" @@ -23,6 +24,8 @@ private: std::string configPath; std::vector dependencyConfigs; + std::vector dependencies; + bool hasInitError = false; public: @@ -37,6 +40,7 @@ public: bool GetSettingBool(ConfigSetting setting); std::vector& GetSettingVectorString(ConfigSetting setting); std::vector GetSetting(ConfigSetting setting); + const std::vector& GetDependencies() const; bool SetSettingString(ConfigSetting setting, const std::string& value); bool AddSettingVectorString(ConfigSetting setting, const std::string& value); @@ -48,6 +52,7 @@ public: private: void Init(const FlagData& flagData); + void InitDependencies(); public: static ConfigFile Gen(const FlagData& flagData); diff --git a/src/Dependency.h b/src/Dependency.h new file mode 100644 index 0000000..52f4ae2 --- /dev/null +++ b/src/Dependency.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +struct Dependency +{ + std::string path; + std::string target; + + Dependency(const std::string& path, const std::string& target) + : path{path}, + target{target} + { + } +}; diff --git a/src/Makefile.cpp b/src/Makefile.cpp index e8b42e6..7569c6f 100755 --- a/src/Makefile.cpp +++ b/src/Makefile.cpp @@ -105,13 +105,13 @@ void Makefile::Save(ConfigFile& conf, unsigned int flags) outputFile << "-l" << *it << " "; } outputFile << std::endl; - std::vector& dependencies = conf.GetSettingVectorString(ConfigSetting::Dependency); + const std::vector& dependencies = conf.GetDependencies(); if (!dependencies.empty()) { outputFile << "DEPENDENCIES="; - for (auto it = dependencies.begin(); it != dependencies.end(); ++it) + for (const auto& [path, target] : dependencies) { - outputFile << *it << " "; + outputFile << path << " "; } outputFile << std::endl; } @@ -157,8 +157,8 @@ void Makefile::Save(ConfigFile& conf, unsigned int flags) // Clean outputFile << "clean:" << std::endl; - outputFile << "\t$(info Removing $(OBJPATH))" << std::endl; - outputFile << "\t@rm -rf $(OBJPATH)/" << std::endl; + outputFile << "\t$(info Removing $(OBJPATH) and $(OUTPUT))" << std::endl; + outputFile << "\t@rm -rf $(OBJPATH)/ $(OUTPUT)" << std::endl; // Output file outputFile << "$(OUTPUT): $(OBJECTS)" << std::endl; diff --git a/src/Utils.cpp b/src/Utils.cpp index d94063e..90a3835 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -149,10 +149,10 @@ void Utils::GetCppAndHFiles(ConfigFile& conf, std::set& hFiles, std::set< } } - std::vector& dependencies = conf.GetSettingVectorString(ConfigSetting::Dependency); + const std::vector& dependencies = conf.GetDependencies(); for (size_t i = 0; i < dependencies.size(); ++i) { - GetHFiles(dependencies[i], conf.GetDependencyConfig(i), hFiles); + GetHFiles(dependencies[i].path, conf.GetDependencyConfig(i), hFiles); } } @@ -161,10 +161,10 @@ void Utils::GetHFiles(const std::string& dependencyDir, ConfigFile& conf, std::s // 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. - std::vector& dependencies = conf.GetSettingVectorString(ConfigSetting::Dependency); + const std::vector& dependencies = conf.GetDependencies(); for (size_t i = 0; i < dependencies.size(); ++i) { - GetHFiles(dependencies[i], conf.GetDependencyConfig(i), hFiles); + GetHFiles(dependencyDir + dependencies[i].path, conf.GetDependencyConfig(i), hFiles); } std::vector files; diff --git a/src/main.cpp b/src/main.cpp index 9888845..2546a3c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -154,16 +154,18 @@ bool RunMake(const std::string& filepath, unsigned int flags, ConfigFile& conf) bool MakeGen(const std::string& filepath, const FlagData& flagData, ConfigFile& conf) { - std::vector& dependencies = conf.GetSettingVectorString(ConfigSetting::Dependency); + const std::vector& dependencies = conf.GetDependencies(); for (size_t i = 0; i < dependencies.size(); ++i) { std::filesystem::path currentPath = std::filesystem::current_path(); - std::filesystem::current_path(dependencies[i]); + std::filesystem::current_path(dependencies[i].path); + FlagData dependencyFlagData = flagData; + dependencyFlagData.target = dependencies[i].target; - auto conf = ConfigFile::GetConfigFile("./", flagData); + std::optional conf = ConfigFile::GetConfigFile("./", dependencyFlagData); if (conf) { - bool success = MakeGen("./", flagData, conf.value()); + bool success = MakeGen("./", dependencyFlagData, conf.value()); if (!success) { std::filesystem::current_path(currentPath); diff --git a/src/xml/XMLObject.cpp b/src/xml/XMLObject.cpp index cbbe24e..a3f8a3d 100644 --- a/src/xml/XMLObject.cpp +++ b/src/xml/XMLObject.cpp @@ -59,7 +59,7 @@ const std::string& XMLObject::GetAttribute(const std::string& property) const return it->second; } -const std::string& XMLObject::GetAttribute(const std::string& property, const std::string& defaultValue) const +std::string XMLObject::GetAttribute(const std::string& property, const std::string& defaultValue) const { auto it = attributes.find(property); if (it == attributes.end()) @@ -81,6 +81,16 @@ std::vector* XMLObject::GetObjectPtr(const std::string& name) return &it->second; } +const std::vector& XMLObject::GetObjects(const std::string& name) const +{ + static std::vector empty{}; + auto it = objects.find(name); + if (it == objects.end()) + return empty; + + return it->second; +} + const std::map>& XMLObject::GetObjects() const { return objects; diff --git a/src/xml/XMLObject.h b/src/xml/XMLObject.h index 597763c..b225098 100644 --- a/src/xml/XMLObject.h +++ b/src/xml/XMLObject.h @@ -39,10 +39,11 @@ public: bool HasAttribute(const std::string& property) const; const std::string& GetAttribute(const std::string& property) const; - const std::string& GetAttribute(const std::string& property, const std::string& defaultValue) const; + std::string GetAttribute(const std::string& property, const std::string& defaultValue) const; unsigned int GetObjectCount() const; std::vector* GetObjectPtr(const std::string& name); + const std::vector& GetObjects(const std::string& name) const; const std::map>& GetObjects() const; const std::string& GetName() const; const std::string& GetText() const;