Add --target=<target> flag

- Used to compile using a specific target, without the need of modifying
  the makegen.xml file
This commit is contained in:
Thraix
2025-08-05 20:45:36 +02:00
parent 658d6df8a5
commit 6976d330fc
10 changed files with 138 additions and 92 deletions
+9 -9
View File
@@ -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
+2 -1
View File
@@ -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__)
+4 -6
View File
@@ -3,8 +3,6 @@
#include "Common.h"
#include "ConfigFile.h"
#include <set>
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<ConfigFile> config = ConfigFile::GetConfigFile();
std::optional<ConfigFile> 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;
+1 -1
View File
@@ -2,7 +2,7 @@
#include "ConfigFile.h"
struct ConfigCLI
struct ConfigCLI
{
public:
static int Main(int argc, char** argv);
+38 -25
View File
@@ -6,7 +6,7 @@
#include <fstream>
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<std::string, std::vector<XMLObject>>{});
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<XMLObject>* 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<XMLObject>* 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> ConfigFile::GetConfigFile(const std::string& filepath)
std::optional<ConfigFile> ConfigFile::GetConfigFile(const std::string& filepath, const FlagData& flagData)
{
std::map<std::string, ConfigFile> loadedConfigs;
return GetConfigFile(filepath, loadedConfigs);
return GetConfigFile(filepath, loadedConfigs, flagData);
}
std::optional<ConfigFile> ConfigFile::GetConfigFile(const std::string& filepath, std::map<std::string, ConfigFile>& loadedConfigs)
std::optional<ConfigFile> ConfigFile::GetConfigFile(const std::string& filepath, std::map<std::string, ConfigFile>& loadedConfigs, const FlagData& flagData)
{
std::string realPath = FileUtils::GetRealPath(filepath);
if(realPath == "")
@@ -354,7 +364,7 @@ std::optional<ConfigFile> 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> ConfigFile::GetConfigFile(const std::string& filepath,
// Create dependency config files.
for(size_t i = 0; i < dependencies.size();++i)
{
std::optional<ConfigFile> dep = GetConfigFile(conf.configPath + dependencies[i], loadedConfigs);
std::optional<ConfigFile> 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<std::st
}
}
ConfigFile ConfigFile::Gen()
ConfigFile ConfigFile::Gen(const FlagData& flagData)
{
bool executable, shared, generateHFile;
std::vector<std::string> 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<std::string, std::vector<XMLObject>>{});
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
+8 -7
View File
@@ -1,6 +1,7 @@
#pragma once
#include "ConfigUtils.h"
#include "FlagData.h"
#include "xml/XMLObject.h"
#include <map>
@@ -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<ConfigFile> GetConfigFile(const std::string& filepath = "./");
static ConfigFile Gen(const FlagData& flagData);
static std::optional<ConfigFile> GetConfigFile(const std::string& filepath, const FlagData& flagData);
private:
static std::optional<ConfigFile> GetConfigFile(const std::string& filepath, std::map<std::string, ConfigFile>& loadedConfigs);
static std::optional<ConfigFile> GetConfigFile(const std::string& filepath, std::map<std::string, ConfigFile>& loadedConfigs, const FlagData& flagData);
static std::optional<ConfigFile> Load(const std::string& filename);
static void InputBoolean(const std::string& inputText, bool& b);
static void InputMultiple(const std::string& inputText, std::vector<std::string>& vec, bool needEnding);
+9
View File
@@ -0,0 +1,9 @@
#pragma once
#include <string>
struct FlagData
{
unsigned int flags{0};
std::string target{""}; // Only set if flags contain FLAG_TARGET
};
+9
View File
@@ -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;
+2
View File
@@ -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<std::string>& cppFiles);
static void GetCppAndHFiles(ConfigFile& conf, std::set<HFile>& hFiles, std::set<std::string>& cppFiles);
static void GetHFiles(const std::string& dependencyDir, ConfigFile& conf, std::set<HFile>& hFiles);
+56 -43
View File
@@ -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=<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<argc;i++)
{
@@ -68,52 +70,63 @@ unsigned int ReadFlags(int argc, char** argv)
std::string flag(argv[i]);
if(flag == "-h" || flag == "--help")
{
flags |= FLAG_HELP;
flagData.flags |= FLAG_HELP;
}
else if(flag == "-v" || flag == "--version")
{
flags |= FLAG_VERSION;
flagData.flags |= FLAG_VERSION;
}
else if(flag == "make" || flag == "-m" || flag == "all" || flag == "-a")
{
flags |= FLAG_MAKE;
flagData.flags |= FLAG_MAKE;
}
else if(flag == "clean" || flag == "-c")
{
make = false;
flags |= FLAG_CLEAN;
flagData.flags |= FLAG_CLEAN;
}
else if(flag == "run" || flag == "-e" || flag == "execute")
{
flags |= FLAG_RUN;
flagData.flags |= FLAG_RUN;
}
else if(flag == "install" || flag == "-i")
{
flags |= FLAG_INSTALL;
flagData.flags |= FLAG_INSTALL;
}
else if(flag == "rebuild" || flag == "-r")
{
flags |= FLAG_CLEAN;
flags |= FLAG_MAKE;
flagData.flags |= FLAG_CLEAN;
flagData.flags |= FLAG_MAKE;
}
else if(flag == "single" || flag == "-s")
{
flags |= FLAG_SINGLE_THREAD;
flagData.flags |= FLAG_SINGLE_THREAD;
}
else if(flag == "--simple")
{
flags |= FLAG_SIMPLE;
flagData.flags |= FLAG_SIMPLE;
}
else if(Utils::StartsWith(flag, "--target="))
{
std::string prefix("--target=");
if (flag.size() < prefix.size() + 1)
{
LOG_ERROR("No target specified in --target=<target>");
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<std::string>& dependencies = conf.GetSettingVectorString(ConfigSetting::Dependency);
for(size_t i = 0;i<dependencies.size();++i)
@@ -148,10 +161,10 @@ bool MakeGen(const std::string& filepath, unsigned int flags, ConfigFile& conf)
std::filesystem::path currentPath = std::filesystem::current_path();
std::filesystem::current_path(dependencies[i]);
auto conf = ConfigFile::GetConfigFile();
auto conf = ConfigFile::GetConfigFile("./", flagData);
if(conf)
{
bool success = MakeGen("./", flags, conf.value());
bool success = MakeGen("./", flagData, conf.value());
if(!success)
{
std::filesystem::current_path(currentPath);
@@ -164,7 +177,7 @@ bool MakeGen(const std::string& filepath, unsigned int flags, ConfigFile& conf)
LOG_INFO("Building ", conf.GetSettingString(ConfigSetting::ProjectName));
LOG_INFO("Generating Makefile...");
Timer timer;
GenMakefile(conf, flags);
GenMakefile(conf, flagData.flags);
LOG_INFO("Took ", round(timer.Elapsed()*1000.0)/1000.0,"s");
LOG_INFO("Running Makefile...");
@@ -176,31 +189,31 @@ bool MakeGen(const std::string& filepath, unsigned int flags, ConfigFile& conf)
if(!FileUtils::HasPath(intermediatePath ))
FileUtils::CreateDirectory(intermediatePath );
}
return RunMake(filepath, flags, conf);
return RunMake(filepath, flagData.flags, conf);
}
int main(int argc, char** argv)
{
unsigned int flags = ReadFlags(argc,argv);
if(flags & FLAG_HELP)
FlagData flagData = ReadFlags(argc,argv);
if(flagData.flags & FLAG_HELP)
{
PrintHelp();
return 0;
}
if(flags & FLAG_VERSION)
if(flagData.flags & FLAG_VERSION)
{
LOG_INFO("MakeGen ", MAKEGEN_VERSION);
return 0;
}
if(flags & FLAG_CONFIG)
if(flagData.flags & FLAG_CONFIG)
{
return ConfigCLI::Main(argc-1, &argv[1]);
}
std::map<std::string, ConfigFile> 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