// -*- c++ -*- // Distributed under the BSD 2-Clause License. // See accompanying file LICENSE for details. #pragma once #include #include #include enum class TargetType { Auto, // Default - deduce from target name and sources extensions Executable, StaticLibrary, DynamicLibrary, Object, UnitTest, }; 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 sources; // source list std::vector depends; // internal dependencies std::vector cxxflags; // flags for c++ compiler std::vector cflags; // flags for c compiler std::vector ldflags; // flags for linker std::vector asmflags; // flags for asm translator }; using BuildConfigurations = std::vector; 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& configuration(); bool hasConfiguration(const std::string& key); const std::string& getConfiguration(const std::string& key, const std::string& defaultValue = {});