]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
meson: use install_symlink() where applicable
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 4 Mar 2025 21:27:08 +0000 (06:27 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 9 Mar 2025 17:41:40 +0000 (02:41 +0900)
Now our baseline of meson is 0.62, hence install_symlink() can be used.

Note, install_symlink() implies install_emptydir() for specified
install_dir. Hence, this also drops several unnecessary
install_emptydir() calls.

Note, the function currently does not support 'relative' and 'force' flags,
so several 'ln -frsT' inline calls cannot be replaced.

20 files changed:
man/meson.build
meson.build
profile.d/meson.build
src/core/meson.build
src/cryptsetup/meson.build
src/dissect/meson.build
src/environment-d-generator/meson.build
src/fstab-generator/meson.build
src/home/meson.build
src/mount/meson.build
src/resolve/meson.build
src/run/meson.build
src/ssh-generator/meson.build
src/sysext/meson.build
src/systemctl/meson.build
src/udev/meson.build
src/userdb/meson.build
test/meson.build
units/meson.build
units/user/meson.build

index 20a073442e64b78be5488bc290106a23b9b73d5a..6b33c607577ee60b2f0b5dde0f937e11a6ba691b 100644 (file)
@@ -92,7 +92,9 @@ foreach tuple : manpages
                                         output : htmlalias,
                                         command : [ln, '-fs', html, '@OUTPUT@'])
                                 if want_html
-                                        meson.add_install_script(sh, '-c', ln_s.format(docdir / 'html' / html, docdir / 'html' / htmlalias))
+                                        install_symlink(htmlalias,
+                                                        pointing_to : html,
+                                                        install_dir : docdir / 'html')
                                         p2 += link
                                 endif
                                 html_pages += link
