diff options
author | dec05eba <dec05eba@protonmail.com> | 2018-09-20 06:37:59 +0200 |
---|---|---|
committer | dec05eba <dec05eba@protonmail.com> | 2020-07-06 07:28:02 +0200 |
commit | b8fd71aa2af110372841a1724471b8bffa4ab254 (patch) | |
tree | e596988b47c58003222b526e72294abb756c2d79 /include | |
parent | 053c4ad0c3807105a53d9ba65e47483a90bfde52 (diff) |
Initial commit, works to create ninja file
Diffstat (limited to 'include')
-rw-r--r-- | include/ninja/Ninja.hpp | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/include/ninja/Ninja.hpp b/include/ninja/Ninja.hpp new file mode 100644 index 0000000..cd9be0a --- /dev/null +++ b/include/ninja/Ninja.hpp @@ -0,0 +1,100 @@ +#pragma once + +#include <string> +#include <unordered_map> +#include <stdexcept> +#include <vector> + +namespace ninja +{ + enum class NinjaError + { + NONE, + VARIABLE_ALREADY_DEFINED, + RULE_ALREADY_DEFINED, + RULE_AREADY_BUILT + }; + + class NinjaException : public std::runtime_error + { + public: + NinjaException(const NinjaError _errorCode, const std::string &errMsg = "") : + std::runtime_error(errMsg), + errorCode(_errorCode) + { + + } + + const NinjaError errorCode; + }; + + struct NinjaVariable + { + const std::string name; + }; + + class NinjaBuildFile; + + class NinjaArg + { + public: + enum class Type + { + NONE, + VALUE, + VARIABLE + }; + + NinjaArg() : type(Type::NONE) {} + NinjaArg(const std::string &value) : type(Type::VALUE), arg(value) {} + NinjaArg(const NinjaVariable &var) : type(Type::VARIABLE), arg(var.name) {} + + Type type; + std::string arg; + }; + + struct NinjaArgValue + { + const NinjaVariable arg; + const std::string value; + }; + + // Functions throw NinjaException on failure + class NinjaRule + { + public: + NinjaRule(NinjaBuildFile *buildFile, const std::string &name, const std::string &command); + void build(const std::string &in, const std::string &out, const std::vector<ninja::NinjaArgValue> &additionalArgs); + + const std::string name; + const std::string command; + std::string depFile; + private: + NinjaBuildFile *buildFile; + }; + + struct NinjaBuild + { + const NinjaRule *rule; + const std::string in; + const std::string out; + const std::vector<ninja::NinjaArgValue> additionalArgs; + }; + + // Functions throw NinjaException on failure + class NinjaBuildFile + { + public: + ~NinjaBuildFile(); + + void defineGlobalVariable(const std::string &name, const std::string &value); + NinjaRule* createRule(const std::string &name, const std::vector<NinjaArg> &commandArgs); + void build(const NinjaRule *rule, const std::string &in, const std::string &out, const std::vector<ninja::NinjaArgValue> &additionalArgs); + + std::string generate() const; + private: + std::unordered_map<std::string, std::string> globalVariables; + std::unordered_map<std::string, NinjaRule*> rules; + std::vector<NinjaBuild> builds; + }; +}
\ No newline at end of file |