aboutsummaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorDmitry V. Levin <ldv@strace.io>2024-09-01 08:00:00 +0000
committerDmitry V. Levin <ldv@strace.io>2024-09-10 08:00:00 +0000
commit7fb6beed01bc1a59438b8b2a9b34b2dba296e553 (patch)
tree2f6ae951c4d94d331e29e348e6ffd9846687be33 /modules
parentaa3e91322cbc651bb130ec8636b28d676979d4fe (diff)
downloadpam-7fb6beed01bc1a59438b8b2a9b34b2dba296e553.tar.gz
pam-7fb6beed01bc1a59438b8b2a9b34b2dba296e553.tar.bz2
pam-7fb6beed01bc1a59438b8b2a9b34b2dba296e553.zip
meson: build Linux-PAM using meson
On my non-representative hardware, the full build using autotools (./autogen.sh && CFLAGS=-O2 ./configure && make -j`nproc` && make -j`nproc` install) takes about 45 seconds. On the same hardware, the full build using meson (meson setup -Doptimization=2 dir && meson compile -C dir && meson install -C dir) takes just about 7.5 seconds.
Diffstat (limited to 'modules')
-rw-r--r--modules/meson.build51
-rw-r--r--modules/module-meson.build510
l---------modules/pam_access/meson.build1
l---------modules/pam_canonicalize_user/meson.build1
l---------modules/pam_debug/meson.build1
l---------modules/pam_deny/meson.build1
l---------modules/pam_echo/meson.build1
l---------modules/pam_env/meson.build1
l---------modules/pam_exec/meson.build1
l---------modules/pam_faildelay/meson.build1
l---------modules/pam_faillock/meson.build1
l---------modules/pam_filter/meson.build1
-rw-r--r--modules/pam_filter/upperLOWER/meson.build9
l---------modules/pam_ftp/meson.build1
l---------modules/pam_group/meson.build1
l---------modules/pam_issue/meson.build1
l---------modules/pam_keyinit/meson.build1
l---------modules/pam_lastlog/meson.build1
l---------modules/pam_limits/meson.build1
l---------modules/pam_listfile/meson.build1
l---------modules/pam_localuser/meson.build1
l---------modules/pam_loginuid/meson.build1
l---------modules/pam_mail/meson.build1
l---------modules/pam_mkhomedir/meson.build1
l---------modules/pam_motd/meson.build1
l---------modules/pam_namespace/meson.build1
l---------modules/pam_nologin/meson.build1
l---------modules/pam_permit/meson.build1
l---------modules/pam_pwhistory/meson.build1
l---------modules/pam_rhosts/meson.build1
l---------modules/pam_rootok/meson.build1
l---------modules/pam_securetty/meson.build1
l---------modules/pam_selinux/meson.build1
l---------modules/pam_sepermit/meson.build1
l---------modules/pam_setquota/meson.build1
l---------modules/pam_shells/meson.build1
l---------modules/pam_stress/meson.build1
l---------modules/pam_succeed_if/meson.build1
l---------modules/pam_time/meson.build1
l---------modules/pam_timestamp/meson.build1
l---------modules/pam_tty_audit/meson.build1
l---------modules/pam_umask/meson.build1
l---------modules/pam_unix/meson.build1
l---------modules/pam_userdb/meson.build1
l---------modules/pam_usertype/meson.build1
l---------modules/pam_warn/meson.build1
l---------modules/pam_wheel/meson.build1
l---------modules/pam_xauth/meson.build1
48 files changed, 615 insertions, 0 deletions
diff --git a/modules/meson.build b/modules/meson.build
new file mode 100644
index 00000000..20cebdbb
--- /dev/null
+++ b/modules/meson.build
@@ -0,0 +1,51 @@
+pam_module_map = 'modules.map'
+pam_module_map_path = meson.current_source_dir() / pam_module_map
+
+pam_module_link_deps = ['..' / pam_module_map]
+pam_module_link_args = ['-Wl,--version-script=' + pam_module_map_path]
+
+subdir('pam_access')
+subdir('pam_canonicalize_user')
+subdir('pam_debug')
+subdir('pam_deny')
+subdir('pam_echo')
+subdir('pam_env')
+subdir('pam_exec')
+subdir('pam_faildelay')
+subdir('pam_faillock')
+subdir('pam_filter')
+subdir('pam_ftp')
+subdir('pam_group')
+subdir('pam_issue')
+subdir('pam_keyinit')
+subdir('pam_lastlog')
+subdir('pam_limits')
+subdir('pam_listfile')
+subdir('pam_localuser')
+subdir('pam_loginuid')
+subdir('pam_mail')
+subdir('pam_mkhomedir')
+subdir('pam_motd')
+subdir('pam_namespace')
+subdir('pam_nologin')
+subdir('pam_permit')
+subdir('pam_pwhistory')
+subdir('pam_rhosts')
+subdir('pam_rootok')
+subdir('pam_securetty')
+subdir('pam_selinux')
+subdir('pam_sepermit')
+subdir('pam_setquota')
+subdir('pam_shells')
+subdir('pam_stress')
+subdir('pam_succeed_if')
+subdir('pam_time')
+subdir('pam_timestamp')
+subdir('pam_tty_audit')
+subdir('pam_umask')
+subdir('pam_unix')
+subdir('pam_userdb')
+subdir('pam_usertype')
+subdir('pam_warn')
+subdir('pam_wheel')
+subdir('pam_xauth')
diff --git a/modules/module-meson.build b/modules/module-meson.build
new file mode 100644
index 00000000..3804221e
--- /dev/null
+++ b/modules/module-meson.build
@@ -0,0 +1,510 @@
+# -*- mode: meson -*-
+
+module = fs.name(meson.current_source_dir())
+
+# pam_module.so
+
+pam_module_src = [module + '.c']
+pam_module_c_args = []
+pam_module_deps = [libpam_internal_dep, libpam_dep]
+
+if module == 'pam_env'
+ pam_module_deps += [libeconf]
+endif
+if module == 'pam_faillock'
+ pam_module_src += ['faillock.c', 'faillock_config.c']
+ pam_module_deps += [libaudit]
+endif
+if module == 'pam_issue'
+ pam_module_deps += [libsystemd]
+endif
+if module == 'pam_keyinit'
+ if not enable_pam_keyinit
+ subdir_done()
+ endif
+endif
+if module == 'pam_lastlog'
+ if not enable_pam_lastlog
+ subdir_done()
+ endif
+ pam_module_deps += [libutil]
+endif
+if module == 'pam_limits'
+ limits_conf_dir = sconfigdir / 'limits.d'
+ pam_module_c_args += ['-DLIMITS_FILE_DIR="@0@"'.format(limits_conf_dir)]
+ pam_module_deps += [libsystemd]
+endif
+if module == 'pam_loginuid'
+ pam_module_deps += [libaudit]
+endif
+if module == 'pam_mkhomedir'
+ pam_module_c_args += ['-DMKHOMEDIR_HELPER="@0@"'.format(sbindir / 'mkhomedir_helper')]
+endif
+if module == 'pam_namespace'
+ if cdata.get('HAVE_UNSHARE', 0) == 0
+ subdir_done()
+ endif
+ pam_module_src += ['md5.c', 'argv_parse.c']
+ pam_module_deps += [libselinux]
+endif
+if module == 'pam_pwhistory'
+ pam_module_src += ['opasswd.c', 'pwhistory_config.c']
+ if libselinux.found()
+ pam_module_c_args += ['-DPWHISTORY_HELPER="@0@"'.format(sbindir / 'pwhistory_helper')]
+ endif
+ pam_module_deps += [libcrypt, libselinux]
+endif
+if module == 'pam_rhosts'
+ if cdata.get('HAVE_RUSEROK', 0) == 0 or cdata.get('HAVE_RUSEROK_AF', 0) == 0
+ subdir_done()
+ endif
+endif
+if module == 'pam_rootok'
+ pam_module_deps += [libselinux, libaudit]
+endif
+if module == 'pam_selinux'
+ if not libselinux.found()
+ subdir_done()
+ endif
+ pam_module_deps += [libselinux, libaudit]
+endif
+if module == 'pam_sepermit'
+ if not libselinux.found()
+ subdir_done()
+ endif
+ pam_module_deps += [libselinux]
+ sepermit_lockdir = localstatedir / 'run' / 'sepermit'
+ pam_module_c_args += ['-DSEPERMIT_LOCKDIR="@0@"'.format(sepermit_lockdir)]
+endif
+if module == 'pam_setquota'
+ if cdata.get('HAVE_QUOTACTL', 0) == 0
+ subdir_done()
+ endif
+endif
+if module == 'pam_shells'
+ pam_module_deps += [libeconf]
+endif
+if module == 'pam_timestamp'
+ if cdata.get('WITH_OPENSSL', 0) == 1
+ pam_module_src += ['hmac_openssl_wrapper.c']
+ else
+ pam_module_src += ['hmacsha1.c', 'sha1.c']
+ endif
+ pam_module_deps += [libcrypto, libsystemd]
+endif
+if module == 'pam_tty_audit'
+ if cdata.get('HAVE_STRUCT_AUDIT_TTY_STATUS', 0) == 0
+ subdir_done()
+ endif
+endif
+if module == 'pam_unix'
+ if not enable_pam_unix
+ subdir_done()
+ endif
+ pam_module_src = ['bigcrypt.c',
+ 'pam_unix_acct.c',
+ 'pam_unix_auth.c',
+ 'pam_unix_passwd.c',
+ 'pam_unix_sess.c',
+ 'support.c',
+ 'passverify.c',
+ 'md5_good.c',
+ 'md5_broken.c',
+ ]
+ if enable_nis
+ pam_module_src += ['yppasswd_xdr.c']
+ endif
+ pam_module_c_args += ['-DCHKPWD_HELPER="@0@"'.format(sbindir / 'unix_chkpwd'),
+ '-DUPDATE_HELPER="@0@"'.format(sbindir / 'unix_update')]
+ pam_module_deps += [libcrypt, libselinux, libtirpc, libnsl]
+endif
+if module == 'pam_userdb'
+ if not enable_pam_userdb
+ subdir_done()
+ endif
+ pam_module_deps += [libdb, libcrypt]
+endif
+if module == 'pam_xauth'
+ pam_module_deps += [libselinux]
+endif
+
+pam_module = shared_module(
+ module,
+ name_prefix: '',
+ sources: pam_module_src,
+ dependencies: pam_module_deps,
+ c_args: pam_module_c_args,
+ link_depends: pam_module_link_deps,
+ link_args: pam_module_link_args,
+ install: true,
+ install_dir: securedir,
+)
+
+
+# pam_module.8
+
+pam_module_mans = [[module + '.8', []]]
+if module == 'pam_access'
+ pam_module_mans += [['access.conf.5', []]]
+endif
+if module == 'pam_env'
+ pam_module_mans += [['pam_env.conf.5', ['environment.5']]]
+endif
+if module == 'pam_group'
+ pam_module_mans += [['group.conf.5', []]]
+endif
+if module == 'pam_faillock'
+ pam_module_mans += [['faillock.8', []],
+ ['faillock.conf.5', []]]
+endif
+if module == 'pam_limits'
+ pam_module_mans += [['limits.conf.5', []]]
+endif
+if module == 'pam_mkhomedir'
+ pam_module_mans += [['mkhomedir_helper.8', []]]
+endif
+if module == 'pam_namespace'
+ pam_module_mans += [['namespace.conf.5', []],
+ [module + '_helper.8', []]]
+endif
+if module == 'pam_pwhistory'
+ pam_module_mans += [['pwhistory.conf.5', []]]
+ if libselinux.found()
+ pam_module_mans += [['pwhistory_helper.8', []]]
+ endif
+endif
+if module == 'pam_sepermit'
+ pam_module_mans += [['sepermit.conf.5', []]]
+endif
+if module == 'pam_time'
+ pam_module_mans += [['time.conf.5', []]]
+endif
+if module == 'pam_timestamp'
+ pam_module_mans += [['pam_timestamp_check.8', []]]
+endif
+if module == 'pam_unix'
+ pam_module_mans += [['unix_chkpwd.8', []]]
+ if libselinux.found()
+ pam_module_mans += [['unix_update.8', []]]
+ endif
+endif
+
+foreach man: pam_module_mans
+ xml = man[0] + '.xml'
+
+ run_command([prog_xmllint,
+ '--nonet',
+ '--noout',
+ '--xinclude',
+ '--relaxng', docbook_rng,
+ xml],
+ check: true)
+
+ custom_target(man[0],
+ input: xml,
+ output: man,
+ depends: [custom_man_xsl, pam_module],
+ command: [prog_xsltproc,
+ '-o', '@OUTPUT0@',
+ '--nonet',
+ '--xinclude',
+ '--path', meson.current_source_dir(),
+ stringparam_vendordir,
+ stringparam_profileconditions,
+ custom_man_xsl,
+ '@INPUT@'],
+ install: true,
+ install_dir: mandir / 'man' + man[0].substring(-1),
+ install_tag: 'man',
+ )
+endforeach
+
+
+# README
+
+readme_html = custom_target(
+ input: 'README.xml',
+ output: 'README.html',
+ depends: pam_module,
+ command: [prog_xsltproc,
+ '-o', '@OUTPUT@',
+ '--nonet',
+ '--xinclude',
+ '--path', meson.current_source_dir(),
+ '--stringparam', 'generate.toc', 'none',
+ stringparam_vendordir,
+ stringparam_profileconditions,
+ txt_stylesheet,
+ '@INPUT@'],
+)
+
+custom_target(
+ input: readme_html,
+ output: module + '.txt',
+ command: [redir_exe,
+ '@INPUT@',
+ '@OUTPUT@',
+ browser],
+ install: true,
+ install_dir: docdir / 'modules',
+ install_tag: 'doc',
+)
+
+
+# module-specific configuration files and helpers
+
+if module == 'pam_access'
+ install_data(
+ 'access.conf',
+ install_dir: vendor_sconfigdir,
+ install_tag: 'config',
+ )
+endif
+if module == 'pam_env'
+ install_data(
+ 'pam_env.conf',
+ install_dir: vendor_sconfigdir,
+ install_tag: 'config',
+ )
+ install_data(
+ 'environment',
+ install_dir: sysconfdir,
+ install_tag: 'config',
+ )
+endif
+if module == 'pam_group'
+ install_data(
+ 'group.conf',
+ install_dir: vendor_sconfigdir,
+ install_tag: 'config',
+ )
+endif
+if module == 'pam_faillock'
+ executable(
+ 'faillock',
+ sources: ['main.c', 'faillock.c', 'faillock_config.c'],
+ link_args: exe_link_args,
+ dependencies: [libpam_internal_dep, libpam_dep, libaudit],
+ install: true,
+ install_dir: sbindir,
+ )
+ install_data(
+ 'faillock.conf',
+ install_dir: vendor_sconfigdir,
+ install_tag: 'config',
+ )
+endif
+if module == 'pam_filter'
+ install_data(
+ 'pam_filter.h',
+ install_dir: includedir,
+ install_tag: 'devel',
+ )
+endif
+if module == 'pam_limits'
+ install_data(
+ 'limits.conf',
+ install_dir: vendor_sconfigdir,
+ install_tag: 'config',
+ )
+ install_emptydir(
+ limits_conf_dir,
+ install_tag: 'config',
+ )
+endif
+if module == 'pam_mkhomedir'
+ executable(
+ 'mkhomedir_helper',
+ sources: ['mkhomedir_helper.c'],
+ link_args: exe_link_args,
+ dependencies: [libpam_internal_dep, libpam_dep],
+ install: true,
+ install_dir: sbindir,
+ )
+endif
+if module == 'pam_namespace'
+ pam_namespace_helper = configure_file(
+ input: 'pam_namespace_helper.in',
+ output: 'pam_namespace_helper',
+ configuration: cdata
+ )
+ install_data(
+ pam_namespace_helper,
+ install_mode: 'rwxr-xr-x',
+ install_dir: sbindir,
+ install_tag: 'bin',
+ )
+ pam_namespace_service = configure_file(
+ input: 'pam_namespace.service.in',
+ output: 'pam_namespace.service',
+ configuration: cdata
+ )
+ install_data(
+ pam_namespace_service,
+ install_dir: systemdunitdir,
+ install_tag: 'config',
+ )
+ install_data(
+ 'namespace.conf',
+ install_dir: vendor_sconfigdir,
+ install_tag: 'config',
+ )
+ install_data(
+ 'namespace.init',
+ install_mode: 'rwxr-xr-x',
+ install_dir: vendor_sconfigdir,
+ install_tag: 'config',
+ )
+ install_emptydir(
+ sconfigdir / 'namespace.d',
+ install_tag: 'config',
+ )
+endif
+if module == 'pam_pwhistory'
+ executable(
+ 'pwhistory_helper',
+ sources: ['pwhistory_helper.c', 'opasswd.c'],
+ c_args: ['-DHELPER_COMPILE="pwhistory_helper"'],
+ link_args: exe_link_args,
+ dependencies: [libpam_internal_dep, libpam_dep, libcrypt],
+ install: true,
+ install_dir: sbindir,
+ )
+ install_data(
+ 'pwhistory.conf',
+ install_dir: vendor_sconfigdir,
+ install_tag: 'config',
+ )
+endif
+if module == 'pam_selinux'
+ executable(
+ 'pam_selinux_check',
+ sources: ['pam_selinux_check.c'],
+ include_directories: [libpamc_inc],
+ link_args: exe_link_args,
+ dependencies: [libpam_internal_dep, libpam_dep, libpam_misc_dep],
+ )
+endif
+if module == 'pam_sepermit'
+ install_data(
+ 'sepermit.conf',
+ install_dir: vendor_sconfigdir,
+ install_tag: 'config',
+ )
+ install_emptydir(
+ sepermit_lockdir,
+ install_tag: 'config',
+ )
+endif
+if module == 'pam_time'
+ install_data(
+ 'time.conf',
+ install_dir: vendor_sconfigdir,
+ install_tag: 'config',
+ )
+endif
+if module == 'pam_timestamp'
+ executable(
+ 'pam_timestamp_check',
+ sources: ['pam_timestamp_check.c'],
+ link_args: exe_link_args,
+ dependencies: [libpam_internal_dep, libpam_dep, libsystemd],
+ install: true,
+ install_dir: sbindir,
+ )
+endif
+if module == 'pam_unix'
+ executable(
+ 'unix_chkpwd',
+ sources: ['unix_chkpwd.c',
+ 'audit.c',
+ 'bigcrypt.c',
+ 'md5_good.c',
+ 'md5_broken.c',
+ 'passverify.c',
+ ],
+ c_args: ['-DHELPER_COMPILE="unix_chkpwd"'],
+ link_args: exe_link_args,
+ dependencies: [libpam_internal_dep, libpam_dep, libcrypt, libselinux, libaudit],
+ install: true,
+ install_dir: sbindir,
+ )
+ if libselinux.found()
+ executable(
+ 'unix_update',
+ sources: ['unix_update.c',
+ 'audit.c',
+ 'bigcrypt.c',
+ 'md5_good.c',
+ 'md5_broken.c',
+ 'passverify.c',
+ ],
+ c_args: ['-DHELPER_COMPILE="unix_update"'],
+ link_args: exe_link_args,
+ dependencies: [libpam_internal_dep, libpam_dep, libcrypt, libselinux, libaudit],
+ install: true,
+ install_dir: sbindir,
+ )
+ endif
+ executable(
+ 'bigcrypt',
+ sources: ['bigcrypt.c', 'bigcrypt_main.c'],
+ dependencies: [libpam_internal_dep, libpam_dep, libcrypt],
+ )
+endif
+
+
+# tests
+
+test(
+ 'dlopen ' + module,
+ tst_dlopen,
+ args: [pam_module],
+)
+
+tst_module_retval_name = 'tst-' + module + '-retval'
+tst_module_retval_src = tst_module_retval_name + '.c'
+
+if fs.exists(tst_module_retval_src)
+ tst_module_retval_link_args = ''
+ if module == 'pam_canonicalize_user'
+ tst_module_retval_link_args = '-Wl,--export-dynamic'
+ endif
+
+ tst_module_retval_deps = [libpam_internal_dep, libpam_dep]
+ if module == 'pam_rootok'
+ tst_module_retval_deps += [libselinux, libaudit]
+ endif
+
+ tst_module_retval = executable(
+ tst_module_retval_name,
+ sources: tst_module_retval_src,
+ dependencies: tst_module_retval_deps,
+ link_args: tst_module_retval_link_args,
+ )
+
+ test(
+ tst_module_retval_name,
+ chdir_meson_build_subdir,
+ args: [tst_module_retval],
+ env: ['MESON_BUILD_SUBDIR=' + meson.current_build_dir()],
+ )
+endif
+
+
+if module == 'pam_timestamp' and cdata.get('WITH_OPENSSL', 0) != 1
+ hmacfile_exe = executable(
+ 'hmacfile',
+ sources: ['hmacfile.c', 'hmacsha1.c', 'sha1.c'],
+ dependencies: [libpam_internal_dep, libpam_dep],
+ )
+ test(
+ 'pam_timestamp hmacfile',
+ hmacfile_exe,
+ )
+endif
+
+
+if module == 'pam_filter'
+ subdir('upperLOWER')
+endif
diff --git a/modules/pam_access/meson.build b/modules/pam_access/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_access/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_canonicalize_user/meson.build b/modules/pam_canonicalize_user/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_canonicalize_user/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_debug/meson.build b/modules/pam_debug/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_debug/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_deny/meson.build b/modules/pam_deny/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_deny/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_echo/meson.build b/modules/pam_echo/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_echo/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_env/meson.build b/modules/pam_env/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_env/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_exec/meson.build b/modules/pam_exec/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_exec/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_faildelay/meson.build b/modules/pam_faildelay/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_faildelay/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_faillock/meson.build b/modules/pam_faillock/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_faillock/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_filter/meson.build b/modules/pam_filter/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_filter/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_filter/upperLOWER/meson.build b/modules/pam_filter/upperLOWER/meson.build
new file mode 100644
index 00000000..8992fff1
--- /dev/null
+++ b/modules/pam_filter/upperLOWER/meson.build
@@ -0,0 +1,9 @@
+executable(
+ 'upperLOWER',
+ sources: ['upperLOWER.c'],
+ include_directories: ['..'],
+ link_args: exe_link_args,
+ dependencies: [libpam_internal_dep, libpam_dep],
+ install: true,
+ install_dir: securedir / 'pam_filter',
+)
diff --git a/modules/pam_ftp/meson.build b/modules/pam_ftp/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_ftp/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_group/meson.build b/modules/pam_group/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_group/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_issue/meson.build b/modules/pam_issue/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_issue/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_keyinit/meson.build b/modules/pam_keyinit/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_keyinit/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_lastlog/meson.build b/modules/pam_lastlog/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_lastlog/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_limits/meson.build b/modules/pam_limits/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_limits/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_listfile/meson.build b/modules/pam_listfile/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_listfile/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_localuser/meson.build b/modules/pam_localuser/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_localuser/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_loginuid/meson.build b/modules/pam_loginuid/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_loginuid/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_mail/meson.build b/modules/pam_mail/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_mail/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_mkhomedir/meson.build b/modules/pam_mkhomedir/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_mkhomedir/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_motd/meson.build b/modules/pam_motd/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_motd/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_namespace/meson.build b/modules/pam_namespace/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_namespace/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_nologin/meson.build b/modules/pam_nologin/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_nologin/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_permit/meson.build b/modules/pam_permit/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_permit/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_pwhistory/meson.build b/modules/pam_pwhistory/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_pwhistory/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_rhosts/meson.build b/modules/pam_rhosts/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_rhosts/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_rootok/meson.build b/modules/pam_rootok/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_rootok/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_securetty/meson.build b/modules/pam_securetty/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_securetty/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_selinux/meson.build b/modules/pam_selinux/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_selinux/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_sepermit/meson.build b/modules/pam_sepermit/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_sepermit/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_setquota/meson.build b/modules/pam_setquota/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_setquota/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_shells/meson.build b/modules/pam_shells/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_shells/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_stress/meson.build b/modules/pam_stress/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_stress/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_succeed_if/meson.build b/modules/pam_succeed_if/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_succeed_if/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_time/meson.build b/modules/pam_time/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_time/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_timestamp/meson.build b/modules/pam_timestamp/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_timestamp/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_tty_audit/meson.build b/modules/pam_tty_audit/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_tty_audit/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_umask/meson.build b/modules/pam_umask/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_umask/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_unix/meson.build b/modules/pam_unix/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_unix/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_userdb/meson.build b/modules/pam_userdb/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_userdb/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_usertype/meson.build b/modules/pam_usertype/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_usertype/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_warn/meson.build b/modules/pam_warn/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_warn/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_wheel/meson.build b/modules/pam_wheel/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_wheel/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file
diff --git a/modules/pam_xauth/meson.build b/modules/pam_xauth/meson.build
new file mode 120000
index 00000000..ba2e9b52
--- /dev/null
+++ b/modules/pam_xauth/meson.build
@@ -0,0 +1 @@
+../module-meson.build \ No newline at end of file