@@ -163,7 +165,9 @@ foreach tuple : xsltproc.found() ? [['systemd.directives', '7', systemd_directiv
                         output : htmlalias,
                         command : [ln, '-fs', html, '@OUTPUT@'])
                 if want_html
-                        meson.add_install_script(sh, '-c', ln_s.format(docdir / 'html' / html, docdir / 'html' / htmlalias))
+                        install_symlink(htmlalias,
+                                        pointing_to : html,
+                                        install_dir : docdir / 'html')
                         p2 += link
                 endif
                 html_pages += link
index 7077e1a8cccceedc46a2c0e29b6f74f2c228d5db..26e3f2771fcba86baec2983c14d8e3f808739728 100644 (file)
@@ -127,6 +127,7 @@ datadir = prefixdir / get_option('datadir')
 localstatedir = '/' / get_option('localstatedir')
 
 libexecdir = prefixdir / 'lib/systemd'
+libexecdir_to_bin = '../../bin/'
 pkglibdir = libdir / 'systemd'
 
 install_sysconfdir = get_option('install-sysconfdir') != 'false'
@@ -2635,9 +2636,9 @@ if want_ukify
         public_programs += ukify
 
         # symlink for backwards compatibility after rename
-        meson.add_install_script(sh, '-c',
-                                 ln_s.format(bindir / 'ukify',
-                                             libexecdir / 'ukify'))
+        install_symlink('ukify',
+                        pointing_to : libexecdir_to_bin / 'ukify',
+                        install_dir : libexecdir)
 endif
 
 #####################################################################
index fa03ed0ab03dfd9e40b2f318d1cce01249352663..b1692920f4d1a5188f1c96953b8d02338ceb80be 100644 (file)
@@ -4,15 +4,33 @@ install_data('70-systemd-shell-extra.sh', install_dir : shellprofiledir.startswi
 install_data('80-systemd-osc-context.sh', install_dir : shellprofiledir.startswith('/usr/') ? shellprofiledir : libexecdir / 'profile.d')
 
 if conf.get('LINK_SHELL_EXTRA_DROPIN') == 1
-        install_emptydir(shellprofiledir)
+        if meson.version().version_compare('>=1.3.0')
+                install_symlink(
+                        '70-systemd-shell-extra.sh',
+                        pointing_to : fs.relative_to(libexecdir / 'profile.d' / '70-systemd-shell-extra.sh',
+                                                     shellprofiledir),
+                        install_dir : shellprofiledir)
+        else
+                install_emptydir(shellprofiledir)
 
-        meson.add_install_script(sh, '-c',
-                ln_s.format(libexecdir / 'profile.d' / '70-systemd-shell-extra.sh', shellprofiledir / '70-systemd-shell-extra.sh'))
+                meson.add_install_script(sh, '-c',
+                        ln_s.format(libexecdir / 'profile.d' / '70-systemd-shell-extra.sh',
+                                    shellprofiledir / '70-systemd-shell-extra.sh'))
+        endif
 endif
 
 if conf.get('LINK_OSC_CONTEXT_DROPIN') == 1
-        install_emptydir(shellprofiledir)
+        if meson.version().version_compare('>=1.3.0')
+                install_symlink(
+                        '80-systemd-osc-context.sh',
+                        pointing_to : fs.relative_to(libexecdir / 'profile.d' / '80-systemd-osc-context.sh',
+                                                     shellprofiledir),
+                        install_dir : shellprofiledir)
+        else
+                install_emptydir(shellprofiledir)
 
-        meson.add_install_script(sh, '-c',
-                ln_s.format(libexecdir / 'profile.d' / '80-systemd-osc-context.sh', shellprofiledir / '80-systemd-osc-context.sh'))
+                meson.add_install_script(sh, '-c',
+                        ln_s.format(libexecdir / 'profile.d' / '80-systemd-osc-context.sh',
+                                    shellprofiledir / '80-systemd-osc-context.sh'))
+        endif
 endif
index f0206c7a9ba9b93909060e4851e0996c8ba5d0b1..f1c7e334be865514f39ae49fa9bd1292a30b461a 100644 (file)
@@ -260,13 +260,17 @@ install_emptydir(usergeneratordir)
 if install_sysconfdir
         install_emptydir(pkgsysconfdir / 'system')
         install_emptydir(pkgsysconfdir / 'user')
-        install_emptydir(sysconfdir / 'xdg/systemd')
-        meson.add_install_script(sh, '-c', ln_s.format(pkgsysconfdir / 'user',
-                                                       sysconfdir / 'xdg/systemd/user'))
+
+        assert(sysconfdir / 'systemd' == pkgsysconfdir)
+        install_symlink('user',
+                        pointing_to : '../../systemd/user',
+                        install_dir : sysconfdir / 'xdg/systemd')
 endif
 
-install_emptydir(sbindir)
-meson.add_install_script(sh, '-c', ln_s.format(libexecdir / 'systemd', sbindir / 'init'))
+assert(fs.parent(sbindir) / 'lib/systemd' == libexecdir)
+install_symlink('init',
+                pointing_to : '../lib/systemd/systemd',
+                install_dir : sbindir)
 
 ############################################################
 
index ad60190e7442e2d38964446b3fdb628e66fa7ff1..056a9d467250933912e9ad2f6d439705e7fd48bb 100644 (file)
@@ -33,6 +33,6 @@ executables += [
 ]
 
 # symlink for backwards compatibility after rename
-meson.add_install_script(sh, '-c',
-                         ln_s.format(bindir / 'systemd-cryptsetup',
-                                     libexecdir / 'systemd-cryptsetup'))
+install_symlink('systemd-cryptsetup',
+                pointing_to : libexecdir_to_bin / 'systemd-cryptsetup',
+                install_dir : libexecdir)
index 7e7a089b443c9d28ba786c4613deed8c2c367a2a..24943cc8029052367833d9db759ec2e9e9a1f13e 100644 (file)
@@ -12,7 +12,6 @@ executables += [
         },
 ]
 
-install_emptydir(sbindir)
-meson.add_install_script(sh, '-c',
-                         ln_s.format(bindir / 'systemd-dissect',
-                                     sbindir / 'mount.ddi'))
+install_symlink('mount.ddi',
+                pointing_to : sbin_to_bin + 'systemd-dissect',
+                install_dir : sbindir)
index cc41b6b334ddbf44097a7029653646b203a35f52..51aad9200d9eff6d72353f76ce4ba3ff6ba06674 100644 (file)
@@ -13,6 +13,9 @@ executables += [
 ]
 
 install_emptydir(environmentdir)
+# install_symlink() does not support broken symlink, and /etc/environment is not managed by us, thus
+# may not exist. Hence, we need to create it by using the custom install script here.
+# See https://github.com/mesonbuild/meson/pull/12266 .
 meson.add_install_script(sh, '-c',
                          ln_s.format(sysconfdir / 'environment',
                                      environmentdir / '99-environment.conf'))
index 7b90580e9063b7326bb8f003289c5857703fb661..fb492158fc3b5a47a370ad4090357570a26f6b94 100644 (file)
@@ -7,6 +7,7 @@ executables += [
         },
 ]
 
