diff options
Diffstat (limited to 'src/libctor.h')
-rw-r--r-- | src/libctor.h | 93 |
1 files changed, 84 insertions, 9 deletions
diff --git a/src/libctor.h b/src/libctor.h index 70c62a8..96e1115 100644 --- a/src/libctor.h +++ b/src/libctor.h @@ -3,9 +3,13 @@ // See accompanying file LICENSE for details. #pragma once +#include <source_location> #include <string> #include <vector> #include <map> +#include <variant> +#include <cstddef> +#include <functional> enum class TargetType { @@ -16,6 +20,8 @@ enum class TargetType DynamicLibrary, Object, UnitTest, + UnitTestLib, + Function, }; enum class Language @@ -33,29 +39,86 @@ enum class OutputSystem Build, // Internal tool during cross-compilation }; -struct BuildConfiguration +struct Source { - TargetType type{TargetType::Auto}; + Source(const char* file) : file(file) {} + Source(const std::string& file) : file(file) {} + Source(const char* file, Language lang) : file(file), language(lang) {} + Source(const std::string& file, Language lang) : file(file), language(lang) {} + + Source(const char* file, const char* output) : file(file), output(output) {} + Source(const std::string& file, const std::string& output) : file(file), output(output) {} + Source(const char* file, Language lang, const char* output) : file(file), language(lang), output(output) {} + Source(const std::string& file, Language lang, const std::string& output) : file(file), language(lang), output(output) {} + + std::string file; Language language{Language::Auto}; - OutputSystem system{OutputSystem::Host}; - std::string target; - std::vector<std::string> sources; // source list - std::vector<std::string> depends; // internal dependencies + std::string output{}; +}; + +struct Flags +{ std::vector<std::string> cxxflags; // flags for c++ compiler std::vector<std::string> cflags; // flags for c compiler std::vector<std::string> ldflags; // flags for linker std::vector<std::string> asmflags; // flags for asm translator }; +struct Settings +{ + std::string builddir{"build"}; + std::size_t parallel_processes{1}; + int verbose{0}; // -1: completely silent, 0: normal, 1: verbose, ... +}; + +struct BuildConfiguration; +using GeneratorCb = std::function<int(const std::string& input, + const std::string& output, + const BuildConfiguration& config, + const Settings& settings)>; + +struct BuildConfiguration +{ + std::string name; // Name - used for referring in other configurations. + TargetType type{TargetType::Auto}; + OutputSystem system{OutputSystem::Host}; + std::string target; // Output target file for this configuration + std::vector<Source> sources; // source list + std::vector<std::string> depends; // internal target dependencies + Flags flags; + std::vector<std::string> externals; // externals used by this configuration + GeneratorCb function; +}; + using BuildConfigurations = std::vector<BuildConfiguration>; -int reg(const char* location, BuildConfigurations (*cb)()); +int reg(BuildConfigurations (*cb)(const Settings&), + const std::source_location location = std::source_location::current()); + +// This type will use flags verbatim +struct ExternalManual +{ + Flags flags; +}; + + +struct ExternalConfiguration +{ + std::string name; // Name for configuration + OutputSystem system{OutputSystem::Host}; + std::variant<ExternalManual> external; +}; + +using ExternalConfigurations = std::vector<ExternalConfiguration>; + +int reg(ExternalConfigurations (*cb)(const Settings&), + const std::source_location location = std::source_location::current()); // Convenience macro - ugly but keeps things simple(r) #define CONCAT(a, b) CONCAT_INNER(a, b) #define CONCAT_INNER(a, b) a ## b #define UNIQUE_NAME(base) CONCAT(base, __LINE__) -#define REG(cb) namespace { int UNIQUE_NAME(unique) = reg(__FILE__, cb); } +#define REG(cb) namespace { int UNIQUE_NAME(unique) = reg(cb); } // Predefined configuration keys namespace cfg @@ -71,9 +134,21 @@ constexpr auto build_cc = "build-cc"; constexpr auto build_cxx = "build-cpp"; constexpr auto build_ar = "build-ar"; constexpr auto build_ld = "build-ld"; + +constexpr auto ctor_includedir = "ctor-includedir"; +constexpr auto ctor_libdir = "ctor-libdir"; } -const std::map<std::string, std::string>& configuration(); +struct Configuration +{ + std::vector<std::string> args; // vector of arguments used when last calling configure + std::map<std::string, std::string> env; // env used when last calling configure + + std::map<std::string, std::string> tools; // tools + std::map<std::string, Flags> externals; +}; + +const Configuration& configuration(); bool hasConfiguration(const std::string& key); const std::string& getConfiguration(const std::string& key, const std::string& defaultValue = {}); |