diff --git a/Makefile b/Makefile index 92ef820..062e34b 100644 --- a/Makefile +++ b/Makefile @@ -34,28 +34,28 @@ $(OUTPUT): $(OBJECTS) install: all $(info Installing MakeGen to /usr/bin/) @cp $(OUTPUT) /usr/bin/makegen -$(OBJPATH)/src/ConfigCLI.o: src/ConfigCLI.cpp src/Common.h src/AssertException.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 +$(OBJPATH)/src/ConfigCLI.o: src/ConfigCLI.cpp src/Common.h src/AssertException.h src/ConfigCLI.h src/ConfigFile.h src/ConfigUtils.h src/Dependency.h src/FlagData.h src/xml/XMLObject.h src/FileUtils.h src/Utils.h $(info -[10%]- $<) $(CC) $(CFLAGS) -o $@ $< -$(OBJPATH)/src/ConfigFile.o: src/ConfigFile.cpp src/ConfigFile.h src/ConfigUtils.h src/Common.h src/AssertException.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 +$(OBJPATH)/src/ConfigFile.o: src/ConfigFile.cpp src/ConfigFile.h src/ConfigUtils.h src/Common.h src/AssertException.h src/Dependency.h src/FlagData.h src/xml/XMLObject.h src/FileUtils.h src/Utils.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/AssertException.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/AssertException.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 +$(OBJPATH)/src/IncludeDeps.o: src/IncludeDeps.cpp src/Common.h src/AssertException.h src/IncludeDeps.h src/ConfigFile.h src/ConfigUtils.h src/Dependency.h src/FlagData.h src/xml/XMLObject.h src/FileUtils.h src/Utils.h $(info -[40%]- $<) $(CC) $(CFLAGS) -o $@ $< -$(OBJPATH)/src/Makefile.o: src/Makefile.cpp src/Common.h src/AssertException.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 +$(OBJPATH)/src/Makefile.o: src/Makefile.cpp src/Common.h src/AssertException.h src/IncludeDeps.h src/ConfigFile.h src/ConfigUtils.h src/Dependency.h src/FlagData.h src/xml/XMLObject.h src/FileUtils.h src/Utils.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/AssertException.h src/FileUtils.h src/Utils.h src/Dependency.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/AssertException.h src/Dependency.h src/FlagData.h src/xml/XMLObject.h src/FileUtils.h src/Utils.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/AssertException.h src/FileUtils.h src/Utils.h src/Dependency.h src/FlagData.h src/xml/XMLObject.h src/compatibility/ConfigFileConf.h +$(OBJPATH)/src/compatibility/ConfigFileConf.o: src/compatibility/ConfigFileConf.cpp src/Common.h src/AssertException.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/AssertException.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 +$(OBJPATH)/src/main.o: src/main.cpp src/Common.h src/AssertException.h src/ConfigCLI.h src/ConfigFile.h src/ConfigUtils.h src/Dependency.h src/FlagData.h src/xml/XMLObject.h src/HFileGen.h src/Makefile.h src/Timer.h src/Utils.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 ef44938..a57ee44 100644 --- a/makegen.xml +++ b/makegen.xml @@ -1,5 +1,6 @@ + c++17 bin/Release/ makegen executable @@ -9,6 +10,7 @@ -g3 -w + c++17 _DEBUG bin/Debug/ makegen @@ -17,5 +19,5 @@ src/ Release - v1.3.10 + v1.3.11 diff --git a/src/Common.h b/src/Common.h index 4e76033..941ff84 100644 --- a/src/Common.h +++ b/src/Common.h @@ -16,7 +16,7 @@ // Release, should be backwards compatible with any minor version #define MAKEGEN_VERSION_RELEASE 3 // Minor changes, generally bug fixes -#define MAKEGEN_VERSION_MINOR 10 +#define MAKEGEN_VERSION_MINOR 11 #define MAKEGEN_VERSION ("v" STR(MAKEGEN_VERSION_MAJOR) "." STR(MAKEGEN_VERSION_RELEASE) "." STR(MAKEGEN_VERSION_MINOR)) @@ -42,15 +42,13 @@ const static unsigned int FLAG_TARGET = BIT(11); LOG_ERROR(__VA_ARGS__); \ throw AssertException{}; \ } \ - { \ - } \ - while (false) + false #define ABORT(...) \ { \ LOG_ERROR(__VA_ARGS__); \ throw AssertException{}; \ } \ - while (false) + false template void Log(const T& var) diff --git a/src/ConfigCLI.cpp b/src/ConfigCLI.cpp index a7c40c8..3070c6e 100644 --- a/src/ConfigCLI.cpp +++ b/src/ConfigCLI.cpp @@ -2,6 +2,7 @@ #include "Common.h" #include "ConfigFile.h" +#include "FileUtils.h" void ConfigCLI::DisplayCLIHelp() { @@ -93,6 +94,7 @@ Valid string settings are: outputtype Type of the output, valid values are executable, sharedlibrary and staticlibrary hfile Name of the generated project h-file + cppversion Version of the c++ to use Valid boolean settings are: genhfile Specifies if MakeGen should generate a project h-file @@ -125,7 +127,9 @@ Valid settings are: and staticlibrary projectname Name of the project hfile Name of the generated project h-file - genhfile Specifies if MakeGen should generate a project h-file)"); + genhfile Specifies if MakeGen should generate a project h-file + cppversion Specifies the version of c++ to use (default=c++17) + )"); } ConfigSetting ConfigCLI::CLIStringToSetting(const std::string& s) @@ -149,9 +153,10 @@ ConfigSetting ConfigCLI::CLIStringToSetting(const std::string& s) {"argument", ConfigSetting::ExecArgument}, {"dependency", ConfigSetting::Dependency}, {"genhfile", ConfigSetting::GenerateHFile}, + {"cppversion", ConfigSetting::CppVersion}, }; auto it = map.find(s); - ASSERT(it != map.end(), "Invalid config setting: ", s) + ASSERT(it != map.end(), "Invalid config setting: ", s); return it->second; } @@ -175,7 +180,7 @@ int ConfigCLI::Gen(int argc, char** argv) } if (option == "default") { - ConfigFile{FileUtils::GetRealPath("."), FlagData{}, 0}.Save(); + ConfigFile{std::filesystem::current_path(), FlagData{}, 0}.Save(); return 0; } else diff --git a/src/ConfigFile.cpp b/src/ConfigFile.cpp index d2e744a..5a0a1f9 100644 --- a/src/ConfigFile.cpp +++ b/src/ConfigFile.cpp @@ -6,6 +6,8 @@ #include "compatibility/ConfigFileConf.h" #include "xml/XML.h" +const std::string DEFAULT_CPP_VERSION = "c++17"; + ConfigFile::ConfigFile(const std::string& path, const FlagData& flagData, int) : makegen{"makegen", {}, std::map>{}}, configPath{std::filesystem::canonical(path)} @@ -24,10 +26,9 @@ ConfigFile::ConfigFile(const std::string& path, const FlagData& flagData, int) configuration.AddXMLObject(XMLObject("projectname", {}, ConfigUtils::GetDefaultProjectName(configPath))); configuration.AddXMLObject(XMLObject("outputname", {}, ConfigUtils::GetDefaultOutputName(configPath))); configuration.AddXMLObject(XMLObject("srcdir", {}, "src/")); - configuration.AddXMLObject(XMLObject("outputdir", {}, "bin/")); - configuration.AddXMLObject(XMLObject("hfilename", {}, ConfigUtils::GetDefaultHFileName(configPath))); + configuration.AddXMLObject(XMLObject("outputdir", {}, "bin/" + target + "/")); configuration.AddXMLObject(XMLObject("outputtype", {}, "executable")); - configuration.AddXMLObject(XMLObject("generatehfile", {}, "false")); + configuration.AddXMLObject(XMLObject("cppversion", {}, DEFAULT_CPP_VERSION)); makegen.AddXMLObject(configuration); Init(flagData); @@ -56,6 +57,7 @@ void ConfigFile::Init(const FlagData& flagData) InitStringSetting("outputtype", &outputType); InitStringSetting("outputdir", &outputDir); InitStringSetting("projectname", &projectName); + InitStringSetting("cppversion", DEFAULT_CPP_VERSION, &cppVersion); InitOptionalStringSetting("srcdir", &sourceDir); InitOptionalStringSetting("hfilename", &hFileName); InitStringListSetting("librarydir", &libraryDirs); @@ -144,7 +146,25 @@ void ConfigFile::InitDependencies() void ConfigFile::InitStringSetting(const std::string& name, std::string* output) { const std::vector& values = config.GetObjects(name); - ASSERT(!values.empty(), "No ", name, " defined in makegen.xml") + ASSERT(!values.empty(), "No ", name, " defined in makegen.xml"); + + if (values.size() > 1) + { + LOG_ERROR("Only one instance of ", name, " allowed using ", values.front().GetText()); + } + + *output = values.front().GetText(); +} + +void ConfigFile::InitStringSetting(const std::string& name, const std::string& defaultVal, std::string* output) +{ + const std::vector& values = config.GetObjects(name); + if (values.empty()) + { + *output = defaultVal; + return; + } + ASSERT(!values.empty(), "No ", name, " defined in makegen.xml"); if (values.size() > 1) { @@ -251,6 +271,11 @@ const std::string& ConfigFile::GetOutputType() const return outputType; } +const std::string& ConfigFile::GetCppVersion() const +{ + return cppVersion; +} + const std::optional& ConfigFile::GetSourceDir() const { return sourceDir; @@ -349,6 +374,8 @@ std::vector ConfigFile::GetSetting(ConfigSetting setting) const return {outputType}; case ConfigSetting::ProjectName: return {projectName}; + case ConfigSetting::CppVersion: + return {cppVersion}; case ConfigSetting::HFileName: { if (hFileName.has_value()) @@ -443,6 +470,9 @@ bool ConfigFile::SetSettingString(ConfigSetting setting, std::string value) case ConfigSetting::GenerateHFile: generateHFile = value == "true"; break; + case ConfigSetting::CppVersion: + cppVersion = value; + break; default: LOG_ERROR("Not a string setting"); return false; diff --git a/src/ConfigFile.h b/src/ConfigFile.h index 9248eb1..30f117d 100644 --- a/src/ConfigFile.h +++ b/src/ConfigFile.h @@ -26,6 +26,7 @@ public: const std::string& GetOutputName() const; const std::string& GetProjectName() const; const std::string& GetOutputType() const; + const std::string& GetCppVersion() const; const std::optional& GetSourceDir() const; const std::optional& GetHFileName() const; const std::vector& GetLibraryDirs() const; @@ -69,6 +70,7 @@ private: std::string outputDir; std::string projectName; std::string outputType; + std::string cppVersion; std::optional sourceDir; std::optional hFileName; std::vector libraryDirs; @@ -92,6 +94,7 @@ private: XMLObject& GetTargetConfig(); void InitDependencies(); void InitStringSetting(const std::string& name, std::string* output); + void InitStringSetting(const std::string& name, const std::string& defaultVal, std::string* output); void InitOptionalStringSetting(const std::string& name, std::optional* output); void InitStringListSetting(const std::string& name, std::vector* output); void InitBoolSetting(const std::string& name, bool* output); diff --git a/src/ConfigUtils.h b/src/ConfigUtils.h index 838bdf2..9d91623 100644 --- a/src/ConfigUtils.h +++ b/src/ConfigUtils.h @@ -1,44 +1,39 @@ #pragma once +#include +#include #include #include #include #include "Common.h" -#include "FileUtils.h" - -struct ConfigCache -{ - std::map strings; - std::map> vecStrings; - std::map bools; -}; 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, - SourceFile = 11, - IncludeDirExclDep = 12, + Library, + LibraryDir, + IncludeDir, + Define, + Dependency, + CFlag, + LFlag, + ExcludeSource, + ExcludeHeader, + ExecPreArgument, + ExecArgument, + SourceFile, + IncludeDirExclDep, // Strings - SourceDir = 32, - OutputDir = 33, - OutputName = 34, - OutputType = 35, - ProjectName = 36, - HFileName = 37, + SourceDir, + OutputDir, + OutputName, + OutputType, + ProjectName, + HFileName, + CppVersion, // Bools - GenerateHFile = 64, + GenerateHFile, }; struct ConfigUtils @@ -87,6 +82,8 @@ struct ConfigUtils return "sourcefile"; case ConfigSetting::IncludeDirExclDep: return "includedirexcldep"; + case ConfigSetting::CppVersion: + return "cppversion"; } return ""; } @@ -116,6 +113,7 @@ struct ConfigUtils case ConfigSetting::ExecArgument: case ConfigSetting::GenerateHFile: case ConfigSetting::SourceFile: + case ConfigSetting::CppVersion: return false; } return false; @@ -131,6 +129,7 @@ struct ConfigUtils case ConfigSetting::OutputType: case ConfigSetting::ProjectName: case ConfigSetting::HFileName: + case ConfigSetting::CppVersion: return true; case ConfigSetting::LibraryDir: case ConfigSetting::IncludeDir: @@ -176,6 +175,7 @@ struct ConfigUtils case ConfigSetting::ProjectName: case ConfigSetting::HFileName: case ConfigSetting::GenerateHFile: + case ConfigSetting::CppVersion: return false; } return false; @@ -206,35 +206,12 @@ struct ConfigUtils case ConfigSetting::ExecArgument: case ConfigSetting::SourceFile: case ConfigSetting::IncludeDirExclDep: + case ConfigSetting::CppVersion: return false; } return false; } - static std::string GetDefaultSettingString(ConfigSetting setting, const std::string& path) - { - switch (setting) - { - case ConfigSetting::SourceDir: - return "src/"; - case ConfigSetting::OutputDir: - return "bin/"; - case ConfigSetting::OutputName: - return GetDefaultOutputName(path); - case ConfigSetting::OutputType: - return "executable"; - case ConfigSetting::ProjectName: - return GetDefaultProjectName(path); - case ConfigSetting::HFileName: - return GetDefaultHFileName(path); - case ConfigSetting::GenerateHFile: - return GetDefaultSettingBool(setting) ? "true" : "false"; - default: - ASSERT(false, "INVALID STRING ENUM: ", (int)setting); - } - return ""; - } - static bool GetDefaultSettingBool(ConfigSetting setting) { switch (setting) @@ -248,7 +225,7 @@ struct ConfigUtils static std::string GetDefaultProjectName(const std::string& path) { - return FileUtils::GetTopDirectory(path); + return std::filesystem::canonical(path).filename(); } static std::string GetDefaultOutputName(const std::string& path) diff --git a/src/FileUtils.h b/src/FileUtils.h index 15814fc..c6f6043 100644 --- a/src/FileUtils.h +++ b/src/FileUtils.h @@ -17,100 +17,11 @@ struct FileUtils { - static bool HasPath(const std::string& path) - { - struct stat info; - - if (stat(path.c_str(), &info) != 0) - return false; - else - return true; - } - - static bool CreateDirectory(const std::string& path) - { - return mkdir(path.c_str(), 0777); - } - - static std::string GetCurrentDirectory() - { - static char path[256]; // Usual maximum filename - getcwd(path, sizeof(path)); - return GetTopDirectory(path); - } - - static std::string GetTopDirectory(const std::string& dir) - { - ASSERT(!dir.empty(), "Cannot send empty string to FileUtils::GetTopDirectory()"); - - size_t dirEnd = std::string::npos; - if (dir[dir.size() - 1] == '/') - dirEnd = dir.size() - 2; - size_t pos = dir.find_last_of("/", dirEnd); - ASSERT(pos != std::string::npos, "Couldn't find / (slash) in directory. This shouldn't occur."); - return dir.substr(pos + 1, dirEnd - pos); - } - static std::string GetRealPath(const std::string& filename) { return std::filesystem::canonical(filename).string(); } - static std::string GetRelativePath(std::string from, std::string to) - { - std::string result; - if (to[to.size() - 1] == '/') - to.pop_back(); - if (from[from.size() - 1] == '/') - from.pop_back(); - - // Check if the directory is inside 'from' - if (strncmp(to.c_str(), from.c_str(), from.size()) == 0) - { - // Same directory - if (to.size() == from.size()) - return ""; - // Remove the 'from' path - return to.substr(from.size() + 1); - } - // Check if the directory is a child of from - else if (strncmp(from.c_str(), to.c_str(), to.size()) == 0) - { - std::string sub = from.substr(to.size()); - size_t n = std::count(sub.begin(), sub.end(), '/'); - for (int i = 0; i < n; i++) - { - result += ".."; - if (i != n - 1) - result += "/"; - } - return result; - } - // Otherwise it's a path in another directory - else - { - // 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(); - - // Go back to the common directory - std::string sub = from.substr(commonPath.size()); - size_t n = std::count(sub.begin(), sub.end(), '/'); - for (int i = 0; i < n; i++) - { - result += ".."; - if (i != n - 1) - result += "/"; - } - // Add the path which diverges - result += to.substr(commonPath.size()); - return result; - } - } - static void GetAllFiles(const std::string& folder, std::vector& files) { DIR* dp; diff --git a/src/Makefile.cpp b/src/Makefile.cpp index c53ea06..eadf002 100755 --- a/src/Makefile.cpp +++ b/src/Makefile.cpp @@ -61,11 +61,11 @@ void Makefile::Save(ConfigFile& conf, unsigned int flags) outputFile << std::endl; if (outputtype == "executable" || outputtype != "sharedlibrary") { - outputFile << "CFLAGS=$(INCLUDES) -std=c++17 -c "; + outputFile << "CFLAGS=$(INCLUDES) -std=" + conf.GetCppVersion() + " -c "; } else { - outputFile << "CFLAGS=$(INCLUDES) -fPIC -std=c++17 -c "; + outputFile << "CFLAGS=$(INCLUDES) -fPIC -std=" + conf.GetCppVersion() + " -c "; } const std::vector& defines = conf.GetDefines(); for (const auto& define : defines) diff --git a/src/compatibility/ConfigFileConf.cpp b/src/compatibility/ConfigFileConf.cpp index 2467161..753e729 100644 --- a/src/compatibility/ConfigFileConf.cpp +++ b/src/compatibility/ConfigFileConf.cpp @@ -3,10 +3,11 @@ const std::string CONFIG_FILENAME_CONF = "makegen.conf"; #include +#include #include -#include "../ConfigFile.h" -#include "../FileUtils.h" +#include "../Common.h" +#include "../xml/XMLObject.h" #define FLAG_NONE 0 #define FLAG_VECTOR 1 @@ -14,10 +15,10 @@ const std::string CONFIG_FILENAME_CONF = "makegen.conf"; #define FLAG_BOOL 3 ConfigFileConf::ConfigFileConf() - : outputdir("bin/"), + : outputdir("bin/Release"), srcdir("src/"), outputname(""), - projectname(FileUtils::GetCurrentDirectory()), + projectname(std::filesystem::current_path().filename()), hFile(""), executable(true), shared(true), @@ -161,7 +162,7 @@ void ConfigFileConf::CreateXMLFile(const std::string& filepath) XMLObject makegen("makegen", {}, std::map>{}); // Version, target and configuration is probably going to be used in the future - makegen.AddXMLObject(XMLObject("version", {}, "v1.3.2")); + makegen.AddXMLObject(XMLObject("version", {}, MAKEGEN_VERSION)); makegen.AddXMLObject(XMLObject("target", {}, "Release")); XMLObject configuration("configuration", {{"name", "Release"}}, std::map>{}); diff --git a/src/main.cpp b/src/main.cpp index 6b1a597..adbdf61 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,3 +1,5 @@ +#include + #include #include #include @@ -5,11 +7,11 @@ #include "Common.h" #include "ConfigCLI.h" #include "ConfigFile.h" -#include "FileUtils.h" #include "FlagData.h" #include "HFileGen.h" #include "Makefile.h" #include "Timer.h" +#include "Utils.h" #define RETURN_IF(x, b) \ if (x) \ @@ -182,14 +184,6 @@ bool MakeGen(const std::string& filepath, const FlagData& flagData, ConfigFile& LOG_INFO("Took ", round(timer.Elapsed() * 1000.0) / 1000.0, "s"); LOG_INFO("Running Makefile..."); - std::string outputPath = conf.GetConfigPath() / conf.GetOutputDir(); - if (!FileUtils::HasPath(outputPath)) - { - FileUtils::CreateDirectory(outputPath); - std::string intermediatePath = outputPath + "intermediates"; - if (!FileUtils::HasPath(intermediatePath)) - FileUtils::CreateDirectory(intermediatePath); - } return RunMake(filepath, flagData.flags, conf); } @@ -224,8 +218,6 @@ int Run(int argc, char** argv) return 0; } -#include - int main(int argc, char** argv) { try