meson: add test-libsystemd-sym, fix linking of libsystemd

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.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2017-04-10 14:13:40 -04:00
parent 4e4ab1c32a
commit 37ab1a25ec
4 changed files with 64 additions and 10 deletions

View 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')

View 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')

23
src/test/generate-sym-test.py Executable file
View File

@ -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;
}''')

View 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],