]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
meson: allow optional static linking of shared code in udev helpers
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 17 Apr 2017 16:07:12 +0000 (12:07 -0400)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 24 Apr 2017 01:47:29 +0000 (21:47 -0400)
This makes the helper binaries significantly bigger (in some cases, the final
size depends on link options and optimization level), and is only useful for
distributions which want to provide the option to install udev without systemd.
As the linking is improved, the difference between the columns might shrink,
but it's unlikely that linking libshared statically could ever be more
efficient.

E.g. with -O0, no -flto:
                   (static) (shared)
src/udev/ata_id     999176    85696
src/udev/cdrom_id  1024344   111656
src/udev/collect    990344    81280
src/udev/scsi_id   1023592   115656
src/udev/v4l_id     811736    17744

When linked dynamically, install_rpath must be specified, so add that.

meson.build
meson_options.txt
src/test/meson.build
src/udev/meson.build

index 6fca0b09325035189472eb2f0c6e6d9b874b6f6f..9504e984ec83380729ac1ad4b291ab04a4c77521 100644 (file)
@@ -2018,7 +2018,8 @@ exe = executable('systemd-udevd',
                               libudev_internal,
                               libsystemd_network,
                               libshared],
-                 dependencies : [libkmod,
+                 dependencies : [threads,
+                                 libkmod,
                                  libidn,
                                  libacl,
                                  libblkid],
@@ -2034,7 +2035,8 @@ exe = executable('udevadm',
                               libudev_internal,
                               libsystemd_network,
                               libshared],
-                 dependencies : [libkmod,
+                 dependencies : [threads,
+                                 libkmod,
                                  libidn,
                                  libacl,
                                  libblkid],
index 9caf9a329f6af3335e58c78c0625feee585763dc..132c05ab561d32fb923e019c3a72bc4fda0230ec 100644 (file)
@@ -6,6 +6,8 @@ option('rootlibdir', type : 'string',
        description : '''[/usr]/lib/x86_64-linux-gnu or such''')
 option('rootprefix', type : 'string',
        description : '''override the root prefix''')
+option('link-udev-shared', type : 'boolean',
+       description : 'link systemd-udev and its helpers to libsystemd-shared.so')
 
 option('sysvinit-path', type : 'string', value : '/etc/init.d',
        description : 'the directory where the SysV init scripts are located')
index 59a51d857e52c19e5790b9f2b1c9d7e28b668918..0014fed79b04d22cca11eede511441adc61d46d7 100644 (file)
@@ -575,7 +575,8 @@ tests += [
     libudev_internal,
     libsystemd_network,
     libshared],
-   [librt,
+   [threads,
+    librt,
     libblkid,
     libkmod,
     libacl],
index e7feaedb4f8472433d53cbdf83cc674097166f43..1eac8754ebd07db0e724a58e2e670a0b25cc0dad 100644 (file)
@@ -92,11 +92,20 @@ link_config_gperf_c = custom_target(
 
 ############################################################
 
+if get_option('link-udev-shared')
+  libudev_link_with = [libshared]
+  rpath = rootlibexecdir
+else
+  libudev_link_with = [libshared_static,
+                       libsystemd_internal]
+  rpath = ''
+endif
+
 libudev_internal = static_library(
     'udev',
     libudev_sources,
     include_directories : includes,
-    link_with : [libshared])
+    link_with : libudev_link_with)
 
 libudev_core_includes = [includes, include_directories('net')]
 libudev_core = static_library(
@@ -105,60 +114,28 @@ libudev_core = static_library(
     link_config_gperf_c,
     keyboard_keys_from_name_h,
     include_directories : libudev_core_includes,
-    link_with : [libshared])
-
-executable('ata_id',
-           'ata_id/ata_id.c',
-           include_directories : includes,
-           link_with : [libudev_internal,
-                        libshared],
-           install : true,
-           install_dir : udevlibexecdir)
-
-executable('cdrom_id',
-           'cdrom_id/cdrom_id.c',
-           include_directories : includes,
-           link_with : [libudev_internal,
-                        libshared],
-           install : true,
-           install_dir : udevlibexecdir)
-
-executable('collect',
-           'collect/collect.c',
-           include_directories : includes,
-           link_with : [libudev_internal,
-                        libshared],
-           install : true,
-           install_dir : udevlibexecdir)
-
-executable('scsi_id',
-           'scsi_id/scsi_id.c',
-           'scsi_id/scsi_id.h',
-           'scsi_id/scsi_serial.c',
-           'scsi_id/scsi.h',
-           include_directories : includes,
-           link_with : [libudev_internal,
-                        libshared],
-           install : true,
-           install_dir : udevlibexecdir)
-
-executable('v4l_id',
-           'v4l_id/v4l_id.c',
-           include_directories : includes,
-           link_with : [libudev_internal,
-                        libshared],
-           install : true,
-           install_dir : udevlibexecdir)
-
-executable('mtd_probe',
-           'mtd_probe/mtd_probe.c',
-           'mtd_probe/mtd_probe.h',
-           'mtd_probe/probe_smartmedia.c',
-           include_directories : includes,
-           link_with : [libudev_internal,
-                        libshared],
-           install : true,
-           install_dir : udevlibexecdir)
+    link_with : libudev_link_with)
+
+foreach prog : [['ata_id/ata_id.c'],
+                ['cdrom_id/cdrom_id.c'],
+                ['collect/collect.c'],
+                ['scsi_id/scsi_id.c',
+                 'scsi_id/scsi_id.h',
+                 'scsi_id/scsi_serial.c',
+                 'scsi_id/scsi.h'],
+                ['v4l_id/v4l_id.c'],
+                ['mtd_probe/mtd_probe.c',
+                 'mtd_probe/mtd_probe.h',
+                 'mtd_probe/probe_smartmedia.c']]
+
+  executable(prog[0].split('/')[0],
+             prog,
+             include_directories : includes,
+             link_with : [libudev_internal],
+             install_rpath : rpath,
+             install : true,
+             install_dir : udevlibexecdir)
+endforeach
 
 install_data('udev.conf',
              install_dir : join_paths(sysconfdir, 'udev'))