39 lines
1.1 KiB
C
39 lines
1.1 KiB
C
#pragma once
|
|
#include <zinnia/compiler.h>
|
|
#include <zinnia/errno.h>
|
|
#include <zinnia/utils.h>
|
|
#include <stdint.h>
|
|
|
|
#define MODULE_PROPERTY(name, data) \
|
|
[[__used, __section(".mod." name)]] \
|
|
static const char UNIQUE_IDENT(_name)[] = data
|
|
|
|
#define MODULE_AUTHOR(author) MODULE_PROPERTY("author", author)
|
|
#define MODULE_DESC(desc) MODULE_PROPERTY("desc", desc)
|
|
#define MODULE_VERSION(version) MODULE_PROPERTY("version", version)
|
|
#define MODULE_LICENSE(license) MODULE_PROPERTY("license", license)
|
|
|
|
#define MODULE_ENTRY(func) \
|
|
[[__used]] \
|
|
errno_t __module_entry(struct module* __module) { \
|
|
return func(__module); \
|
|
} \
|
|
[[__used, __section(".mod.entry")]] \
|
|
static const void* __entry_fn = &__module_entry
|
|
|
|
#define MODULE_EXIT(func) \
|
|
[[__used]] \
|
|
errno_t __module_exit(struct module* __module) { \
|
|
return func(__module); \
|
|
} \
|
|
[[__used, __section(".mod.exit")]] \
|
|
static const void* __exit_fn = &__module_exit
|
|
|
|
struct module {
|
|
const char* name;
|
|
};
|
|
|
|
#define THIS_MODULE (struct module*)nullptr
|
|
|
|
void module_init();
|