-meson.add_install_script(sh, '-c',
-                         ln_s.format(systemgeneratordir / 'systemd-fstab-generator',
-                                     libexecdir / 'systemd-sysroot-fstab-check'))
+assert(libexecdir / fs.name(systemgeneratordir) == systemgeneratordir)
+install_symlink('systemd-sysroot-fstab-check',
+                pointing_to : fs.name(systemgeneratordir) / 'systemd-fstab-generator',
+                install_dir : libexecdir)
index da34c418fa7efdaa4f2a7cb11f90ef09a5b6d486..74174dec9ea65adca95a9b953e77e695f7c144c1 100644 (file)
@@ -140,6 +140,6 @@ if install_sysconfdir_samples
                      install_dir : pkgconfigfiledir)
 endif
 
-meson.add_install_script(sh, '-c',
-                         ln_s.format(bindir / 'homectl',
-                                     bindir / 'systemd-home-fallback-shell'))
+install_symlink('systemd-home-fallback-shell',
+                pointing_to : 'homectl',
+                install_dir : bindir)
index 176fb53dca18f05ec4d67912746fbbb4e8b7863b..dd996cfba4cb7c407c45415099401e5550709cde 100644 (file)
@@ -9,5 +9,6 @@ executables += [
         },
 ]
 
-meson.add_install_script(sh, '-c', ln_s.format(bindir / 'systemd-mount',
-                                               bindir / 'systemd-umount'))
+install_symlink('systemd-umount',
+                pointing_to : 'systemd-mount',
+                install_dir : bindir)
index bfbe0bd15e5cbc2d5e82da36ba2ea5d0582ea330..7e388f835bcb4b49a1689f62c9cfb3397fd5afb7 100644 (file)
@@ -311,15 +311,14 @@ if conf.get('ENABLE_RESOLVE') == 1
         install_data('resolv.conf',
                      install_dir : libexecdir)
 
-        install_emptydir(sbindir)
-        meson.add_install_script(sh, '-c',
-                                 ln_s.format(bindir / 'resolvectl',
-                                             sbindir / 'resolvconf'))
+        install_symlink('resolvconf',
+                        pointing_to : sbin_to_bin + 'resolvectl',
+                        install_dir : sbindir)
 
         # symlink for backwards compatibility after rename
-        meson.add_install_script(sh, '-c',
-                                 ln_s.format(bindir / 'resolvectl',
-                                             bindir / 'systemd-resolve'))
+        install_symlink('systemd-resolve',
+                        pointing_to : 'resolvectl',
+                        install_dir : bindir)
 endif
 
 custom_target(
index 221b441fac82df4770447ee037044b95c1b70897..a228d2501444dcf26c2603123232bfe812252442 100644 (file)
@@ -8,11 +8,9 @@ executables += [
         },
 ]
 
-install_emptydir(bindir)
-
-meson.add_install_script(sh, '-c',
-                             ln_s.format(bindir / 'systemd-run',
-                                         bindir / 'run0'))
+install_symlink('run0',
+                pointing_to : 'systemd-run',
+                install_dir : bindir)
 
 custom_target(
         'systemd-run0',
index d0473e2cbb3e92fa2b79eacc7c6965bb38f2b8ac..e36f9fae08cdb2b610f209e31bb88152ff1cec25 100644 (file)
@@ -21,9 +21,18 @@ if conf.get('ENABLE_SSH_PROXY_CONFIG') == 1
                 install_dir : sshconfdir.startswith('/usr/') ? sshconfdir : libexecdir / 'ssh_config.d')
 
         if conf.get('LINK_SSH_PROXY_DROPIN') == 1
