# SPDX-License-Identifier: LGPL-2.1-or-later

shared_sources = files(
        'acl-util.h',
        'acpi-fpdt.c',
        'acpi-fpdt.h',
        'apparmor-util.c',
        'apparmor-util.h',
        'ask-password-api.c',
        'ask-password-api.h',
        'barrier.c',
        'barrier.h',
        'base-filesystem.c',
        'base-filesystem.h',
        'binfmt-util.c',
        'binfmt-util.h',
        'bitmap.c',
        'bitmap.h',
        'blkid-util.h',
        'blockdev-util.c',
        'blockdev-util.h',
        'bond-util.c',
        'bond-util.h',
        'boot-timestamps.c',
        'boot-timestamps.h',
        'bootspec.c',
        'bootspec.h',
        'bpf-dlopen.c',
        'bpf-dlopen.h',
        'bpf-program.c',
        'bpf-program.h',
        'bridge-util.c',
        'bridge-util.h',
        'btrfs-util.c',
        'btrfs-util.h',
        'bus-get-properties.c',
        'bus-get-properties.h',
        'bus-locator.c',
        'bus-locator.h',
        'bus-log-control-api.c',
        'bus-log-control-api.h',
        'bus-map-properties.c',
        'bus-map-properties.h',
        'bus-message-util.c',
        'bus-message-util.h',
        'bus-object.c',
        'bus-object.h',
        'bus-polkit.c',
        'bus-polkit.h',
        'bus-print-properties.c',
        'bus-print-properties.h',
        'bus-unit-procs.c',
        'bus-unit-procs.h',
        'bus-unit-util.c',
        'bus-unit-util.h',
        'bus-util.c',
        'bus-util.h',
        'bus-wait-for-jobs.c',
        'bus-wait-for-jobs.h',
        'bus-wait-for-units.c',
        'bus-wait-for-units.h',
        'calendarspec.c',
        'calendarspec.h',
        'cgroup-setup.c',
        'cgroup-setup.h',
        'cgroup-show.c',
        'cgroup-show.h',
        'chown-recursive.c',
        'chown-recursive.h',
        'clean-ipc.c',
        'clean-ipc.h',
        'clock-util.c',
        'clock-util.h',
        'condition.c',
        'condition.h',
        'conf-parser.c',
        'conf-parser.h',
        'copy.c',
        'copy.h',
        'coredump-util.c',
        'coredump-util.h',
        'cpu-set-util.c',
        'cpu-set-util.h',
        'creds-util.c',
        'creds-util.h',
        'cryptsetup-util.c',
        'cryptsetup-util.h',
        'daemon-util.h',
        'data-fd-util.c',
        'data-fd-util.h',
        'dev-setup.c',
        'dev-setup.h',
        'device-nodes.c',
        'device-nodes.h',
        'devnode-acl.h',
        'discover-image.c',
        'discover-image.h',
        'dissect-image.c',
        'dissect-image.h',
        'dlfcn-util.c',
        'dlfcn-util.h',
        'dm-util.c',
        'dm-util.h',
        'dns-domain.c',
        'dns-domain.h',
        'dropin.c',
        'dropin.h',
        'efi-loader.c',
        'efi-loader.h',
        'elf-util.c',
        'elf-util.h',
        'enable-mempool.c',
        'env-file-label.c',
        'env-file-label.h',
        'ethtool-util.c',
        'ethtool-util.h',
        'exec-util.c',
        'exec-util.h',
        'exit-status.c',
        'exit-status.h',
        'extension-release.c',
        'extension-release.h',
        'fdisk-util.h',
        'fdset.c',
        'fdset.h',
        'fileio-label.c',
        'fileio-label.h',
        'firewall-util-nft.c',
        'firewall-util-private.h',
        'firewall-util.c',
        'firewall-util.h',
        'format-table.c',
        'format-table.h',
        'fsck-util.h',
        'fstab-util.c',
        'fstab-util.h',
        'generator.c',
        'generator.h',
        'geneve-util.c',
        'geneve-util.h',
        'gpt.c',
        'gpt.h',
        'group-record.c',
        'group-record.h',
        'hostname-setup.c',
        'hostname-setup.h',
        'hwdb-util.c',
        'hwdb-util.h',
        'id128-print.c',
        'id128-print.h',
        'idn-util.c',
        'idn-util.h',
        'ima-util.c',
        'ima-util.h',
        'import-util.c',
        'import-util.h',
        'in-addr-prefix-util.c',
        'in-addr-prefix-util.h',
        'initreq.h',
        'install-file.c',
        'install-file.h',
        'install-printf.c',
        'install-printf.h',
        'install.c',
        'install.h',
        'ip-protocol-list.c',
        'ip-protocol-list.h',
        'ipvlan-util.c',
        'ipvlan-util.h',
        'journal-importer.c',
        'journal-importer.h',
        'journal-util.c',
        'journal-util.h',
        'json-internal.h',
        'json.c',
        'json.h',
        'kbd-util.c',
        'kbd-util.h',
        'keyring-util.h',
        'keyring-util.c',
        'killall.c',
        'killall.h',
        'label.c',
        'label.h',
        'libcrypt-util.c',
        'libcrypt-util.h',
        'libfido2-util.c',
        'libfido2-util.h',
        'libmount-util.h',
        'linux/auto_dev-ioctl.h',
        'linux/bpf.h',
        'linux/bpf_common.h',
        'linux/bpf_insn.h',
        'linux/dm-ioctl.h',
        'linux/ethtool.h',
        'local-addresses.c',
        'local-addresses.h',
        'lockfile-util.c',
        'lockfile-util.h',
        'log-link.h',
        'logs-show.c',
        'logs-show.h',
        'loop-util.c',
        'loop-util.h',
        'loopback-setup.c',
        'loopback-setup.h',
        'machine-id-setup.c',
        'machine-id-setup.h',
        'machine-pool.c',
        'machine-pool.h',
        'macvlan-util.c',
        'macvlan-util.h',
        'main-func.h',
        'mkdir-label.c',
        'mkdir-label.h',
        'mkfs-util.c',
        'mkfs-util.h',
        'module-util.h',
        'mount-setup.c',
        'mount-setup.h',
        'mount-util.c',
        'mount-util.h',
        'net-condition.c',
        'net-condition.h',
        'netif-naming-scheme.c',
        'netif-naming-scheme.h',
        'netif-util.c',
        'netif-util.h',
        'nscd-flush.h',
        'nsflags.c',
        'nsflags.h',
        'numa-util.c',
        'numa-util.h',
        'openssl-util.c',
        'openssl-util.h',
        'output-mode.c',
        'output-mode.h',
        'pager.c',
        'pager.h',
        'parse-argument.c',
        'parse-argument.h',
        'parse-socket-bind-item.c',
        'parse-socket-bind-item.h',
        'pcre2-dlopen.c',
        'pcre2-dlopen.h',
        'pe-header.h',
        'pkcs11-util.c',
        'pkcs11-util.h',
        'pretty-print.c',
        'pretty-print.h',
        'psi-util.c',
        'psi-util.h',
        'ptyfwd.c',
        'ptyfwd.h',
        'pwquality-util.c',
        'pwquality-util.h',
        'qrcode-util.c',
        'qrcode-util.h',
        'quota-util.c',
        'quota-util.h',
        'reboot-util.c',
        'reboot-util.h',
        'resize-fs.c',
        'resize-fs.h',
        'resolve-util.c',
        'resolve-util.h',
        'rm-rf.c',
        'rm-rf.h',
        'seccomp-util.h',
        'securebits-util.c',
        'securebits-util.h',
        'selinux-util.c',
        'selinux-util.h',
        'serialize.c',
        'serialize.h',
        'service-util.c',
        'service-util.h',
        'sleep-config.c',
        'sleep-config.h',
        'smack-util.c',
        'smack-util.h',
        'socket-label.c',
        'socket-netlink.c',
        'socket-netlink.h',
        'spawn-ask-password-agent.c',
        'spawn-ask-password-agent.h',
        'spawn-polkit-agent.c',
        'spawn-polkit-agent.h',
        'specifier.c',
        'specifier.h',
        'switch-root.c',
        'switch-root.h',
        'tmpfile-util-label.c',
        'tmpfile-util-label.h',
        'tomoyo-util.c',
        'tomoyo-util.h',
        'tpm2-util.c',
        'tpm2-util.h',
        'udev-util.c',
        'udev-util.h',
        'uid-alloc-range.c',
        'uid-alloc-range.h',
        'uid-range.c',
        'uid-range.h',
        'user-record-nss.c',
        'user-record-nss.h',
        'user-record-show.c',
        'user-record-show.h',
        'user-record.c',
        'user-record.h',
        'userdb-dropin.c',
        'userdb-dropin.h',
        'userdb.c',
        'userdb.h',
        'utmp-wtmp.h',
        'varlink.c',
        'varlink.h',
        'verb-log-control.c',
        'verb-log-control.h',
        'verbs.c',
        'verbs.h',
        'vlan-util.c',
        'vlan-util.h',
        'volatile-util.c',
        'volatile-util.h',
        'watchdog.c',
        'watchdog.h',
        'web-util.c',
        'web-util.h',
        'wifi-util.c',
        'wifi-util.h',
        'xml.c',
        'xml.h',
)

