From 871a0a3fe8be12f51e0a01ed5ae7d5ad6a671b96 Mon Sep 17 00:00:00 2001 From: Armin Luntzer <armin.luntzer@univie.ac.at> Date: Mon, 3 Jun 2019 14:24:56 +0200 Subject: [PATCH] * more cross-platform build work * more search paths for config/plugin files --- autogen.sh | 7 ++-- configure.ac | 13 ++++-- src/server/Makefile.am | 9 ++--- src/server/backend.c | 13 +++++- src/server/backends/SIM/Makefile.am | 62 ++++++++++++++++++++++------- src/server/cfg.c | 12 ++++++ 6 files changed, 88 insertions(+), 28 deletions(-) diff --git a/autogen.sh b/autogen.sh index 0265b36..b4aa34c 100755 --- a/autogen.sh +++ b/autogen.sh @@ -2,10 +2,11 @@ touch NEWS if [[ $(uname) == "Darwin" ]]; then - glibtoolize -else - libtoolize + glibtoolize +elif [[ $(uname) != "MINGW"* ]]; then + libtoolize fi + aclocal autoconf automake --add-missing diff --git a/configure.ac b/configure.ac index 08ff4b7..08d16aa 100644 --- a/configure.ac +++ b/configure.ac @@ -1,8 +1,6 @@ -AC_INIT([radtel], [0.1], [armin.luntzer@univie.ac.at], []) +AC_INIT([radtel], [0.0.1], [armin.luntzer@univie.ac.at], []) AM_INIT_AUTOMAKE([subdir-objects foreign dist-xz]) -LT_INIT([dlopen]) - AC_PROG_CC AC_CONFIG_MACRO_DIRS([m4]) @@ -23,9 +21,18 @@ case "${host_os}" in ;; esac +dnl libootl sucks on windows (for our purpose), so we'll build +dnl plugin dlls ourselves +test x$IS_WINDOWS != xtrue && LT_INIT([dlopen]) +test x$IS_WINDOWS = xtrue && AC_PROG_RANLIB + + AM_CONDITIONAL([OS_WINDOWS], [test x$IS_WINDOWS = xtrue]) AM_CONDITIONAL([OS_DARWIN], [test x$IS_DARWIN = xtrue]) + + + AC_PATH_PROG(GLIB_COMPILE_RESOURCES, glib-compile-resources) GLIB_GSETTINGS diff --git a/src/server/Makefile.am b/src/server/Makefile.am index 8c3399a..a0f45d7 100644 --- a/src/server/Makefile.am +++ b/src/server/Makefile.am @@ -30,11 +30,10 @@ radtelsrv_LDADD += -L$(top_builddir)/src/server/api -lbackend radtelsrv_LDFLAGS := $(radtel_LIBS) radtelsrv_LDFLAGS += -lm -# do we need this? -#if OS_WINDOWS -#radtelsrv_LDFLAGS += -Wl,--out-implib,libhost.a -#radtelsrv_LDFLAGS += -Wl,--export-all-symbols -#endif +if OS_WINDOWS +radtelsrv_LDFLAGS += -Wl,--out-implib,libhost.a +radtelsrv_LDFLAGS += -Wl,--export-all-symbols +endif diff --git a/src/server/backend.c b/src/server/backend.c index 3f1deff..112c1f4 100644 --- a/src/server/backend.c +++ b/src/server/backend.c @@ -66,11 +66,11 @@ static int backend_load_module_from_prefix(const gchar *plugin_path) void (*mod_init)(void); - + g_message("Will try to load plugin from %s", plugin_path); mod = g_module_open(plugin_path, G_MODULE_BIND_LAZY); if(!mod) { - g_debug("Unable to load plugin %s: %s", plugin_path, + g_warning("Unable to load plugin %s: %s", plugin_path, g_module_error()); return -1; } @@ -117,6 +117,15 @@ static int backend_load_module(const gchar *plugin_path) return 0; + /* try again in lib/plugdir */ + plug = g_strconcat("lib/", PLUGDIR, "/", plugin_path, NULL); + ret = backend_load_module_from_prefix(plug); + g_free(plug); + + if (!ret) + return 0; + + /* try again in system lib dir/plugdir */ plug = g_strconcat(LIBDIR, "/", PLUGDIR, "/", plugin_path, NULL); ret = backend_load_module_from_prefix(plug); diff --git a/src/server/backends/SIM/Makefile.am b/src/server/backends/SIM/Makefile.am index 72e7478..195b5fb 100644 --- a/src/server/backends/SIM/Makefile.am +++ b/src/server/backends/SIM/Makefile.am @@ -8,8 +8,8 @@ pluginconfdir = $(sysconfdir)/$(confdir)/backends pluginconf_DATA = $(top_builddir)/src/server/config/backends/rt_sim.cfg -AM_CPPFLAGS := \-DCONFDIR=\"$(confdir)\" \ - \-DSYSCONFDIR=\"$(sysconfdir)\" +AM_CPPFLAGS := -DCONFDIR=\"$(confdir)\" \ + -DSYSCONFDIR=\"$(sysconfdir)\" AM_CFLAGS := $(GMODULE_CFLAGS) @@ -25,22 +25,54 @@ if !OS_DARWIN AM_CFLAGS += -fopenmp endif +if !OS_WINDOWS +#plugin_LTLIBRARIES = rt_sim.la +#rt_sim_la_LDFLAGS := -avoid-version +#rt_sim_la_LDFLAGS += -module +#rt_sim_la_LDFLAGS += -shared +#rt_sim_la_LDFLAGS += -export-dynamic +# +#rt_sim_la_LIBADD := -L$(top_builddir)/src/net/ -lproto +#rt_sim_la_LIBADD += -L$(top_builddir)/src/util/ -lutil +#rt_sim_la_LIBADD += $(GMODULE_LIBS) +#rt_sim_la_LIBADD += $(GTHREAD_LIBS) +#rt_sim_la_LIBADD += $(GLIB_LIBS) +#rt_sim_la_LIBADD += $(GTK3_LIBS) +#rt_sim_la_LIBADD += $(GIO_LIBS) +# +#rt_sim_la_SOURCES = rt_sim.c -plugin_LTLIBRARIES = rt_sim.la +else -rt_sim_la_LDFLAGS := -avoid-version -rt_sim_la_LDFLAGS += -module -rt_sim_la_LDFLAGS += -shared -rt_sim_la_LDFLAGS += -export-dynamic +# libtool stinks on windows. Rather, windows dlls stink +# I'll build my own! With Black Jack! And hookers! -rt_sim_la_LIBADD := -L$(top_builddir)/src/net/ -lproto -rt_sim_la_LIBADD += -L$(top_builddir)/src/util/ -lutil -rt_sim_la_LIBADD += $(GMODULE_LIBS) -rt_sim_la_LIBADD += $(GTHREAD_LIBS) -rt_sim_la_LIBADD += $(GLIB_LIBS) -rt_sim_la_LIBADD += $(GTK3_LIBS) -rt_sim_la_LIBADD += $(GIO_LIBS) +all: rt_sim.dll + +SUFFIXES = .dll +CLEANFILES = *.dll + +AM_CFLAGS += -Wl,-no-undefined +AM_CFLAGS += -Wl,--unresolved-symbols=ignore-all +AM_CFLAGS += -Wl,--enable-runtime-pseudo-reloc +AM_CFLAGS += -shared +AM_CFLAGS += -fPIC + +AM_LDFLAGS := -L$(top_builddir)/src/net/ -lproto +AM_LDFLAGS += -L$(top_builddir)/src/util/ -lutil +AM_LDFLAGS += $(GMODULE_LIBS) +AM_LDFLAGS += $(GTHREAD_LIBS) +AM_LDFLAGS += $(GLIB_LIBS) +AM_LDFLAGS += $(GTK3_LIBS) +AM_LDFLAGS += $(GIO_LIBS) +AM_LDFLAGS += -L$(top_builddir)/src/server -lhost + + +plugin_DATA = $(top_builddir)/src/server/backends/SIM/rt_sim.dll + +%.dll: %.c + $(CC) $(AM_CPPFLAGS) $(AM_CFLAGS) -I $(top_srcdir)/include -o $@ $< $(AM_LDFLAGS) +endif -rt_sim_la_SOURCES = rt_sim.c diff --git a/src/server/cfg.c b/src/server/cfg.c index 9743ecd..c457a83 100644 --- a/src/server/cfg.c +++ b/src/server/cfg.c @@ -187,10 +187,14 @@ static int server_load_config_from_prefix(const gchar *prefix, GError **err) gchar *cfg; + kf = g_key_file_new(); flags = G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS; cfg = g_strconcat(prefix, "server.cfg", NULL); + + g_message("Will try to load config from %s", cfg); + ret = g_key_file_load_from_file(kf, cfg, flags, err); @@ -240,6 +244,14 @@ int server_cfg_load(void) g_free(prefix); } + if (ret) { + g_clear_error(&error); + /* try again in confdir */ + prefix = g_strconcat("etc/", CONFDIR, "/", NULL); + ret = server_load_config_from_prefix(prefix, &error); + g_free(prefix); + } + if (ret) { g_clear_error(&error); /* try again in sysconfdir */ -- GitLab