summaryrefslogtreecommitdiff
path: root/src/libctor.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libctor.h')
-rw-r--r--src/libctor.h93
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 = {});