-                install_emptydir(sshconfdir)
+                if meson.version().version_compare('>=1.3.0')
+                        install_symlink(
+                                '20-systemd-ssh-proxy.conf',
+                                pointing_to : fs.relative_to(libexecdir / 'ssh_config.d' / '20-systemd-ssh-proxy.conf',
+                                                             sshconfdir),
+                                install_dir : sshconfdir)
+                else
+                        install_emptydir(sshconfdir)
 
-                meson.add_install_script(sh, '-c',
-                        ln_s.format(libexecdir / 'ssh_config.d' / '20-systemd-ssh-proxy.conf', sshconfdir / '20-systemd-ssh-proxy.conf'))
+                        meson.add_install_script(sh, '-c',
+                                ln_s.format(libexecdir / 'ssh_config.d' / '20-systemd-ssh-proxy.conf',
+                                            sshconfdir / '20-systemd-ssh-proxy.conf'))
+                endif
         endif
 endif
index 2983970d802af32b4ec4da62e431edf7c7fd71c4..25f6b9133598c56f8c43d458d67846a45b9dd28a 100644 (file)
@@ -10,6 +10,7 @@ executables += [
 ]
 
 if conf.get('ENABLE_SYSEXT') == 1
-        meson.add_install_script(sh, '-c', ln_s.format(bindir / 'systemd-sysext',
-                                                       bindir / 'systemd-confext'))
+        install_symlink('systemd-confext',
+                        pointing_to : 'systemd-sysext',
+                        install_dir : bindir)
 endif
