diff options
author | Bent Bisballe Nyeng <deva@aasimon.org> | 2021-09-02 20:22:58 +0200 |
---|---|---|
committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2021-09-02 20:23:41 +0200 |
commit | 5529b296834965afd9736b941aa2c094ff2f4648 (patch) | |
tree | f2811d12f6967ba89610cb9eb92d237c29ec163b /src/libctor.h | |
parent | 77582c4c6804dade46cc7bf991f48b00e1391eff (diff) |
Rename project to ctor.
Diffstat (limited to 'src/libctor.h')
-rw-r--r-- | src/libctor.h | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/libctor.h b/src/libctor.h new file mode 100644 index 0000000..d0a0080 --- /dev/null +++ b/src/libctor.h @@ -0,0 +1,76 @@ +// -*- c++ -*- +#pragma once + +#include <string> +#include <vector> +#include <map> + +enum class TargetType +{ + Auto, // Default - deduce from target name and sources extensions + + Executable, + StaticLibrary, + DynamicLibrary, + Object, +}; + +enum class Language +{ + Auto, // Default - deduce language from source extensions + + C, + Cpp, + Asm, +}; + +enum class OutputSystem +{ + Host, // Output for the target system + Build, // Internal tool during cross-compilation +}; + +struct BuildConfiguration +{ + TargetType type{TargetType::Auto}; + 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::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 +}; + +using BuildConfigurations = std::vector<BuildConfiguration>; + +int reg(const char* location, BuildConfigurations (*cb)()); + +// 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); } + +// Predefined configuration keys +namespace cfg +{ +constexpr auto builddir = "builddir"; + +constexpr auto host_cc = "host-cc"; +constexpr auto host_cxx = "host-cpp"; +constexpr auto host_ar = "host-ar"; +constexpr auto host_ld = "host-ld"; + +constexpr auto build_cc = "build-cc"; +constexpr auto build_cxx = "build-cpp"; +constexpr auto build_ar = "build-ar"; +constexpr auto build_ld = "build-ld"; +} + +const std::map<std::string, std::string>& configuration(); +bool hasConfiguration(const std::string& key); +const std::string& getConfiguration(const std::string& key, + const std::string& defaultValue = {}); |