Mod API: Move dylibs to libs/{platform}; services import latest minor versions

This commit is contained in:
Luke Street
2026-07-13 13:10:39 -06:00
parent cdb36e9c42
commit 700bbf0a5a
19 changed files with 304 additions and 93 deletions
+5 -2
View File
@@ -176,6 +176,8 @@ struct LoadedMod {
uint32_t cacheGeneration = 0;
// Currently extracted native library, empty if none.
std::string nativePath;
// Read-only directory containing the current platform's main module and runtime libraries.
std::string nativeDir;
NativeModStatus nativeStatus = NativeModStatus::None;
std::unique_ptr<NativeMod> native;
@@ -225,7 +227,7 @@ private:
// the next tick, by which point every per-frame entry into the mod should have returned.
struct RetiredNative {
std::unique_ptr<NativeMod> native;
std::string path;
std::string directory;
};
std::vector<std::unique_ptr<LoadedMod>> m_mods;
@@ -238,7 +240,8 @@ private:
bool m_startupComplete = false;
void try_load_mod(const std::filesystem::path& modPath, bool fromDir, uint32_t searchDirIndex);
void load_native(LoadedMod& mod, const std::string& dllEntry);
void load_native(LoadedMod& mod, const std::string& dllEntry,
const std::vector<std::string>& runtimeEntries);
// Resolved <nativeLibDir>/<mod id><ext> if it exists on disk, empty otherwise.
[[nodiscard]] std::filesystem::path external_native_lib_path(const LoadedMod& mod) const;
void unload_native(LoadedMod& mod);
+1 -1
View File
@@ -23,7 +23,7 @@ extern "C" {
#define MOD_EXTERN_C
#endif
#define MOD_ABI_VERSION 6u
#define MOD_ABI_VERSION 1u
#define MOD_ERROR_MESSAGE_SIZE 512u
typedef struct ModContext ModContext;
+7 -3
View File
@@ -42,7 +42,8 @@ inline ModResult set_error(ModError* outError, ModResult code, const char* messa
// Declares `static const service_type* variable`, filled in by the host before mod_initialize.
// Required imports are guaranteed non-null (the mod fails to load otherwise); optional imports
// must be checked against nullptr before use.
// must be checked against nullptr before use. The unversioned macros use the latest minor version;
// set an explicit version to target an older minor version for backwards compatibility.
#define IMPORT_SERVICE_EX( \
service_type, variable, service_id_value, major_value, min_minor_value, flags_value) \
static const service_type* variable = nullptr; \
@@ -59,7 +60,9 @@ inline ModResult set_error(ModError* outError, ModResult code, const char* messa
::dusk::mods::ServiceTraits<service_type>::major_version, min_minor_value, \
SERVICE_IMPORT_REQUIRED)
#define IMPORT_SERVICE(service_type, variable) IMPORT_SERVICE_VERSION(service_type, variable, 0)
#define IMPORT_SERVICE(service_type, variable) \
IMPORT_SERVICE_VERSION( \
service_type, variable, ::dusk::mods::ServiceTraits<service_type>::minor_version)
#define IMPORT_OPTIONAL_SERVICE_VERSION(service_type, variable, min_minor_value) \
IMPORT_SERVICE_EX(service_type, variable, ::dusk::mods::ServiceTraits<service_type>::id, \
@@ -67,7 +70,8 @@ inline ModResult set_error(ModError* outError, ModResult code, const char* messa
SERVICE_IMPORT_OPTIONAL)
#define IMPORT_OPTIONAL_SERVICE(service_type, variable) \
IMPORT_OPTIONAL_SERVICE_VERSION(service_type, variable, 0)
IMPORT_OPTIONAL_SERVICE_VERSION( \
service_type, variable, ::dusk::mods::ServiceTraits<service_type>::minor_version)
#define EXPORT_SERVICE_AS(instance, service_id_value) \
MOD_META_RECORD static constinit ModMetaExport mod_meta_export_##instance = { \
+1
View File
@@ -60,5 +60,6 @@ template <>
struct dusk::mods::ServiceTraits<CameraService> {
static constexpr const char* id = CAMERA_SERVICE_ID;
static constexpr uint16_t major_version = CAMERA_SERVICE_MAJOR;
static constexpr uint16_t minor_version = CAMERA_SERVICE_MINOR;
};
#endif
+1
View File
@@ -103,5 +103,6 @@ template <>
struct dusk::mods::ServiceTraits<ConfigService> {
static constexpr const char* id = CONFIG_SERVICE_ID;
static constexpr uint16_t major_version = CONFIG_SERVICE_MAJOR;
static constexpr uint16_t minor_version = CONFIG_SERVICE_MINOR;
};
#endif
+1
View File
@@ -26,5 +26,6 @@ template <>
struct dusk::mods::ServiceTraits<GameService> {
static constexpr const char* id = GAME_SERVICE_ID;
static constexpr uint16_t major_version = GAME_SERVICE_MAJOR;
static constexpr uint16_t minor_version = GAME_SERVICE_MINOR;
};
#endif
+1
View File
@@ -205,5 +205,6 @@ template <>
struct dusk::mods::ServiceTraits<GfxService> {
static constexpr const char* id = GFX_SERVICE_ID;
static constexpr uint16_t major_version = GFX_SERVICE_MAJOR;
static constexpr uint16_t minor_version = GFX_SERVICE_MINOR;
};
#endif
+1
View File
@@ -121,5 +121,6 @@ template <>
struct dusk::mods::ServiceTraits<HookService> {
static constexpr const char* id = HOOK_SERVICE_ID;
static constexpr uint16_t major_version = HOOK_SERVICE_MAJOR;
static constexpr uint16_t minor_version = HOOK_SERVICE_MINOR;
};
#endif
+12 -1
View File
@@ -9,7 +9,7 @@
#define HOST_SERVICE_ID "dev.twilitrealm.dusklight.host"
#define HOST_SERVICE_MAJOR 2u
#define HOST_SERVICE_MINOR 0u
#define HOST_SERVICE_MINOR 1u
/*
* Ignore unknown values: later service minors may add events.
@@ -91,6 +91,16 @@ typedef struct HostService {
ModResult (*watch_mod_lifecycle)(
ModContext* ctx, ModLifecycleFn fn, void* user_data, uint64_t* out_handle);
ModResult (*unwatch_mod_lifecycle)(ModContext* ctx, uint64_t handle);
/*
* Read-only directory containing this platform's packaged native runtime: the mod module
* and any RUNTIME_LIBRARIES. The path is absolute and remains valid until mod_shutdown
* returns. Libraries loaded dynamically from here are owned by the mod and must be unloaded
* during mod_shutdown.
*
* Added in minor version 1.
*/
const char* (*native_dir)(ModContext* ctx);
} HostService;
#ifdef __cplusplus
@@ -100,5 +110,6 @@ template <>
struct dusk::mods::ServiceTraits<HostService> {
static constexpr const char* id = HOST_SERVICE_ID;
static constexpr uint16_t major_version = HOST_SERVICE_MAJOR;
static constexpr uint16_t minor_version = HOST_SERVICE_MINOR;
};
#endif
+1
View File
@@ -43,5 +43,6 @@ template <>
struct dusk::mods::ServiceTraits<LogService> {
static constexpr const char* id = LOG_SERVICE_ID;
static constexpr uint16_t major_version = LOG_SERVICE_MAJOR;
static constexpr uint16_t minor_version = LOG_SERVICE_MINOR;
};
#endif
+1
View File
@@ -53,5 +53,6 @@ template <>
struct dusk::mods::ServiceTraits<OverlayService> {
static constexpr const char* id = OVERLAY_SERVICE_ID;
static constexpr uint16_t major_version = OVERLAY_SERVICE_MAJOR;
static constexpr uint16_t minor_version = OVERLAY_SERVICE_MINOR;
};
#endif
+1
View File
@@ -48,5 +48,6 @@ template <>
struct dusk::mods::ServiceTraits<ResourceService> {
static constexpr const char* id = RESOURCE_SERVICE_ID;
static constexpr uint16_t major_version = RESOURCE_SERVICE_MAJOR;
static constexpr uint16_t minor_version = RESOURCE_SERVICE_MINOR;
};
#endif
+1
View File
@@ -84,5 +84,6 @@ template <>
struct dusk::mods::ServiceTraits<TextureService> {
static constexpr const char* id = TEXTURE_SERVICE_ID;
static constexpr uint16_t major_version = TEXTURE_SERVICE_MAJOR;
static constexpr uint16_t minor_version = TEXTURE_SERVICE_MINOR;
};
#endif
+1
View File
@@ -280,5 +280,6 @@ template <>
struct dusk::mods::ServiceTraits<UiService> {
static constexpr const char* id = UI_SERVICE_ID;
static constexpr uint16_t major_version = UI_SERVICE_MAJOR;
static constexpr uint16_t minor_version = UI_SERVICE_MINOR;
};
#endif