# along with systemd; If not, see <http://www.gnu.org/licenses/>.
project('systemd', 'c',
- version : '235',
+ version : '236',
license : 'LGPLv2+',
default_options: [
'c_std=gnu99',
meson_version : '>= 0.41',
)
-libsystemd_version = '0.19.1'
-libudev_version = '1.6.7'
+libsystemd_version = '0.20.0'
+libudev_version = '1.6.8'
# We need the same data in three different formats, ugh!
# Also, for hysterical reasons, we use different variable
#####################################################################
-conf.set10('HAVE_SPLIT_USR', get_option('split-usr'))
-rootprefixdir = get_option('split-usr') ? '/' : '/usr'
+split_usr = get_option('split-usr')
+conf.set10('HAVE_SPLIT_USR', split_usr)
+
+rootprefixdir = get_option('rootprefix')
+# Unusual rootprefixdir values are used by some distros
+# (see https://github.com/systemd/systemd/pull/7461).
+rootprefix_default = get_option('split-usr') ? '/' : '/usr'
+if rootprefixdir == ''
+ rootprefixdir = rootprefix_default
+endif
sysvinit_path = get_option('sysvinit-path')
sysvrcnd_path = get_option('sysvrcnd-path')
-have = sysvinit_path != '' or sysvrcnd_path != ''
+have = sysvinit_path != '' and sysvrcnd_path != ''
conf.set10('HAVE_SYSV_COMPAT', have,
description : 'SysV init scripts and rcN.d links are supported')
m4_defines += have ? ['-DHAVE_SYSV_COMPAT'] : []
conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
+conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
+conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
+conf.set_quoted('ROOTPREFIX', rootprefixdir)
conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
['IFLA_VRF_TABLE', 'linux/if_link.h'],
['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
- ['IFLA_IPVLAN_MODE', 'linux/if_link.h'],
+ ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
+ ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
['NDA_IFINDEX', 'linux/neighbour.h'],
['IFA_FLAGS', 'linux/if_addr.h'],
['FRA_UID_RANGE', 'linux/fib_rules.h'],
endforeach
foreach ident : [
- ['memfd_create', '''#define _GNU_SOURCE
- #include <sys/mman.h>'''],
- ['gettid', '''#include <sys/types.h>'''],
- ['pivot_root', '''#include <stdlib.h>'''], # no known header declares pivot_root
- ['name_to_handle_at', '''#define _GNU_SOURCE
- #include <sys/types.h>
+ ['memfd_create', '''#include <sys/mman.h>'''],
+ ['gettid', '''#include <sys/types.h>
+ #include <unistd.h>'''],
+ ['pivot_root', '''#include <stdlib.h>
+ #include <unistd.h>'''], # no known header declares pivot_root
+ ['name_to_handle_at', '''#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>'''],
- ['setns', '''#define _GNU_SOURCE
- #include <sched.h>'''],
- ['renameat2', '''#include <stdio.h>'''],
+ ['setns', '''#include <sched.h>'''],
+ ['renameat2', '''#include <stdio.h>
+ #include <fcntl.h>'''],
['kcmp', '''#include <linux/kcmp.h>'''],
['keyctl', '''#include <sys/types.h>
#include <keyutils.h>'''],
['explicit_bzero' , '''#include <string.h>'''],
]
- have = cc.has_function(ident[0], prefix : ident[1])
+ have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
conf.set10('HAVE_' + ident[0].to_upper(), have)
endforeach
-if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''')
+if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
conf.set10('USE_SYS_RANDOM_H', true)
conf.set10('HAVE_GETRANDOM', true)
else
# if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
# /usr/sbin, /sbin, and fall back to the default from middle column.
-progs = [['telinit', '/lib/sysvinit/telinit'],
- ['quotaon', '/usr/sbin/quotaon' ],
+progs = [['quotaon', '/usr/sbin/quotaon' ],
['quotacheck', '/usr/sbin/quotacheck' ],
['kill', '/usr/bin/kill' ],
['kmod', '/usr/bin/kmod' ],
substs.set(name, path)
endforeach
+conf.set_quoted('TELINIT', get_option('telinit-path'))
+
if run_command('ln', '--relative', '--help').returncode() != 0
error('ln does not support --relative')
endif
substs.set('systemuidmax', system_uid_max)
message('maximum system UID is @0@'.format(system_uid_max))
-conf.set_quoted('NOBODY_USER_NAME', get_option('nobody-user'))
-conf.set_quoted('NOBODY_GROUP_NAME', get_option('nobody-group'))
-
system_gid_max = get_option('system-gid-max')
if system_gid_max == ''
system_gid_max = run_command(
substs.set('systemgidmax', system_gid_max)
message('maximum system GID is @0@'.format(system_gid_max))
+dynamic_uid_min = get_option('dynamic-uid-min').to_int()
+dynamic_uid_max = get_option('dynamic-uid-max').to_int()
+conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
+conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
+substs.set('dynamicuidmin', dynamic_uid_min)
+substs.set('dynamicuidmax', dynamic_uid_max)
+
+container_uid_base_min = get_option('container-uid-base-min').to_int()
+container_uid_base_max = get_option('container-uid-base-max').to_int()
+conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
+conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
+substs.set('containeruidbasemin', container_uid_base_min)
+substs.set('containeruidbasemax', container_uid_base_max)
+
+nobody_user = get_option('nobody-user')
+nobody_group = get_option('nobody-group')
+
+getent_result = run_command('getent', 'passwd', '65534')
+if getent_result.returncode() == 0
+ name = getent_result.stdout().split(':')[0]
+ if name != nobody_user
+ message('WARNING:\n' +
+ ' The local user with the UID 65534 does not match the configured user name "@0@" of the nobody user (its name is @1@).\n'.format(nobody_user, name) +
+ ' Your build will result in an user table setup that is incompatible with the local system.')
+ endif
+endif
+id_result = run_command('id', '-u', nobody_user)
+if id_result.returncode() == 0
+ id = id_result.stdout().to_int()
+ if id != 65534
+ message('WARNING:\n' +
+ ' The local user with the configured user name "@0@" of the nobody user does not have UID 65534 (it has @1@).\n'.format(nobody_user, id) +
+ ' Your build will result in an user table setup that is incompatible with the local system.')
+ endif
+endif
+
+getent_result = run_command('getent', 'group', '65534')
+if getent_result.returncode() == 0
+ name = getent_result.stdout().split(':')[0]
+ if name != nobody_group
+ message('WARNING:\n' +
+ ' The local group with the GID 65534 does not match the configured group name "@0@" of the nobody group (its name is @1@).\n'.format(nobody_group, name) +
+ ' Your build will result in an group table setup that is incompatible with the local system.')
+ endif
+endif
+id_result = run_command('id', '-g', nobody_group)
+if id_result.returncode() == 0
+ id = id_result.stdout().to_int()
+ if id != 65534
+ message('WARNING:\n' +
+ ' The local group with the configured group name "@0@" of the nobody group does not have UID 65534 (it has @1@).\n'.format(nobody_group, id) +
+ ' Your build will result in an group table setup that is incompatible with the local system.')
+ endif
+endif
+if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
+ message('WARNING:\n' +
+ ' The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
+ ' Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
+endif
+
+conf.set_quoted('NOBODY_USER_NAME', nobody_user)
+conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
+substs.set('NOBODY_USER_NAME', nobody_user)
+substs.set('NOBODY_GROUP_NAME', nobody_group)
+
tty_gid = get_option('tty-gid')
conf.set('TTY_GID', tty_gid)
substs.set('TTY_GID', tty_gid)
+# Ensure provided GID argument is numeric, otherwise fallback to default assignment
+if get_option('users-gid') != ''
+ users_gid = get_option('users-gid').to_int()
+else
+ users_gid = '-'
+endif
+substs.set('USERS_GID', users_gid)
+
if get_option('adm-group')
m4_defines += ['-DENABLE_ADM_GROUP']
endif
'src/libsystemd/sd-netlink',
'src/libsystemd/sd-network',
'src/libsystemd-network',
- '.',
- )
+ '.')
add_project_arguments('-include', 'config.h', language : 'c')
-gcrypt_util_sources = files('src/shared/gcrypt-util.h',
- 'src/shared/gcrypt-util.c')
-
subdir('po')
subdir('catalog')
subdir('src/systemd')
libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
libsystemd = shared_library(
'systemd',
- libsystemd_internal_sources,
- journal_internal_sources,
+ 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
version : libsystemd_version,
include_directories : includes,
link_args : ['-shared',
'-Wl,--version-script=' + libsystemd_sym_path],
- link_with : [libbasic],
+ link_with : [libbasic,
+ libbasic_gcrypt],
+ link_whole : [libsystemd_static,
+ libjournal_client],
dependencies : [threads,
- libgcrypt,
librt,
libxz,
liblz4],
subdir('src/timedate')
subdir('src/timesync')
subdir('src/vconsole')
-subdir('src/sulogin-shell')
subdir('src/boot/efi')
subdir('src/test')
'src/nss-@0@/nss-@0@.c'.format(module),
version : '2',
include_directories : includes,
- link_args : ['-shared',
+ # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
+ link_args : ['-Wl,-z,nodelete',
+ '-shared',
'-Wl,--version-script=' + version_script_arg,
'-Wl,--undefined'],
- link_with : [libsystemd_internal,
+ link_with : [libsystemd_static,
libbasic],
dependencies : [threads,
librt],
if conf.get('ENABLE_RESOLVE') == 1
executable('systemd-resolved',
systemd_resolved_sources,
- gcrypt_util_sources,
include_directories : includes,
- link_with : [libshared],
+ link_with : [libshared,
+ libbasic_gcrypt,
+ libsystemd_resolve_core],
dependencies : [threads,
- libgcrypt,
libgpg_error,
libm,
libidn],
exe = executable('systemd-resolve',
systemd_resolve_sources,
- gcrypt_util_sources,
include_directories : includes,
- link_with : [libshared],
+ link_with : [libshared,
+ libbasic_gcrypt,
+ libsystemd_resolve_core],
dependencies : [threads,
- libgcrypt,
libgpg_error,
libm,
libidn],
include_directories : includes,
link_args : ['-shared',
'-Wl,--version-script=' + version_script_arg],
- link_with : [libsystemd_internal,
+ link_with : [libsystemd_static,
libshared_static],
dependencies : [threads,
libpam,
install : true,
install_dir : rootlibexecdir)
+executable('systemd-growfs',
+ 'src/partition/growfs.c',
+ include_directories : includes,
+ link_with : [libshared],
+ dependencies : [libcryptsetup],
+ install_rpath : rootlibexecdir,
+ install : true,
+ install_dir : rootlibexecdir)
+
+executable('systemd-makefs',
+ 'src/partition/makefs.c',
+ include_directories : includes,
+ link_with : [libshared],
+ install_rpath : rootlibexecdir,
+ install : true,
+ install_dir : rootlibexecdir)
+
executable('systemd-sleep',
'src/sleep/sleep.c',
include_directories : includes,
install : true,
install_dir : rootbindir)
public_programs += [exe]
+
+ test('test-systemd-tmpfiles',
+ test_systemd_tmpfiles_py,
+ args : exe.full_path())
+ # https://github.com/mesonbuild/meson/issues/2681
endif
if conf.get('ENABLE_HWDB') == 1
'src/hwdb/hwdb.c',
'src/libsystemd/sd-hwdb/hwdb-internal.h',
include_directories : includes,
- link_with : [libudev_internal],
+ link_with : [libudev_static],
install_rpath : udev_rpath,
install : true,
install_dir : rootbindir)
c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
link_with : [libudev_core,
libsystemd_network,
- libudev_internal],
+ libudev_static],
dependencies : [threads,
libkmod,
libidn,
exe = executable('udevadm',
udevadm_sources,
+ c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
include_directories : includes,
link_with : [libudev_core,
libsystemd_network,
- libudev_internal],
+ libudev_static],
dependencies : [threads,
libkmod,
libidn,
include_directories : includes,
link_with : [libnetworkd_core,
libsystemd_network,
- libudev_internal,
+ libudev_static,
libshared],
dependencies : [threads],
install_rpath : rootlibexecdir,
install_dir : rootbindir)
public_programs += [exe]
endif
+
+executable('systemd-sulogin-shell',
+ ['src/sulogin-shell/sulogin-shell.c'],
+ include_directories : includes,
+ link_with : [libshared],
+ install_rpath : rootlibexecdir,
+ install : true,
+ install_dir : rootlibexecdir)
+
############################################################
foreach tuple : tests
subdir('sysctl.d')
subdir('sysusers.d')
subdir('tmpfiles.d')
+subdir('presets')
subdir('hwdb')
subdir('network')
subdir('man')
install_data('xorg/50-systemd-user.sh',
install_dir : xinitrcdir)
-install_data('system-preset/90-systemd.preset',
- install_dir : systempresetdir)
install_data('modprobe.d/systemd.conf',
install_dir : modprobedir)
install_data('README',
'ENVIRONMENT.md',
'LICENSE.GPL2',
'LICENSE.LGPL2.1',
+ 'TRANSIENT-SETTINGS.md',
+ 'UIDS-GIDS.md',
'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
install_dir : docdir)
############################################################
+meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
+run_target(
+ 'check-api-docs',
+ depends : [man, libsystemd, libudev],
+ command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
+
+############################################################
+
status = [
'@0@ @1@'.format(meson.project_name(), meson.project_version()),
- 'prefix: @0@'.format(prefixdir),
- 'rootprefix: @0@'.format(rootprefixdir),
- 'sysconf dir: @0@'.format(sysconfdir),
- 'includedir: @0@'.format(includedir),
- 'lib dir: @0@'.format(libdir),
- 'rootlib dir: @0@'.format(rootlibdir),
+ 'prefix directory: @0@'.format(prefixdir),
+ 'rootprefix directory: @0@'.format(rootprefixdir),
+ 'sysconf directory: @0@'.format(sysconfdir),
+ 'include directory: @0@'.format(includedir),
+ 'lib directory: @0@'.format(libdir),
+ 'rootlib directory: @0@'.format(rootlibdir),
'SysV init scripts: @0@'.format(sysvinit_path),
'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
- 'PAM modules dir: @0@'.format(pamlibdir),
- 'PAM configuration dir: @0@'.format(pamconfdir),
- 'RPM macros dir: @0@'.format(rpmmacrosdir),
- 'modprobe.d dir: @0@'.format(modprobedir),
- 'D-Bus policy dir: @0@'.format(dbuspolicydir),
- 'D-Bus session dir: @0@'.format(dbussessionservicedir),
- 'D-Bus system dir: @0@'.format(dbussystemservicedir),
- 'bash completions dir: @0@'.format(bashcompletiondir),
- 'zsh completions dir: @0@'.format(zshcompletiondir),
+ 'PAM modules directory: @0@'.format(pamlibdir),
+ 'PAM configuration directory: @0@'.format(pamconfdir),
+ 'RPM macros directory: @0@'.format(rpmmacrosdir),
+ 'modprobe.d directory: @0@'.format(modprobedir),
+ 'D-Bus policy directory: @0@'.format(dbuspolicydir),
+ 'D-Bus session directory: @0@'.format(dbussessionservicedir),
+ 'D-Bus system directory: @0@'.format(dbussystemservicedir),
+ 'bash completions directory: @0@'.format(bashcompletiondir),
+ 'zsh completions directory: @0@'.format(zshcompletiondir),
'extra start script: @0@'.format(get_option('rc-local')),
'extra stop script: @0@'.format(get_option('halt-local')),
'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
get_option('debug-tty')),
'TTY GID: @0@'.format(tty_gid),
+ 'users GID: @0@'.format(users_gid),
'maximum system UID: @0@'.format(system_uid_max),
'maximum system GID: @0@'.format(system_gid_max),
+ 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
+ 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
+ 'minimum container UID base: @0@'.format(container_uid_base_min),
+ 'maximum container UID base: @0@'.format(container_uid_base_max),
'/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
'render group access mode: @0@'.format(get_option('group-render-mode')),
- 'certificate root: @0@'.format(get_option('certificate-root')),
+ 'certificate root directory: @0@'.format(get_option('certificate-root')),
'support URL: @0@'.format(support_url),
- 'nobody user name: @0@'.format(get_option('nobody-user')),
- 'nobody group name: @0@'.format(get_option('nobody-group')),
+ 'nobody user name: @0@'.format(nobody_user),
+ 'nobody group name: @0@'.format(nobody_group),
'fallback hostname: @0@'.format(get_option('fallback-hostname')),
'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
status += [
'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
'EFI CC @0@'.format(efi_cc),
- 'EFI libdir: @0@'.format(efi_libdir),
- 'EFI ldsdir: @0@'.format(efi_ldsdir),
- 'EFI includedir: @0@'.format(efi_incdir)]
+ 'EFI lib directory: @0@'.format(efi_libdir),
+ 'EFI lds directory: @0@'.format(efi_ldsdir),
+ 'EFI include directory: @0@'.format(efi_incdir)]
endif
endif
'disabled features: @0@'.format(', '.join(missing)),
'']
message('\n '.join(status))
+
+if rootprefixdir != rootprefix_default
+ message('WARNING:\n' +
+ ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
+ ' systemd used fixed names for unit file directories and other paths, so anything\n' +
+ ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
+endif