diff options
| author | Bent Bisballe Nyeng <deva@aasimon.org> | 2026-02-07 22:27:05 +0100 |
|---|---|---|
| committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2026-02-07 22:34:49 +0100 |
| commit | c849d9bff18152e83d6e62aa11de2f14fe974488 (patch) | |
| tree | 9dd88a8115f2b097b666848b2b4c8647dbc55bc8 | |
| parent | 668158a83bc9e5af7bf65fe88d22d1958e33443f (diff) | |
Use REG function for configuration, like with build_configurations, to get rid of the hacky weak symbol method.no_more_weak
| -rw-r--r-- | src/configure.cc | 28 | ||||
| -rw-r--r-- | src/ctor.h | 3 | ||||
| -rw-r--r-- | test/source_type_test.cc | 3 | ||||
| -rw-r--r-- | test/tasks_test.cc | 4 |
4 files changed, 33 insertions, 5 deletions
diff --git a/src/configure.cc b/src/configure.cc index 1b8caa6..5ba87c3 100644 --- a/src/configure.cc +++ b/src/configure.cc @@ -10,6 +10,7 @@ #include <optional> #include <span> #include <cstring> +#include <functional> #include "execute.h" #include "ctor.h" @@ -26,8 +27,30 @@ const std::filesystem::path configHeaderFile("config.h"); std::map<std::string, std::string> external_includedir; std::map<std::string, std::string> external_libdir; -const ctor::configuration& __attribute__((weak)) ctor::get_configuration() +std::function<const ctor::configuration&()>& getConfigurationCallback() { + static std::function<const ctor::configuration&()> configuration_callback; + return configuration_callback; +} + +namespace ctor { +int reg(std::function<const ctor::configuration&()> cb, + [[maybe_unused]]const std::source_location location) +{ + auto& configuration_callback = getConfigurationCallback(); + configuration_callback = cb; + return {}; +} +} // ctor:: + +const ctor::configuration& ctor::get_configuration() +{ + auto& configuration_callback = getConfigurationCallback(); + if(configuration_callback) + { + return configuration_callback(); + } + static ctor::configuration cfg; static bool initialised{false}; if(!initialised) @@ -752,7 +775,7 @@ int regenerateCache(ctor::settings& settings, std::cout << "Generating configuration: " << configurationFile.string() << "\n"; { std::stringstream istr; istr << "#include <ctor.h>\n\n"; - istr << "const ctor::configuration& ctor::get_configuration()\n"; + istr << "const ctor::configuration& stored_configuration()\n"; istr << "{\n"; istr << " static ctor::configuration cfg =\n"; istr << " {\n"; @@ -902,6 +925,7 @@ int regenerateCache(ctor::settings& settings, istr << " };\n"; istr << " return cfg;\n"; istr << "}\n"; + istr << "\nREG(stored_configuration);\n"; auto new_configuration = istr.str(); auto current_configuration = readFile(configurationFile.string()); @@ -579,4 +579,7 @@ struct configuration const ctor::configuration& get_configuration(); +int reg(std::function<const ctor::configuration&()> cb, + const std::source_location location = std::source_location::current()); + } // ctor:: diff --git a/test/source_type_test.cc b/test/source_type_test.cc index 90e77cf..345c591 100644 --- a/test/source_type_test.cc +++ b/test/source_type_test.cc @@ -26,13 +26,14 @@ std::ostream& operator<<(std::ostream& stream, const ctor::language& lang) return stream; } -const ctor::configuration& ctor::get_configuration() +const ctor::configuration& test_configuration() { static ctor::configuration cfg{}; cfg.build_toolchain = ctor::toolchain::gcc; cfg.build_arch = ctor::arch::unix; return cfg; } +REG(test_configuration); class TestableTaskCC : public TaskCC diff --git a/test/tasks_test.cc b/test/tasks_test.cc index 32bed5a..c8e4cf8 100644 --- a/test/tasks_test.cc +++ b/test/tasks_test.cc @@ -38,14 +38,14 @@ namespace test_global { ctor::toolchain toolchain{}; ctor::arch arch{}; } -const ctor::configuration& ctor::get_configuration() +const ctor::configuration& test_configuration() { static ctor::configuration cfg{}; cfg.build_toolchain = test_global::toolchain; cfg.build_arch = test_global::arch; return cfg; } - +REG(test_configuration); REG(ctorTestConfigs1); REG(ctorTestConfigs2); |
