diff --git a/Makefile b/Makefile index 11ad938..260c62f 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -# This Makefile was generated using MakeGen v1.3.5 made by Tim HÃ¥kansson +# This Makefile was generated using MakeGen v1.3.6 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++ @@ -33,28 +33,28 @@ $(OUTPUT): $(OBJECTS) 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/xml/XMLObject.h +$(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 $(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/xml/XMLObject.h src/compatibility/ConfigFileConf.h src/xml/XML.h +$(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 $(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/xml/XMLObject.h +$(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 $(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/xml/XMLObject.h +$(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 $(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/xml/XMLObject.h src/Makefile.h +$(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 $(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/xml/XMLObject.h +$(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 $(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/xml/XMLObject.h src/compatibility/ConfigFileConf.h +$(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 $(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/xml/XMLObject.h src/HFileGen.h src/Makefile.h src/Timer.h +$(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 $(info -[80%]- $<) $(CC) $(CFLAGS) -o $@ $< $(OBJPATH)/XML.o : src/xml/XML.cpp src/xml/XML.h src/xml/XMLObject.h src/xml/XMLException.h diff --git a/src/Common.h b/src/Common.h index b8d88b4..0d51d6e 100755 --- 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 5 +#define MAKEGEN_VERSION_MINOR 6 #define MAKEGEN_VERSION ("v" STR(MAKEGEN_VERSION_MAJOR) "." STR(MAKEGEN_VERSION_RELEASE) "." STR(MAKEGEN_VERSION_MINOR)) @@ -29,6 +29,7 @@ const static unsigned int FLAG_SINGLE_THREAD = BIT(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); #define LOG_INFO(...) LogHelper(__VA_ARGS__) diff --git a/src/ConfigCLI.cpp b/src/ConfigCLI.cpp index 6bb5635..38cc37e 100644 --- a/src/ConfigCLI.cpp +++ b/src/ConfigCLI.cpp @@ -3,8 +3,6 @@ #include "Common.h" #include "ConfigFile.h" -#include - void ConfigCLI::DisplayCLIHelp() { LOG_INFO(1+(char*)R"( @@ -174,12 +172,12 @@ int ConfigCLI::Gen(int argc, char** argv) std::string option = argv[1]; if(option == "prompt") { - ConfigFile::Gen().Save(); + ConfigFile::Gen(FlagData{}).Save(); return 0; } if(option == "default") { - ConfigFile{FileUtils::GetRealPath("."),0}.Save(); + ConfigFile{FileUtils::GetRealPath("."), FlagData{}, 0}.Save(); return 0; } else @@ -324,7 +322,7 @@ int ConfigCLI::Main(int argc, char** argv) DisplayCLIHelp(); return 0; } - std::optional config = ConfigFile::GetConfigFile(); + std::optional config = ConfigFile::GetConfigFile("./", FlagData{}); std::string command = argv[1]; if(command == "gen") { @@ -351,7 +349,7 @@ int ConfigCLI::Main(int argc, char** argv) return 1; } } - else + else { LOG_ERROR("There is no config file in the current directory"); return 1; diff --git a/src/ConfigCLI.h b/src/ConfigCLI.h index 4335ae6..597b967 100644 --- a/src/ConfigCLI.h +++ b/src/ConfigCLI.h @@ -2,7 +2,7 @@ #include "ConfigFile.h" -struct ConfigCLI +struct ConfigCLI { public: static int Main(int argc, char** argv); diff --git a/src/ConfigFile.cpp b/src/ConfigFile.cpp index b844f95..b4a25a1 100755 --- a/src/ConfigFile.cpp +++ b/src/ConfigFile.cpp @@ -6,7 +6,7 @@ #include -ConfigFile::ConfigFile(const std::string& path, int) +ConfigFile::ConfigFile(const std::string& path, const FlagData& flagData, int) : configPath{path} { // Converts project name (current directory) to lowercase @@ -16,7 +16,10 @@ ConfigFile::ConfigFile(const std::string& path, int) // Version, target and configuration is probably going to be used in the future makegen.AddXMLObject(XMLObject("version", {}, "v1.3.0")); - makegen.AddXMLObject(XMLObject("target", {}, "Release")); + if(flagData.flags & FLAG_TARGET) + makegen.AddXMLObject(XMLObject("target", {}, flagData.target)); + else + makegen.AddXMLObject(XMLObject("target", {}, "Release")); XMLObject configuration("configuration", {{"name", "Release"}}, std::map>{}); configuration.AddXMLObject(XMLObject("projectname", {}, ConfigUtils::GetDefaultProjectName(configPath))); @@ -29,35 +32,42 @@ ConfigFile::ConfigFile(const std::string& path, int) makegen.AddXMLObject(configuration); config = makegen; - Init(); + Init(flagData); } -ConfigFile::ConfigFile(const std::string& path) +ConfigFile::ConfigFile(const std::string& path, const FlagData& flagData) : config{XML::FromFile(path + CONFIG_FILENAME)}, configPath{path} { - Init(); + Init(flagData); } -ConfigFile::ConfigFile(XMLObject& config, const std::string& path) +ConfigFile::ConfigFile(XMLObject& config, const std::string& path, const FlagData& flagData) : config{config}, configPath{path} { - Init(); + Init(flagData); } -void ConfigFile::Init() +void ConfigFile::Init(const FlagData& flagData) { - const std::vector* targetXml = config.GetObjectPtr("target"); - target = "Release"; - if(!targetXml || targetXml->size() == 0) + if (flagData.flags & FLAG_TARGET) { - LOG_ERROR("No target found in config file. Using target=", target); - return; + target = flagData.target; + } + else + { + const std::vector* targetXml = config.GetObjectPtr("target"); + target = "Release"; + if(!targetXml || targetXml->size() == 0) + { + LOG_ERROR("No target found in config file. Using target=", target); + return; + } + if(targetXml->size() > 1) + LOG_ERROR("To many targets in config file. Using target=", (*targetXml)[0].GetText()); + if(targetXml->size() > 0) + target = (*targetXml)[0].GetText(); } - if(targetXml->size() > 1) - LOG_ERROR("To many targets in config file. Using target=", (*targetXml)[0].GetText()); - if(targetXml->size() > 0) - target = (*targetXml)[0].GetText(); } std::string& ConfigFile::GetSettingString(ConfigSetting setting) @@ -323,13 +333,13 @@ ConfigFile& ConfigFile::GetDependencyConfig(size_t i) return dependencyConfigs[i]; } -std::optional ConfigFile::GetConfigFile(const std::string& filepath) +std::optional ConfigFile::GetConfigFile(const std::string& filepath, const FlagData& flagData) { std::map loadedConfigs; - return GetConfigFile(filepath, loadedConfigs); + return GetConfigFile(filepath, loadedConfigs, flagData); } -std::optional ConfigFile::GetConfigFile(const std::string& filepath, std::map& loadedConfigs) +std::optional ConfigFile::GetConfigFile(const std::string& filepath, std::map& loadedConfigs, const FlagData& flagData) { std::string realPath = FileUtils::GetRealPath(filepath); if(realPath == "") @@ -354,7 +364,7 @@ std::optional ConfigFile::GetConfigFile(const std::string& filepath, if(f.good()) { f.close(); - ConfigFile conf = ConfigFile(filepath); + ConfigFile conf = ConfigFile(filepath, flagData); if(conf.hasInitError) return {}; loadedConfigs.emplace(realPath, conf); @@ -363,7 +373,7 @@ std::optional ConfigFile::GetConfigFile(const std::string& filepath, // Create dependency config files. for(size_t i = 0; i < dependencies.size();++i) { - std::optional dep = GetConfigFile(conf.configPath + dependencies[i], loadedConfigs); + std::optional dep = GetConfigFile(conf.configPath + dependencies[i], loadedConfigs, flagData); if(dep) { conf.dependencyConfigs.push_back(*dep); @@ -425,7 +435,7 @@ void ConfigFile::InputMultiple(const std::string& inputText, std::vector libs, libdirs, includedirs, defines, compileFlags, linkingFlags, dependencies, excludeSources, excludeHeaders; @@ -467,7 +477,10 @@ ConfigFile ConfigFile::Gen() // Version, target and configuration is probably going to be used in the future makegen.AddXMLObject(XMLObject("version", {}, "v1.3.0")); - makegen.AddXMLObject(XMLObject("target", {}, "Release")); + if(flagData.flags & FLAG_TARGET) + makegen.AddXMLObject(XMLObject("target", {}, flagData.target)); + else + makegen.AddXMLObject(XMLObject("target", {}, "Release")); XMLObject configuration("configuration", {{"name", "Release"}}, std::map>{}); configuration.AddXMLObject(XMLObject("projectname", {}, projectname)); @@ -493,7 +506,7 @@ ConfigFile ConfigFile::Gen() configuration.AddXMLObject({"dependency",{},*it}); makegen.AddXMLObject(configuration); - return ConfigFile{makegen, FileUtils::GetRealPath(".")}; + return ConfigFile{makegen, FileUtils::GetRealPath("."), flagData}; } void ConfigFile::Save() const diff --git a/src/ConfigFile.h b/src/ConfigFile.h index e058497..81f8ee7 100755 --- a/src/ConfigFile.h +++ b/src/ConfigFile.h @@ -1,6 +1,7 @@ #pragma once #include "ConfigUtils.h" +#include "FlagData.h" #include "xml/XMLObject.h" #include @@ -26,9 +27,9 @@ class ConfigFile public: // Generates a new default config file - ConfigFile(const std::string& path, int); - ConfigFile(const std::string& path); - ConfigFile(XMLObject& config, const std::string& path); + ConfigFile(const std::string& path, const FlagData& flagData, int); + ConfigFile(const std::string& path, const FlagData& flagData); + ConfigFile(XMLObject& config, const std::string& path, const FlagData& flagData); void Save() const; @@ -45,13 +46,13 @@ class ConfigFile const std::string& GetConfigPath() const; ConfigFile& GetDependencyConfig(size_t i); private: - void Init(); + void Init(const FlagData& flagData); public: - static ConfigFile Gen(); - static std::optional GetConfigFile(const std::string& filepath = "./"); + static ConfigFile Gen(const FlagData& flagData); + static std::optional GetConfigFile(const std::string& filepath, const FlagData& flagData); private: - static std::optional GetConfigFile(const std::string& filepath, std::map& loadedConfigs); + static std::optional GetConfigFile(const std::string& filepath, std::map& loadedConfigs, const FlagData& flagData); static std::optional Load(const std::string& filename); static void InputBoolean(const std::string& inputText, bool& b); static void InputMultiple(const std::string& inputText, std::vector& vec, bool needEnding); diff --git a/src/FlagData.h b/src/FlagData.h new file mode 100644 index 0000000..f8b34c5 --- /dev/null +++ b/src/FlagData.h @@ -0,0 +1,9 @@ +#pragma once + +#include + +struct FlagData +{ + unsigned int flags{0}; + std::string target{""}; // Only set if flags contain FLAG_TARGET +}; diff --git a/src/Utils.cpp b/src/Utils.cpp index 4854340..0ca47bc 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -32,6 +32,15 @@ bool Utils::IsHeaderFile(const std::string& filepath) return extension == "hpp" || extension == "h" || extension == "hxx"; } +bool Utils::StartsWith(const std::string& str, const std::string& prefix) +{ + if (str.size() < prefix.size()) + return false; + + return str.compare(0, prefix.size(), prefix) == 0; +} + + std::string Utils::CommonPrefix(const std::string& s1, const std::string& s2) { size_t n = 0; diff --git a/src/Utils.h b/src/Utils.h index b051f82..b57bc42 100644 --- a/src/Utils.h +++ b/src/Utils.h @@ -34,7 +34,9 @@ struct Utils { static bool IsSourceFile(const std::string& filepath); static bool IsHeaderFile(const std::string& filepath); + static std::string CommonPrefix(const std::string& s1, const std::string& s2); + static bool StartsWith(const std::string& str, const std::string& prefix); static void GetCppFiles(ConfigFile& conf, std::set& cppFiles); static void GetCppAndHFiles(ConfigFile& conf, std::set& hFiles, std::set& cppFiles); static void GetHFiles(const std::string& dependencyDir, ConfigFile& conf, std::set& hFiles); diff --git a/src/main.cpp b/src/main.cpp index 55b5310..eb2b49b 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,6 +2,7 @@ #include "ConfigCLI.h" #include "ConfigFile.h" #include "FileUtils.h" +#include "FlagData.h" #include "HFileGen.h" #include "Makefile.h" #include "Timer.h" @@ -25,22 +26,23 @@ By default it always compiles code with parallell jobs. Usage: makegen [options] Options: - -h, --help Displays this information - -v, --version Displays the version of this program - -m,-a, make, all Generates a Makefile and runs - make all - -i, install Generates a Makefile and runs - make all && make install - -c, clean Generates a Makefile and runs - make clean - -r, rebuild Generates a Makefile and runs - make clean && make all - -e, run, execute Generates a Makefile and runs - make all && make run - -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) + -h, --help Displays this information + -v, --version Displays the version of this program + -m,-a, make, all Generates a Makefile and runs + make all + -i, install Generates a Makefile and runs + make all && make install + -c, clean Generates a Makefile and runs + make clean + -r, rebuild Generates a Makefile and runs + make clean && make all + -e, run, execute Generates a Makefile and runs + make all && make run + -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\" @@ -55,11 +57,11 @@ void GenMakefile(ConfigFile& conf, unsigned int flags) Makefile::Save(conf, flags); } -unsigned int ReadFlags(int argc, char** argv) +FlagData ReadFlags(int argc, char** argv) { if(argc >= 2 && std::string(argv[1]) == "conf") - return FLAG_CONFIG; - unsigned int flags = 0; + return FlagData{FLAG_CONFIG}; + FlagData flagData{}; bool make = true; for(int i = 1;i"); + return FlagData{FLAG_HELP}; + } + flagData.flags |= FLAG_TARGET; + flagData.target = flag.substr(std::string("--target=").size()); } else if(flag != "") { LOG_ERROR("Unknown argument ", flag); - return FLAG_HELP; + return FlagData{FLAG_HELP}; } } } if(make) - flags |= FLAG_MAKE; - return flags; + flagData.flags |= FLAG_MAKE; + return flagData; } bool RunMake(const std::string& filepath, unsigned int flags, ConfigFile& conf) @@ -140,7 +153,7 @@ bool RunMake(const std::string& filepath, unsigned int flags, ConfigFile& conf) return true; } -bool MakeGen(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); for(size_t i = 0;i files{}; - auto conf = ConfigFile::GetConfigFile(); + auto conf = ConfigFile::GetConfigFile("./", flagData); if(conf) { - bool success = MakeGen("./", flags, *conf); + bool success = MakeGen("./", flagData, *conf); return success ? 0 : 1; } else