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>
-DPKG_SHARE_DIR='"$(pkgdatadir)"' \
-DLOCAL_STATE_DIR='"$(localstatedir)"'
-DPKG_SHARE_DIR='"$(pkgdatadir)"' \
-DLOCAL_STATE_DIR='"$(localstatedir)"'
-noinst_LTLIBRARIES = libparser.la
+noinst_LIBRARIES = libparser.o
-libparser_la_SOURCES = \
parser.c \
parser.h \
parser-conf.c \
parser-conf.h \
parser.c \
parser.h \
parser-conf.c \
parser-conf.h \
- parser-utils.c \
- parser-utils.h \
paths.c \
paths.h \
resource.c \
paths.c \
paths.h \
resource.c \
grub2-parser.c \
yaboot-parser.c
grub2-parser.c \
yaboot-parser.c
-EXTRA_DIST = native-parser.c
+libparser.o: $(libparser_o_OBJECTS)
+ $(LD) -r -o $@ $^
-libparser_la_LIBADD = $(top_builddir)/lib/libpbcore.la
+EXTRA_DIST = native-parser.c
sbin_PROGRAMS = pb-discover
sbin_PROGRAMS = pb-discover
event-parser.c \
params.c \
params.h \
event-parser.c \
params.c \
params.h \
+ parser-utils.c \
+ parser-utils.h \
pb-discover.c \
pb-discover.h \
udev.c \
pb-discover.c \
pb-discover.h \
udev.c \
user-event.c \
user-event.h
user-event.c \
user-event.h
-pb_discover_LDADD = libparser.la $(top_builddir)/lib/libpbcore.la
+pb_discover_LDADD = libparser.o $(top_builddir)/lib/libpbcore.la
MAINTAINERCLEANFILES = Makefile.in
MAINTAINERCLEANFILES = Makefile.in
-struct parser __grub2_parser = {
+static struct parser grub2_parser = {
.name = "grub2",
.parse = grub2_parse,
.filenames = grub2_conf_files,
};
.name = "grub2",
.parse = grub2_parse,
.filenames = grub2_conf_files,
};
+
+register_parser(grub2_parser);
-struct parser __kboot_parser = {
+static struct parser kboot_parser = {
.name = "kboot",
.parse = kboot_parse,
.filenames = kboot_conf_files,
.resolve_resource = resolve_devpath_resource,
};
.name = "kboot",
.parse = kboot_parse,
.filenames = kboot_conf_files,
.resolve_resource = resolve_devpath_resource,
};
+
+register_parser(kboot_parser);
#define artwork_pathname(file) (PKG_SHARE_DIR "/artwork/" file)
#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);
void device_add_boot_option(struct device *device,
struct boot_option *boot_option);
#include "parser-utils.h"
#include "paths.h"
#include "parser-utils.h"
#include "paths.h"
-struct parser __grub2_parser;
-struct parser __kboot_parser;
-struct parser __native_parser;
-struct parser __yaboot_parser;
-
-static struct parser *const parsers[] = {
-// &__native_parser,
- &__kboot_parser,
- &__grub2_parser,
- &__yaboot_parser,
- NULL
-};
+static int n_parsers;
+static struct parser **parsers;
static const int max_file_size = 1024 * 1024;
static const int max_file_size = 1024 * 1024;
pb_log("trying parsers for %s\n", ctx->device->device->id);
pb_log("trying parsers for %s\n", ctx->device->device->id);
- for (i = 0; parsers[i]; i++) {
+ for (i = 0; i < n_parsers; i++) {
pb_log("\ttrying parser '%s'\n", parsers[i]->name);
ctx->parser = parsers[i];
iterate_parser_files(ctx, parsers[i]);
pb_log("\ttrying parser '%s'\n", parsers[i]->name);
ctx->parser = parsers[i];
iterate_parser_files(ctx, parsers[i]);
+void __register_parser(struct parser *parser)
+{
+ parsers = talloc_realloc(NULL, parsers, struct parser *, n_parsers + 1);
+ parsers[n_parsers] = parser;
+ n_parsers++;
+}
+
void parser_init(void)
{
}
void parser_init(void)
{
}
-struct parser __yaboot_parser = {
+static struct parser yaboot_parser = {
.name = "yaboot",
.parse = yaboot_parse,
.filenames = yaboot_conf_files,
};
.name = "yaboot",
.parse = yaboot_parse,
.filenames = yaboot_conf_files,
};
+
+register_parser(yaboot_parser);
common_libs = \
$(top_builddir)/lib/libpbcore.la \
common_libs = \
$(top_builddir)/lib/libpbcore.la \
- $(top_builddir)/discover/libparser.la
+ $(top_builddir)/discover/libparser.o
noinst_PROGRAMS = parser-test
noinst_PROGRAMS = parser-test