summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2026-02-07 22:27:05 +0100
committerBent Bisballe Nyeng <deva@aasimon.org>2026-02-07 22:34:49 +0100
commitc849d9bff18152e83d6e62aa11de2f14fe974488 (patch)
tree9dd88a8115f2b097b666848b2b4c8647dbc55bc8 /src
parent668158a83bc9e5af7bf65fe88d22d1958e33443f (diff)
Use REG function for configuration, like with build_configurations, to get rid of the hacky weak symbol method.no_more_weak
Diffstat (limited to 'src')
-rw-r--r--src/configure.cc28
-rw-r--r--src/ctor.h3
2 files changed, 29 insertions, 2 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());
diff --git a/src/ctor.h b/src/ctor.h
index 890c257..8a7c809 100644
--- a/src/ctor.h
+++ b/src/ctor.h
@@ -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::