if get_option('tests') != 'false'
        shared_sources += files(
                'test-tables.h',
                'tests.c',
                'tests.h',
        )
endif

generate_syscall_list = find_program('generate-syscall-list.py')
fname = 'syscall-list.h'
syscall_list_h = custom_target(
        fname,
        input : syscall_list_txt,
        output : fname,
        command : [generate_syscall_list,
                   '@INPUT@'],
        capture : true)

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

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

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

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

if conf.get('HAVE_LIBBPF') == 1
        shared_sources += files(
                'bpf-link.c',
                'bpf-link.h',
        )
endif

if conf.get('HAVE_KMOD') == 1
        shared_sources += files('module-util.c')
endif

if conf.get('HAVE_PAM') == 1
        shared_sources += files(
                'pam-util.c',
                'pam-util.h',
        )
endif

if conf.get('ENABLE_NSCD') == 1
        shared_sources += files('nscd-flush.c')
endif

generate_ip_protocol_list = find_program('generate-ip-protocol-list.sh')
ip_protocol_list_txt = custom_target(
        'ip-protocol-list.txt',
        output : 'ip-protocol-list.txt',
        command : [generate_ip_protocol_list, cpp],
        capture : true)

fname = 'ip-protocol-from-name.gperf'
gperf_file = custom_target(
        fname,
        input : ip_protocol_list_txt,
        output : fname,
        command : [generate_gperfs, 'ip_protocol', 'IPPROTO_', '@INPUT@'],
        capture : true)

