diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2013-03-18 14:23:23 +0800 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2013-04-29 14:41:04 +1000 |
commit | 45e92aa32a80fdbbf5ad3ad64e34b1ac872018ef (patch) | |
tree | 2753fb3912c07d23f3e2f622c05043f55c8f24c9 /discover/parser-utils.h | |
parent | 5444648fe1ff9b79f3db5ee6feadd51341f59d71 (diff) | |
download | talos-petitboot-45e92aa32a80fdbbf5ad3ad64e34b1ac872018ef.tar.gz talos-petitboot-45e92aa32a80fdbbf5ad3ad64e34b1ac872018ef.zip |
parsers: dynamically register parsers
Currently, we require all parsers to be defined in an array in
parsers.c.
This change removes this requirement, by introducting a
register_parser() macro, which adds a constructor to register the parser
with the core parser infrastructure.
Because each parser no longer resolves an undefined symbol, we need to
use a `ld -r` object for libparser, instead of using libtool, which
creates a .a (and hence has no parsers included).
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'discover/parser-utils.h')
-rw-r--r-- | discover/parser-utils.h | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/discover/parser-utils.h b/discover/parser-utils.h index 107f4f3..9096b31 100644 --- a/discover/parser-utils.h +++ b/discover/parser-utils.h @@ -8,12 +8,17 @@ #define artwork_pathname(file) (PKG_SHARE_DIR "/artwork/" file) -#define define_parser(__name, __parse_fn) \ - struct parser \ - __ ## __name ## _parser = { \ - .name = #__name, \ - .parse = __parse_fn, \ - }; +#define __parser_funcname(_n) __register_parser ## _ ## _n +#define _parser_funcname(_n) __parser_funcname(_n) + +#define register_parser(_parser) \ + static __attribute__((constructor)) \ + void _parser_funcname(__COUNTER__)(void) \ + { \ + __register_parser(&_parser); \ + } + +void __register_parser(struct parser *parser); void device_add_boot_option(struct device *device, struct boot_option *boot_option); |