Skip to content

Commit

Permalink
meson: recompile all sources for install_libudev_static and install_l…
Browse files Browse the repository at this point in the history
…ibsystemd_static

This means that when those targets are built, all the sources are built again,
instead of reusing the work done to create libbasic.a and other convenience static
libraries. It would be nice to not do this, but there seems to be no support in
our toolchain for joining multiple static libraries into one. When linking
a static library, any -l arguments are simply ignored by ar/gcc-ar, and .a
libraries given as positional arguments are copied verbatim into the archive
so they objects in them cannot be accessed.

https://stackoverflow.com/questions/2157629/linking-static-libraries-to-other-static-libraries
suggests either unzipping all the archives and putting them back togather,
or using a linker script. Unzipping and zipping back together seems ugly.
The other option is not very nice. The linker script language does not
allow "+" to appear in the filenames, and filenames that meson generates
use that, so files would have to be renamed before a linker script was used.
And we would have to generate the linker script on the fly. Either way, this
doesn't seem attractive. Since those static libraries are a niche use case,
it seems reasonable to just go with the easiest and safest solution and
recompile all the source files. Thanks to ccache, this is probably almost as
cheap as actually reusing the convenience .a libraries.

test-libsystemd-sym.c and test-libudev-sym.c compile fine with the generated
static libs, so it seems that they indeed provide all the symbols they should.
  • Loading branch information
keszybz committed May 8, 2018
1 parent 20f3d32 commit 975464e
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 14 deletions.
8 changes: 6 additions & 2 deletions meson.build
Expand Up @@ -1349,9 +1349,9 @@ install_libsystemd_static = static_library(
'systemd',
libsystemd_sources,
journal_client_sources,
basic_sources,
basic_gcrypt_sources,
include_directories : includes,
link_with : [libbasic,
libbasic_gcrypt],
build_by_default : static_libsystemd != 'false',
install : static_libsystemd != 'false',
install_dir : rootlibdir,
Expand All @@ -1360,6 +1360,10 @@ install_libsystemd_static = static_library(
librt,
libxz,
liblz4,
libcap,
libblkid,
libmount,
libselinux,
libgcrypt],
c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))

Expand Down
6 changes: 4 additions & 2 deletions src/basic/meson.build
Expand Up @@ -303,6 +303,9 @@ foreach item : [['af', af_list_txt, 'af', ''],
endforeach

basic_sources += [missing_h] + generated_gperf_headers
basic_gcrypt_sources = files(
'gcrypt-util.c',
'gcrypt-util.h')

libbasic = static_library(
'basic',
Expand All @@ -320,8 +323,7 @@ libbasic = static_library(
# unnecessary linking to libgcrypt.
libbasic_gcrypt = static_library(
'basic-gcrypt',
'gcrypt-util.c',
'gcrypt-util.h',
basic_gcrypt_sources,
include_directories : includes,
dependencies : [libgcrypt],
c_args : ['-fvisibility=default'])
12 changes: 6 additions & 6 deletions src/shared/meson.build
Expand Up @@ -2,7 +2,7 @@
#
# Copyright 2017 Zbigniew Jędrzejewski-Szmek

shared_sources = '''
shared_sources = files('''
acl-util.h
acpi-fpdt.c
acpi-fpdt.h
Expand Down Expand Up @@ -104,25 +104,25 @@ shared_sources = '''
watchdog.c
watchdog.h
wireguard-netlink.h
'''.split()
'''.split())

test_tables_h = files('test-tables.h')
shared_sources += [test_tables_h]

if conf.get('HAVE_ACL') == 1
shared_sources += ['acl-util.c']
shared_sources += files('acl-util.c')
endif

if conf.get('ENABLE_UTMP') == 1
shared_sources += ['utmp-wtmp.c']
shared_sources += files('utmp-wtmp.c')
endif

if conf.get('HAVE_SECCOMP') == 1
shared_sources += ['seccomp-util.c']
shared_sources += files('seccomp-util.c')
endif

if conf.get('HAVE_LIBIPTC') == 1
shared_sources += ['firewall-util.c']
shared_sources += files('firewall-util.c')
endif

libshared_name = 'systemd-shared-@0@'.format(meson.project_version())
Expand Down
8 changes: 4 additions & 4 deletions src/udev/meson.build
Expand Up @@ -121,16 +121,16 @@ static_libudev = get_option('static-libudev')
static_libudev_pic = static_libudev == 'true' or static_libudev == 'pic'
install_libudev_static = static_library(
'udev',
basic_sources,
shared_sources,
libsystemd_sources,
libudev_sources,
include_directories : includes,
link_with : [libshared_static,
libsystemd_static],
link_whole : libudev_basic,
build_by_default : static_libudev != 'false',
install : static_libudev != 'false',
install_dir : rootlibdir,
link_depends : libudev_sym,
dependencies : [threads],
dependencies : libshared_deps + [libmount],
c_args : static_libudev_pic ? [] : ['-fno-PIC'],
pic : static_libudev_pic)

Expand Down

0 comments on commit 975464e

Please sign in to comment.