Add support for specifying target for dependencies
- Use <dependency target="target"> to specify which target the dependency should be compiled for. - Fix binary not being removed when doing makegen clean
This commit is contained in:
@@ -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
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
<makegen>
|
||||
<configuration name="Release">
|
||||
<generatehfile>false</generatehfile>
|
||||
<outputdir>bin/</outputdir>
|
||||
<outputdir>bin/Release/</outputdir>
|
||||
<outputname>makegen</outputname>
|
||||
<outputtype>executable</outputtype>
|
||||
<projectname>MakeGen</projectname>
|
||||
@@ -12,7 +12,7 @@
|
||||
<cflag>-w</cflag>
|
||||
<define>_DEBUG</define>
|
||||
<generatehfile>false</generatehfile>
|
||||
<outputdir>bin/</outputdir>
|
||||
<outputdir>bin/Debug/</outputdir>
|
||||
<outputname>makegen</outputname>
|
||||
<outputtype>executable</outputtype>
|
||||
<projectname>MakeGen</projectname>
|
||||
|
||||
+26
-4
@@ -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<XMLObject>& 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<std::string> ConfigFile::GetSetting(ConfigSetting setting)
|
||||
}
|
||||
}
|
||||
|
||||
const std::vector<Dependency>& 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> ConfigFile::GetConfigFile(const std::string& filepath,
|
||||
return {};
|
||||
loadedConfigs.emplace(realPath, conf);
|
||||
|
||||
std::vector<std::string>& dependencies = conf.GetSettingVectorString(ConfigSetting::Dependency);
|
||||
std::vector<Dependency> dependencies = conf.GetDependencies();
|
||||
// Create dependency config files.
|
||||
for (size_t i = 0; i < dependencies.size(); ++i)
|
||||
{
|
||||
std::optional<ConfigFile> dep = GetConfigFile(conf.configPath + dependencies[i], loadedConfigs, flagData);
|
||||
FlagData dependencyFlagData = flagData;
|
||||
dependencyFlagData.target = dependencies[i].target;
|
||||
std::optional<ConfigFile> 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
|
||||
{
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include <vector>
|
||||
|
||||
#include "ConfigUtils.h"
|
||||
#include "Dependency.h"
|
||||
#include "FlagData.h"
|
||||
#include "xml/XMLObject.h"
|
||||
|
||||
@@ -23,6 +24,8 @@ private:
|
||||
std::string configPath;
|
||||
std::vector<ConfigFile> dependencyConfigs;
|
||||
|
||||
std::vector<Dependency> dependencies;
|
||||
|
||||
bool hasInitError = false;
|
||||
|
||||
public:
|
||||
@@ -37,6 +40,7 @@ public:
|
||||
bool GetSettingBool(ConfigSetting setting);
|
||||
std::vector<std::string>& GetSettingVectorString(ConfigSetting setting);
|
||||
std::vector<std::string> GetSetting(ConfigSetting setting);
|
||||
const std::vector<Dependency>& 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);
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
|
||||
struct Dependency
|
||||
{
|
||||
std::string path;
|
||||
std::string target;
|
||||
|
||||
Dependency(const std::string& path, const std::string& target)
|
||||
: path{path},
|
||||
target{target}
|
||||
{
|
||||
}
|
||||
};
|
||||
+5
-5
@@ -105,13 +105,13 @@ void Makefile::Save(ConfigFile& conf, unsigned int flags)
|
||||
outputFile << "-l" << *it << " ";
|
||||
}
|
||||
outputFile << std::endl;
|
||||
std::vector<std::string>& dependencies = conf.GetSettingVectorString(ConfigSetting::Dependency);
|
||||
const std::vector<Dependency>& 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;
|
||||
|
||||
+4
-4
@@ -149,10 +149,10 @@ void Utils::GetCppAndHFiles(ConfigFile& conf, std::set<HFile>& hFiles, std::set<
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<std::string>& dependencies = conf.GetSettingVectorString(ConfigSetting::Dependency);
|
||||
const std::vector<Dependency>& 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<std::string>& dependencies = conf.GetSettingVectorString(ConfigSetting::Dependency);
|
||||
const std::vector<Dependency>& 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<std::string> files;
|
||||
|
||||
+6
-4
@@ -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<std::string>& dependencies = conf.GetSettingVectorString(ConfigSetting::Dependency);
|
||||
const std::vector<Dependency>& 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<ConfigFile> 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);
|
||||
|
||||
+11
-1
@@ -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>* XMLObject::GetObjectPtr(const std::string& name)
|
||||
return &it->second;
|
||||
}
|
||||
|
||||
const std::vector<XMLObject>& XMLObject::GetObjects(const std::string& name) const
|
||||
{
|
||||
static std::vector<XMLObject> empty{};
|
||||
auto it = objects.find(name);
|
||||
if (it == objects.end())
|
||||
return empty;
|
||||
|
||||
return it->second;
|
||||
}
|
||||
|
||||
const std::map<std::string, std::vector<XMLObject>>& XMLObject::GetObjects() const
|
||||
{
|
||||
return objects;
|
||||
|
||||
+2
-1
@@ -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<XMLObject>* GetObjectPtr(const std::string& name);
|
||||
const std::vector<XMLObject>& GetObjects(const std::string& name) const;
|
||||
const std::map<std::string, std::vector<XMLObject>>& GetObjects() const;
|
||||
const std::string& GetName() const;
|
||||
const std::string& GetText() const;
|
||||
|
||||
Reference in New Issue
Block a user