meson: add test-libsystemd-sym, fix linking of libsystemd
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 10 Apr 2017 18:13:40 +0000 (14:13 -0400)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 24 Apr 2017 01:47:27 +0000 (21:47 -0400)
This is quite messy. I think libtool might have been using something
like -Wl,--whole-archive, but I don't think meson has support for that.
For now, just recompile all the sources for linking into libsystemd
directly. This should not matter much for efficiency, since it's a
few small files.

meson.build
src/systemd/meson.build
src/test/generate-sym-test.py [new file with mode: 0755]
src/test/meson.build

index 6d2ecc8..83231c9 100644 (file)
@@ -967,18 +967,20 @@ libjournal_core = static_library(
                  libsystemd_journal_internal],
     install : false)
 
-version_script_arg = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
+libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
 libsystemd = shared_library(
     'systemd',
     libsystemd_internal_sources,
+    libsystemd_journal_internal_sources,
     version : '0.18.0',
     include_directories : includes,
     link_args : ['-shared',
-                 '-Wl,--version-script=' + version_script_arg],
-    link_with : [libbasic,
-                 libsystemd_internal,
-                 libsystemd_journal_internal],
-    dependencies : [threads],
+                 '-Wl,--version-script=' + libsystemd_sym_path],
+    link_with : [libbasic],
+    dependencies : [threads,
+                    librt,
+                    libxz,
+                    liblz4],
     link_depends : libsystemd_sym,
     install : true,
     install_dir : rootlibdir)
@@ -1932,6 +1934,20 @@ foreach tuple : tests
   endif
 endforeach
 
+test_libsystemd_sym = executable(
+  'test-libsystemd-sym',
+  test_libsystemd_sym_c,
+  include_directories : includes,
+  # link_with : [libsystemd],
+  # TODO: try again with https://github.com/mesonbuild/meson/pull/1545
+  link_args : ['libsystemd.so.0.18.0'],
+  # link_depends : [libsystemd],
+  # TODO: try again after "Link_depends arguments must be strings." is solved
+  install : install_tests,
+  install_dir : testsdir)
+test('test-libsystemd-sym',
+     test_libsystemd_sym)
+
 ############################################################
 
 make_directive_index_py = find_program('tools/make-directive-index.py')
index 91a35b1..c7d7d50 100644 (file)
@@ -1,6 +1,6 @@
 # -*- mode: meson -*-
 
-headers = '''
+systemd_headers = files('''
   sd-bus.h
   sd-bus-protocol.h
   sd-bus-vtable.h
@@ -10,8 +10,7 @@ headers = '''
   sd-journal.h
   sd-login.h
   sd-messages.h
-  _sd-common.h
-'''.split()
+'''.split())
 
 #  sd-device.h
 #  sd-hwdb.h
@@ -30,4 +29,7 @@ headers = '''
 #  sd-resolve.h
 #  sd-utf8.h
 
-install_headers(headers, subdir : 'systemd')
+install_headers(
+  systemd_headers,
+  '_sd-common.h',
+  subdir : 'systemd')
diff --git a/src/test/generate-sym-test.py b/src/test/generate-sym-test.py
new file mode 100755 (executable)
index 0000000..a3350c8
--- /dev/null
@@ -0,0 +1,23 @@
+#!/usr/bin/python3
+import sys, re
+
+print('#include <stdio.h>')
+for header in sys.argv[2:]:
+    print('#include "{}"'.format(header.split('/')[-1]))
+
+print('''
+void* functions[] = {''')
+
+for line in open(sys.argv[1]):
+    match = re.search('^ +([a-zA-Z0-9_]+);', line)
+    if match:
+        print('    {},'.format(match.group(1)))
+
+print('''};
+
+int main(void) {
+    unsigned i;
+    for (i = 0; i < sizeof(functions)/sizeof(void*); i++)
+         printf("%p\\n", functions[i]);
+    return 0;
+}''')
index e68e6bd..32affa8 100644 (file)
@@ -17,6 +17,19 @@ test_env.set('SYSTEMD_LANGUAGE_FALLBACK_MAP', language_fallback_map)
 test_env.set('PATH', path)
 test_env.prepend('PATH', meson.build_root())
 
+############################################################
+
+generate_sym_test_py = find_program('generate-sym-test.py')
+
+test_libsystemd_sym_c = custom_target(
+  'test-libsystemd-sym.c',
+  input : [libsystemd_sym_path] + systemd_headers,
+  output : 'test-libsystemd-sym.c',
+  command : [generate_sym_test_py, libsystemd_sym_path] + systemd_headers,
+  capture : true)
+
+############################################################
+
 tests += [
   [['src/test/test-device-nodes.c'],
    [libshared],