index 46218dc8ef47a6a501e71b70ff6f5e052fde21bc..bdeda919fdfc5f8bf66fdfe28fbe527c0eabd7b7 100644 (file)
@@ -75,8 +75,7 @@ executables += [
 
 foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
                  (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
-        install_emptydir(sbindir)
-        meson.add_install_script(sh, '-c',
-                                 ln_s.format(bindir / 'systemctl',
-                                             sbindir / alias))
+        install_symlink(alias,
+                        pointing_to : sbin_to_bin + 'systemctl',
+                        install_dir : sbindir)
 endforeach
index b24234bba280f20ce5d16243ea82b22d69acd6cf..c77609543bcd784fc5b04bba7104d9bd2baa87aa 100644 (file)
@@ -269,9 +269,10 @@ executables += [
         },
 ]
 
-meson.add_install_script(sh, '-c', ln_s.format(bindir / 'udevadm',
-                                               libexecdir / 'systemd-udevd'),
-                         install_tag : 'udev')
+install_symlink('systemd-udevd',
+                pointing_to : libexecdir_to_bin + 'udevadm',
+                install_dir : libexecdir,
+                install_tag : 'udev')
 
 if install_sysconfdir_samples
         install_data('udev.conf',
index f6d068500dc6ffbf7762c02917efd497e1304a64..57948d8df99e5a737cdc7109d62a81399284a180 100644 (file)
@@ -34,9 +34,18 @@ if conf.get('ENABLE_SSH_USERDB_CONFIG') == 1
                 install_dir : sshdconfdir.startswith('/usr/') ? sshdconfdir : libexecdir / 'sshd_config.d')
 
         if conf.get('LINK_SSHD_USERDB_DROPIN') == 1
-                install_emptydir(sshdconfdir)
+                if meson.version().version_compare('>=1.3.0')
+                        install_symlink(
+                                '20-systemd-userdb.conf',
+                                pointing_to : fs.relative_to(libexecdir / 'sshd_config.d' / '20-systemd-userdb.conf',
+                                                             sshdconfdir),
+                                install_dir : sshdconfdir)
+                else
+                        install_emptydir(sshdconfdir)
 
-                meson.add_install_script(sh, '-c',
-                        ln_s.format(libexecdir / 'sshd_config.d' / '20-systemd-userdb.conf', sshdconfdir / '20-systemd-userdb.conf'))
+                        meson.add_install_script(sh, '-c',
+                                ln_s.format(libexecdir / 'sshd_config.d' / '20-systemd-userdb.conf',
+                                            sshdconfdir / '20-systemd-userdb.conf'))
+                endif
         endif
 endif
index 7e9d28aa1bb8f2ebc22ebaa294461d1882a42ed2..e2d10a388687e616e4b5367eee86c64336e0c967 100644 (file)
@@ -506,6 +506,8 @@ if install_tests
 
         # The unit tests implemented as shell scripts expect to find testdata/
         # in the directory where they are stored.
-        meson.add_install_script(sh, '-c', ln_s.format(testdata_dir,
-                                                       unittestsdir / 'testdata'))
+        assert(fs.parent(unittestsdir) / 'testdata' == testdata_dir)
+        install_symlink('testdata',
+                        pointing_to : '../testdata',
+                        install_dir : unittestsdir)
 endif
index 84c3757b10aea9f11412ce08fc4e65933cb894fc..b29bed068f67a3e56c5634b1818c201a09f6f1ec 100644 (file)
@@ -922,16 +922,17 @@ foreach unit : units
         if install
                 foreach target : unit.get('symlinks', [])
                         if target.endswith('/')
-                                install_emptydir(systemunitdir / target, install_tag : unit.get('install_tag', ''))
-                                meson.add_install_script(sh, '-c',
-                                                         ln_s.format(systemunitdir / name,
-                                                                     systemunitdir / target / name),
-                                                         install_tag : unit.get('install_tag', ''))
+                                # '/' is only allowed at the end of the target
+                                assert(target.replace('/', '') + '/' == target)
+                                install_symlink(name,
+                                                pointing_to : '..' / name,
+                                                install_dir : systemunitdir / target,
+                                                install_tag : unit.get('install_tag', ''))
                         else
-                                meson.add_install_script(sh, '-c',
-                                                         ln_s.format(systemunitdir / name,
-                                                                     systemunitdir / target),
-                                                         install_tag : unit.get('install_tag', ''))
+                                install_symlink(target,
+                                                pointing_to : name,
+                                                install_dir : systemunitdir,
+                                                install_tag : unit.get('install_tag', ''))
                         endif
                 endforeach
         endif
@@ -947,10 +948,18 @@ install_data('user@0.service.d/10-login-barrier.conf',
 
 ############################################################
 
-install_emptydir(dbussessionservicedir)
-meson.add_install_script(sh, '-c',
-                         ln_s.format(dbussystemservicedir / 'org.freedesktop.systemd1.service',
-                                     dbussessionservicedir / 'org.freedesktop.systemd1.service'))
+if meson.version().version_compare('>=1.3.0')
+        install_symlink(
+                'org.freedesktop.systemd1.service',
+                pointing_to : fs.relative_to(dbussystemservicedir / 'org.freedesktop.systemd1.service',
+                                             dbussessionservicedir),
+                install_dir : dbussessionservicedir)
+else
+        install_emptydir(dbussessionservicedir)
+        meson.add_install_script(sh, '-c',
+                ln_s.format(dbussystemservicedir / 'org.freedesktop.systemd1.service',
+                            dbussessionservicedir / 'org.freedesktop.systemd1.service'))
+endif
 
 if conf.get('HAVE_SYSV_COMPAT') == 1
         foreach i : [1, 2, 3, 4, 5]
index 290f268ef1de5901ee4dfeac78cd171b8392125a..c669e4bb1cb752f03482706e4439cacffe3d9d81 100644 (file)
@@ -50,14 +50,15 @@ foreach unit : units
 
                 foreach target : unit.get('symlinks', [])
                         if target.endswith('/')
-                                install_emptydir(userunitdir / target)
-                                meson.add_install_script(sh, '-c',
-                                                         ln_s.format(userunitdir / file,
-                                                                     userunitdir / target / file))
+                                # '/' is only allowed at the end of the target
+                                assert(target.replace('/', '') + '/' == target)
+                                install_symlink(file,
+                                                pointing_to : '..' / file,
+                                                install_dir : userunitdir / target)
                         else
-                                meson.add_install_script(sh, '-c',
-                                                         ln_s.format(userunitdir / file,
-                                                                     userunitdir / target))
+                                install_symlink(target,
+                                                pointing_to : file,
+                                                install_dir : userunitdir)
                         endif
                 endforeach
         endif