fname = 'ip-protocol-from-name.h'
target1 = custom_target(
        fname,
        input : gperf_file,
        output : fname,
        command : [gperf,
                   '-L', 'ANSI-C', '-t', '--ignore-case',
                   '-N', 'lookup_ip_protocol',
                   '-H', 'hash_ip_protocol_name',
                   '-p', '-C',
                   '@INPUT@'],
        capture : true)

fname = 'ip-protocol-to-name.h'
awkscript = 'ip-protocol-to-name.awk'
target2 = custom_target(
        fname,
        input : [awkscript, ip_protocol_list_txt],
        output : fname,
        command : [awk, '-f', '@INPUT0@', '@INPUT1@'],
        capture : true)

shared_generated_gperf_headers = [target1, target2]
shared_sources += shared_generated_gperf_headers

libshared_name = 'systemd-shared-@0@'.format(meson.project_version())

libshared_deps = [threads,
                  libacl,
                  libblkid,
                  libcap,
                  libcrypt,
                  libdl,
                  libgcrypt,
                  libiptc,
                  libkmod,
                  liblz4,
                  libmount,
                  libopenssl,
                  libp11kit,
                  libpam,
                  librt,
                  libseccomp,
                  libselinux,
                  libzstd,
                  libxz]

libshared_sym_path = '@0@/libshared.sym'.format(meson.current_source_dir())

libshared_static = static_library(
        libshared_name,
        shared_sources,
        include_directories : includes,
        dependencies : libshared_deps,
        c_args : ['-fvisibility=default'],
        build_by_default : false)

libshared = shared_library(
        libshared_name,
        include_directories : includes,
        link_args : ['-shared',
                     '-Wl,--version-script=' + libshared_sym_path],
        link_whole : [libshared_static,
                      libbasic,
                      libbasic_gcrypt,
                      libsystemd_static],
        c_args : ['-fvisibility=default'],
        dependencies : libshared_deps,
        install : true,
        install_dir : rootlibexecdir)
