diff --git a/Makefile b/Makefile
index 3c37325..1962240 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-# This Makefile was generated using MakeGen v1.3.1 made by Tim HÃ¥kansson
+# This Makefile was generated using MakeGen v1.3.2 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,33 +33,33 @@ $(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/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/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/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/xml/XMLObject.h
$(info -[40%]- $<)
$(CC) $(CFLAGS) -o $@ $<
-$(OBJPATH)/Makefile.o : src/Makefile.cpp src/IncludeDeps.h src/ConfigFile.h src/ConfigUtils.h src/Common.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/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/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/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/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
+$(OBJPATH)/XML.o : src/xml/XML.cpp src/xml/XML.h src/xml/XMLObject.h src/xml/XMLException.h
$(info -[90%]- $<)
$(CC) $(CFLAGS) -o $@ $<
-$(OBJPATH)/XMLObject.o : src/xml/XMLObject.cpp src/Common.h src/Utils.h src/xml/XMLException.h src/xml/XMLObject.h
+$(OBJPATH)/XMLObject.o : src/xml/XMLObject.cpp src/Common.h src/Utils.h src/xml/XMLException.h src/xml/XMLObject.h
$(info -[100%]- $<)
$(CC) $(CFLAGS) -o $@ $<
diff --git a/makegen.xml b/makegen.xml
index 1b1dd62..1ccd807 100644
--- a/makegen.xml
+++ b/makegen.xml
@@ -19,5 +19,5 @@
src/
Release
- v1.3.0
+ v1.3.2
diff --git a/src/Common.h b/src/Common.h
index 2a4b62b..184c7f7 100755
--- a/src/Common.h
+++ b/src/Common.h
@@ -1,6 +1,8 @@
#pragma once
#include
+#include
+#include
#define BIT(x) (1<
+std::ostream& operator<<(std::ostream& ostream, const std::vector& vec)
+{
+ ostream << "[" << std::endl;
+ for (size_t i = 0; i < vec.size(); i++)
+ {
+ if (i != 0)
+ ostream << ", " << std::endl;
+ ostream << vec[i];
+ }
+ ostream << std::endl << "]";
+ return ostream;
+}
+
+template
+std::ostream& operator<<(std::ostream& ostream, const std::set& set)
+{
+ ostream << "[" << std::endl;
+ int i = 0;
+ for (const auto& elem : set)
+ {
+ if (i != 0)
+ ostream << ", " << std::endl;
+ ostream << " " << elem;
+ i++;
+ }
+ ostream << std::endl << "]";
+ return ostream;
+}
diff --git a/src/ConfigFile.cpp b/src/ConfigFile.cpp
index 039dfac..0f61b0d 100755
--- a/src/ConfigFile.cpp
+++ b/src/ConfigFile.cpp
@@ -86,7 +86,7 @@ std::string& ConfigFile::GetSettingString(ConfigSetting setting)
LOG_ERROR("To many arguments for setting using first: ", (int)setting, "=", (*values)[0].GetText());
}
std::string s = (*values)[0].GetText();
- if(ConfigUtils::IsDirectory(setting) && s[s.size()-1] != '/')
+ if(ConfigUtils::IsDirectory(setting) && !s.empty() && s[s.size()-1] != '/')
s += '/';
return cache.strings.emplace(sSetting, s).first->second;
}
diff --git a/src/ConfigUtils.h b/src/ConfigUtils.h
index 53c5c09..6a9d1e9 100644
--- a/src/ConfigUtils.h
+++ b/src/ConfigUtils.h
@@ -18,7 +18,7 @@ struct ConfigCache
enum class ConfigSetting
{
// vectors
- Library = 0, LibraryDir = 1, IncludeDir = 2, Define = 3, Dependency = 4, CFlag = 5, LFlag = 6, ExcludeSource = 7, ExcludeHeader = 8, ExecPreArgument = 9, ExecArgument = 10,
+ Library = 0, LibraryDir = 1, IncludeDir = 2, Define = 3, Dependency = 4, CFlag = 5, LFlag = 6, ExcludeSource = 7, ExcludeHeader = 8, ExecPreArgument = 9, ExecArgument = 10, SourceFile = 11,
// Strings
SourceDir = 32, OutputDir = 33, OutputName = 34, OutputType = 35, ProjectName = 36, HFileName = 37,
// Bools
@@ -69,6 +69,8 @@ struct ConfigUtils
return "argument";
case ConfigSetting::GenerateHFile:
return "generatehfile";
+ case ConfigSetting::SourceFile:
+ return "sourcefile";
case ConfigSetting::Invalid:
return "invalid";
}
@@ -98,6 +100,7 @@ struct ConfigUtils
case ConfigSetting::ExecPreArgument:
case ConfigSetting::ExecArgument:
case ConfigSetting::GenerateHFile:
+ case ConfigSetting::SourceFile:
case ConfigSetting::Invalid:
return false;
}
@@ -127,6 +130,7 @@ struct ConfigUtils
case ConfigSetting::ExecPreArgument:
case ConfigSetting::ExecArgument:
case ConfigSetting::GenerateHFile:
+ case ConfigSetting::SourceFile:
case ConfigSetting::Invalid:
return false;
}
@@ -148,6 +152,7 @@ struct ConfigUtils
case ConfigSetting::ExcludeSource:
case ConfigSetting::ExecPreArgument:
case ConfigSetting::ExecArgument:
+ case ConfigSetting::SourceFile:
return true;
case ConfigSetting::SourceDir:
case ConfigSetting::OutputDir:
@@ -184,6 +189,7 @@ struct ConfigUtils
case ConfigSetting::ExcludeSource:
case ConfigSetting::ExecPreArgument:
case ConfigSetting::ExecArgument:
+ case ConfigSetting::SourceFile:
case ConfigSetting::Invalid:
return false;
}
diff --git a/src/FileUtils.h b/src/FileUtils.h
index 5b9b1c6..267912f 100644
--- a/src/FileUtils.h
+++ b/src/FileUtils.h
@@ -12,6 +12,7 @@
#include
#include
#include
+#include
struct FileUtils
{
@@ -37,40 +38,6 @@ struct FileUtils
return GetTopDirectory(path);
}
- // Collapsed "..", ie "example/../file.h" -> "file.h"
- static std::string CollapseDirectory(const std::string& dir)
- {
- std::string ret = dir;
- size_t pos2 = dir.find_last_of("/");
- size_t pos1 = dir.find_last_of("/", pos2-1);
- size_t collapse = 0;
- size_t collapsePos = 0;
- while(pos2 != std::string::npos)
- {
- if(pos1 == std::string::npos)
- pos1 = 0;
-
- if(std::string_view(dir.c_str()+pos1, pos2 - pos1 + 1) == "/../")
- {
- if(collapse == 0)
- collapsePos = pos2;
- collapse++;
- }
- else if(collapse > 0)
- {
- collapse--;
- ret = ret.substr(0, pos1) + ret.substr(pos2 + 3);
- }
- if(pos1 == 0)
- break;
- pos2 = pos1;
- pos1 = dir.find_last_of("/", pos1-1);
- }
- if(ret[0] == '/' && dir[0] != '/')
- ret = ret.substr(1);
- return ret;
- }
-
static std::string GetTopDirectory(const std::string& dir)
{
if(dir.size() == 0)
@@ -146,6 +113,8 @@ struct FileUtils
{
// Find the most common directory
std::string commonPath = Utils::CommonPrefix(from,to);
+ if (commonPath.empty())
+ return "";
while(commonPath.back() != '/')
commonPath.pop_back();
commonPath.pop_back();
@@ -170,7 +139,7 @@ struct FileUtils
DIR* dp;
struct dirent *dirp;
if((dp = opendir(folder.c_str())) == NULL){
- LOG_ERROR(errno);
+ LOG_ERROR("Failed to open directory: ", folder);
return;
}
while((dirp = readdir(dp)) != NULL)
@@ -190,4 +159,9 @@ struct FileUtils
}
closedir(dp);
}
+
+ static bool FileExists(const std::string& filename)
+ {
+ return std::filesystem::exists(filename) && !std::filesystem::is_directory(filename);
+ }
};
diff --git a/src/HFileGen.h b/src/HFileGen.h
index e0ce193..e0c27f9 100644
--- a/src/HFileGen.h
+++ b/src/HFileGen.h
@@ -2,7 +2,7 @@
#include "ConfigFile.h"
-class HFileGen
+class HFileGen
{
public:
static void Create(ConfigFile& conf);
diff --git a/src/IncludeDeps.cpp b/src/IncludeDeps.cpp
index bc8531d..ec8eb86 100755
--- a/src/IncludeDeps.cpp
+++ b/src/IncludeDeps.cpp
@@ -1,17 +1,19 @@
#include "IncludeDeps.h"
#include "Common.h"
+#include
std::set IncludeDeps::printSet;
int IncludeDeps::printCounter = 0;
-IncludeDeps::IncludeDeps(const std::string& filename, const std::string& dir, const std::set& files, std::map& allDeps)
- : IncludeDeps{filename, dir, false, files, allDeps}
+IncludeDeps::IncludeDeps(const std::string& filename, const std::set& files, std::map& allDeps)
+ : IncludeDeps{filename, false, files, allDeps}
{}
-IncludeDeps::IncludeDeps(const std::string& filename, const std::string& dir, bool projectHFile, const std::set& files, std::map& allDeps)
- : filepath(dir+filename), projectHFile{projectHFile}
+IncludeDeps::IncludeDeps(const std::string& filename, bool projectHFile, const std::set& files, std::map& allDeps)
+ : filepath(filename), projectHFile{projectHFile}
{
+ std::filesystem::path path{filepath};
if(Utils::IsHeaderFile(filename))
{
allDeps.emplace(filepath, this);
@@ -20,42 +22,58 @@ IncludeDeps::IncludeDeps(const std::string& filename, const std::string& dir, bo
std::string line;
while(std::getline(file,line))
{
- size_t pos = line.find("#include");
- if(pos != std::string::npos)
+ std::string start;
+ std::stringstream ss{line};
+ ss >> start;
+ if(start == "#include")
{
- std::string include = FileUtils::CollapseDirectory(GetIncludeFile(line, pos, filename));
- auto it = files.find({include, "", false});
- if(it != files.end())
+ std::string include = GetIncludeFile(line);
+
+ // Check if file can be found relative to current file:
+ std::filesystem::path includeFileRelativeToSource = std::filesystem::relative(path.parent_path(), ".").string() + "/" + include;
+ if (FileUtils::FileExists(includeFileRelativeToSource.string()))
{
- auto itD = allDeps.find(it->filepath);
+ auto itD = allDeps.find(includeFileRelativeToSource.string());
if(itD == allDeps.end())
{
- IncludeDeps* inc = new IncludeDeps(it->filename,it->directory, it->isProjectHFile, files,allDeps);
- dependencies.emplace(it->filepath, inc);
- }else{
+ IncludeDeps* inc = new IncludeDeps(includeFileRelativeToSource.string(), false, files, allDeps);
+ dependencies.emplace(includeFileRelativeToSource, inc);
+ } else {
dependencies.emplace(itD->first, itD->second);
}
}
+ else
+ {
+ auto it = files.find({include, "", false});
+ if(it != files.end())
+ {
+ auto itD = allDeps.find(it->filepath);
+ if(itD == allDeps.end())
+ {
+ IncludeDeps* inc = new IncludeDeps(it->filepath, it->isProjectHFile, files, allDeps);
+ dependencies.emplace(it->filepath, inc);
+ }else{
+ dependencies.emplace(itD->first, itD->second);
+ }
+ }
+ }
}
}
}
-std::string IncludeDeps::GetIncludeFile(const std::string& line, size_t pos, const std::string& filename)
+std::string IncludeDeps::GetIncludeFile(const std::string& line)
{
- size_t bracket = line.find('<',pos);
+ size_t bracket = line.find('<');
if(bracket == std::string::npos)
{
- bracket = line.find('\"',pos);
+ bracket = line.find('\"');
if(bracket == std::string::npos)
{
return "";
}
- size_t slash = filename.find_last_of("/");
- std::string include = line.substr(bracket+1, line.find('\"',bracket+1)-bracket-1);
- if(slash == std::string::npos)
- slash = -1;
- return filename.substr(0,slash+1)+include;
+ std::string include = line.substr(bracket + 1, line.find('\"',bracket+1)-bracket-1);
+ return include;
}
else
{
diff --git a/src/IncludeDeps.h b/src/IncludeDeps.h
index 13dce2a..e257161 100755
--- a/src/IncludeDeps.h
+++ b/src/IncludeDeps.h
@@ -4,6 +4,7 @@
#include "FileUtils.h"
#include
+#include
#include