-DPKG_SHARE_DIR='"$(pkgdatadir)"' \
-DLOCAL_STATE_DIR='"$(localstatedir)"'
-noinst_LTLIBRARIES = libparser.la
+noinst_LIBRARIES = libparser.o
-libparser_la_SOURCES = \
+libparser_o_SOURCES = \
parser.c \
parser.h \
parser-conf.c \
parser-conf.h \
- parser-utils.c \
- parser-utils.h \
paths.c \
paths.h \
resource.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
event-parser.c \
params.c \
params.h \
+ parser-utils.c \
+ parser-utils.h \
pb-discover.c \
pb-discover.h \
udev.c \
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
return 1;
}
-struct parser __grub2_parser = {
+static struct parser grub2_parser = {
.name = "grub2",
.parse = grub2_parse,
.filenames = grub2_conf_files,
};
+
+register_parser(grub2_parser);
return 1;
}
-struct parser __kboot_parser = {
+static struct parser kboot_parser = {
.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 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);
#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;
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]);
ctx->parser = NULL;
}
+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)
{
}
return 1;
}
-struct parser __yaboot_parser = {
+static struct parser yaboot_parser = {
.name = "yaboot",
.parse = yaboot_parse,
.filenames = yaboot_conf_files,
};
+
+register_parser(yaboot_parser);
common_libs = \
$(top_builddir)/lib/libpbcore.la \
- $(top_builddir)/discover/libparser.la
+ $(top_builddir)/discover/libparser.o
noinst_PROGRAMS = parser-test