Browse Source

meson: add second build system

To build: meson build && ninja -C build
To run tests: ninja -C build check
To install for packaging: DESTDIR=/var/tmp/inst ninja -C build install
To install for realz: sudo ninja -C build install

v2:
- Optional items are now based on the 'feature' feature in meson.
  Built libraries which are disabled turn into disabler() objects
  and also poison any executables which link to them.

What is there:
- building of the binaries and libs and the python module
- installation of binaries, libs, python module, localization files,
  man pages, pkgconfig files
- running of tests
- most options to configure build equivalently to the
  ./configure settings

Partially implemented:
- disabling of stuff when things missing. In the C code, the defines
  are all used, so that should be fine. In the build system, some
  files should be skipped, but that is probably not always done properly.
  Getting this right might require some testing of various build option
  combinations to get the details right.

Not implemented:
- static builds of fdisk and other binaries
- things marked with XXX or FIXME
- ???

Differences:
- .la files are not created. They are useless and everybody hates them.
- Requires.private in pkgconfig files are not present in the
  autogenerated .pc file. Not sure if they should be there or not. If
  necessary, they can be added by hand.
- man pages and systemd units are installed by the install target. Not
  sure why 'make install' doesn't do that.
- the split between / and /usr is probably wrong. But it's all pointless
  anyway, so maybe we could simplify things but not implementing it at
  all under meson?
pull/1264/head
Zbigniew Jędrzejewski-Szmek 3 years ago committed by Karel Zak
parent
commit
d4c880d5a4
  1. 1
      .gitignore
  2. 95
      disk-utils/meson.build
  3. 3
      include/meson.build
  4. 92
      lib/meson.build
  5. 144
      libblkid/meson.build
  6. 67
      libfdisk/meson.build
  7. 80
      libmount/meson.build
  8. 34
      libmount/python/meson.build
  9. 48
      libsmartcols/meson.build
  10. 60
      libuuid/meson.build
  11. 75
      login-utils/meson.build
  12. 2828
      meson.build
  13. 184
      meson_options.txt
  14. 136
      misc-utils/meson.build
  15. 27
      po/LINGUAS
  16. 4
      po/meson.build
  17. 232
      sys-utils/meson.build
  18. 41
      term-utils/meson.build
  19. 24
      tests/functions.sh
  20. 6
      tests/run.sh
  21. 43
      text-utils/meson.build
  22. 12
      tools/meson-make-symlink.sh

1
.gitignore vendored

@ -181,3 +181,4 @@ ylwrap
/write
/zramctl
/uclampset
/build*/

95
disk-utils/meson.build

@ -0,0 +1,95 @@
mkfs_sources = files(
'mkfs.c',
)
mkfs_bfs_sources = files(
'mkfs.bfs.c',
)
isosize_sources = files(
'isosize.c',
)
mkswap_sources = files(
'mkswap.c',
)
swaplabel_sources = files(
'swaplabel.c',
) + \
swapprober_c
fsck_sources = files(
'fsck.c',
) + \
monotonic_c
mkfs_minix_sources = files(
'mkfs.minix.c',
'minix_programs.h',
)
fsck_minix_sources = files(
'fsck.minix.c',
'minix_programs.h',
)
mkfs_cramfs_sources = files(
'mkfs.cramfs.c',
'cramfs.h',
'cramfs_common.c',
)
fsck_cramfs_sources = files(
'fsck.cramfs.c',
'cramfs.h',
'cramfs_common.c',
)
raw_sources = files(
'raw.c',
)
fdformat_sources = files(
'fdformat.c',
)
blockdev_sources = files(
'blockdev.c',
)
fdisk_sources = files(
'fdisk.c',
'fdisk.h',
'fdisk-menu.c',
'fdisk-list.c',
'fdisk-list.h')
sfdisk_sources = files(
'sfdisk.c',
'fdisk-list.c',
'fdisk-list.h')
cfdisk_sources = files(
'cfdisk.c',
)
addpart_sources = files(
'addpart.c',
)
delpart_sources = files(
'delpart.c',
)
resizepart_sources = files(
'resizepart.c',
)
partx_sources = files(
'partx.c',
)
addpart_delpart_man = files(
'addpart.8',
'delpart.8',
'resizepart.8',
'partx.8',
)

3
include/meson.build

@ -0,0 +1,3 @@
dir_include = include_directories('.')
list_h = files('list.h')

92
lib/meson.build

@ -0,0 +1,92 @@
lib_common_sources = '''
blkdev.c
canonicalize.c
color-names.c
crc32.c
crc32c.c
encode.c
env.c
exec_shell.c
fileutils.c
ismounted.c
mangle.c
match.c
mbsalign.c
mbsedit.c
pager.c
pwdutils.c
setproctitle.c
signames.c
timeutils.c
ttyutils.c
'''.split()
idcache_c = files('idcache.c')
randutils_c = files('randutils.c')
md5_c = files('md5.c')
sha1_c = files('sha1.c')
strutils_c = files('strutils.c')
strv_c = files('strv.c')
lib_common_sources += [idcache_c,
randutils_c,
md5_c,
sha1_c,
strutils_c,
strv_c]
monotonic_c = files('monotonic.c')
timer_c = files('timer.c')
swapprober_c = files('swapprober.c')
pty_session_c = files('pty-session.c')
if LINUX
lib_common_sources += '''
caputils.c
linux_version.c
loopdev.c
'''.split()
endif
if build_plymouth_support
lib_common_sources += '''
plymouth-ctrl.c
'''.split()
endif
if conf.get('HAVE_LANGINFO_H') in [1]
lib_common_sources += 'langinfo.c'
endif
if conf.get('HAVE_CPU_SET_T') in [1]
lib_common_sources += 'cpuset.c'
endif
if conf.get('HAVE_OPENAT') in [1] and conf.get('HAVE_DIRFD') in [1]
lib_common_sources += '''
path.c
procutils.c
sysfs.c
'''.split()
endif
lib_common = static_library(
'common',
lib_common_sources,
include_directories : dir_include)
lib_color_sources = files('''
colors.c
color-names.c
'''.split())
# colors.h include/color-names.h
lib_tcolors = static_library(
'tcolors',
lib_color_sources,
include_directories : dir_include,
dependencies : curses_libs)
install_man(
'terminal-colors.d.5')

144
libblkid/meson.build

@ -0,0 +1,144 @@
dir_libblkid = include_directories('.', 'src')
blkid_h = configure_file(
input : 'src/blkid.h.in',
output : 'blkid.h',
configuration : conf)
lib_blkid_sources = '''
src/blkidP.h
src/init.c
src/cache.c
src/config.c
src/dev.c
src/devname.c
src/devno.c
src/encode.c
src/evaluate.c
src/getsize.c
src/llseek.c
src/probe.c
src/read.c
src/resolve.c
src/save.c
src/tag.c
src/verify.c
src/version.c
src/partitions/aix.c
src/partitions/aix.h
src/partitions/atari.c
src/partitions/bsd.c
src/partitions/dos.c
src/partitions/gpt.c
src/partitions/mac.c
src/partitions/minix.c
src/partitions/partitions.c
src/partitions/partitions.h
src/partitions/sgi.c
src/partitions/solaris_x86.c
src/partitions/sun.c
src/partitions/ultrix.c
src/partitions/unixware.c
src/superblocks/adaptec_raid.c
src/superblocks/apfs.c
src/superblocks/bcache.c
src/superblocks/befs.c
src/superblocks/bfs.c
src/superblocks/bitlocker.c
src/superblocks/bluestore.c
src/superblocks/btrfs.c
src/superblocks/cramfs.c
src/superblocks/ddf_raid.c
src/superblocks/drbd.c
src/superblocks/drbdproxy_datalog.c
src/superblocks/drbdmanage.c
src/superblocks/exfat.c
src/superblocks/exfs.c
src/superblocks/ext.c
src/superblocks/f2fs.c
src/superblocks/gfs.c
src/superblocks/hfs.c
src/superblocks/highpoint_raid.c
src/superblocks/hpfs.c
src/superblocks/iso9660.c
src/superblocks/isw_raid.c
src/superblocks/jfs.c
src/superblocks/jmicron_raid.c
src/superblocks/linux_raid.c
src/superblocks/lsi_raid.c
src/superblocks/luks.c
src/superblocks/lvm.c
src/superblocks/minix.c
src/superblocks/mpool.c
src/superblocks/netware.c
src/superblocks/nilfs.c
src/superblocks/ntfs.c
src/superblocks/refs.c
src/superblocks/nvidia_raid.c
src/superblocks/ocfs.c
src/superblocks/promise_raid.c
src/superblocks/reiserfs.c
src/superblocks/romfs.c
src/superblocks/silicon_raid.c
src/superblocks/squashfs.c
src/superblocks/stratis.c
src/superblocks/superblocks.c
src/superblocks/superblocks.h
src/superblocks/swap.c
src/superblocks/sysv.c
src/superblocks/ubi.c
src/superblocks/ubifs.c
src/superblocks/udf.c
src/superblocks/ufs.c
src/superblocks/vdo.c
src/superblocks/vfat.c
src/superblocks/via_raid.c
src/superblocks/vmfs.c
src/superblocks/vxfs.c
src/superblocks/xfs.c
src/superblocks/zfs.c
src/topology/topology.c
src/topology/topology.h
'''.split()
if LINUX
lib_blkid_sources += '''
src/topology/dm.c
src/topology/evms.c
src/topology/ioctl.c
src/topology/lvm.c
src/topology/md.c
src/topology/sysfs.c
'''.split()
endif
libblkid_sym = 'src/libblkid.sym'
libblkid_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libblkid_sym)
if build_libblkid and not have_dirfd and not have_ddfd
error('neither dirfd nor ddfd are available')
endif
lib_blkid = both_libraries(
'blkid',
list_h,
lib_blkid_sources,
include_directories : [dir_include, dir_libblkid],
link_depends : libblkid_sym,
version : libblkid_version,
link_args : ['-Wl,--version-script=@0@'.format(libblkid_sym_path)],
link_with : lib_common,
dependencies : build_libblkid ? [] : disabler(),
install : build_libblkid)
pkgconfig.generate(lib_blkid,
description : 'Block device id library',
subdirs : 'blkid',
version : pc_version)
if build_libblkid
install_man('libblkid.3')
endif

67
libfdisk/meson.build

@ -0,0 +1,67 @@
dir_libfdisk = include_directories('.', 'src')
defs = configuration_data()
defs.set('LIBFDISK_VERSION', libfdisk_version)
defs.set('LIBFDISK_MAJOR_VERSION', libfdisk_version.split('.')[0])
defs.set('LIBFDISK_MINOR_VERSION', libfdisk_version.split('.')[1])
defs.set('LIBFDISK_PATCH_VERSION', libfdisk_version.split('.')[2])
libfdisk_h = configure_file(
input : 'src/libfdisk.h.in',
output : 'libfdisk.h',
configuration : defs)
lib_fdisk_sources = '''
src/fdiskP.h
src/init.c
src/field.c
src/item.c
src/test.c
src/ask.c
src/alignment.c
src/label.c
src/utils.c
src/context.c
src/parttype.c
src/partition.c
src/table.c
src/iter.c
src/script.c
src/version.c
src/wipe.c
src/sun.c
src/sgi.c
src/dos.c
src/bsd.c
src/gpt.c
'''.split() + [
list_h,
]
libfdisk_sym = 'src/libfdisk.sym'
libfdisk_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libfdisk_sym)
lib_fdisk_includes = [dir_include,
dir_libblkid,
dir_libfdisk,
dir_libuuid] # XXX: should this be declared along with the lib?
lib_fdisk = both_libraries(
'fdisk',
list_h,
lib_fdisk_sources,
include_directories : lib_fdisk_includes,
link_depends : libfdisk_sym,
version : libfdisk_version,
link_args : ['-Wl,--version-script=@0@'.format(libfdisk_sym_path)],
link_with : [lib_common,
lib_blkid,
lib_uuid],
dependencies : build_libfdisk ? [] : disabler(),
install : build_libfdisk)
pkgconfig.generate(lib_fdisk,
description : 'fdisk library',
subdirs : 'libfdisk',
version : pc_version)

80
libmount/meson.build

@ -0,0 +1,80 @@
dir_libmount = include_directories('.', 'src')
defs = configuration_data()
defs.set('LIBMOUNT_VERSION', libmount_version)
defs.set('LIBMOUNT_MAJOR_VERSION', libmount_version.split('.')[0])
defs.set('LIBMOUNT_MINOR_VERSION', libmount_version.split('.')[1])
defs.set('LIBMOUNT_PATCH_VERSION', libmount_version.split('.')[2])
libmount_h = configure_file(
input : 'src/libmount.h.in',
output : 'libmount.h',
configuration : defs)
lib_mount_sources = '''
src/mountP.h
src/cache.c
src/fs.c
src/init.c
src/iter.c
src/lock.c
src/optmap.c
src/optstr.c
src/tab.c
src/tab_diff.c
src/tab_parse.c
src/tab_update.c
src/test.c
src/utils.c
src/version.c
'''.split() + [
list_h,
monotonic_c,
]
if LINUX
lib_mount_sources += '''
src/context.c
src/context_loopdev.c
src/context_veritydev.c
src/context_mount.c
src/context_umount.c
src/monitor.c
'''.split()
endif
if enable_btrfs
lib_mount_sources += 'src/btrfs.c'
endif
libmount_sym = 'src/libmount.sym'
libmount_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libmount_sym)
if build_libmount and not have_dirfd and not have_ddfd
error('neither dirfd nor ddfd are available')
endif
lib_mount = both_libraries(
'mount',
list_h,
lib_mount_sources,
monotonic_c,
include_directories : [dir_include,
dir_libmount,
dir_libblkid],
link_depends : libmount_sym,
version : libmount_version,
link_args : ['-Wl,--version-script=@0@'.format(libmount_sym_path)],
link_with : [lib_common,
lib_blkid],
dependencies : [lib_selinux,
lib_cryptsetup,
realtime_libs],
install : build_libmount)
pkgconfig.generate(lib_mount,
description : 'mount library',
subdirs : 'libmount',
version : pc_version)
subdir('python')

34
libmount/python/meson.build

@ -0,0 +1,34 @@
python_module = import('python')
python = python_module.find_installation(
get_option('python'),
required : get_option('build-python'),
disabler : true)
build_python = python.found()
pylibmount_sources = '''
pylibmount.c
pylibmount.h
fs.c
tab.c
'''.split()
if LINUX
pylibmount_sources += 'context.c'
endif
python.extension_module(
'pylibmount',
pylibmount_sources,
include_directories : [dir_include, dir_libmount],
subdir : 'libmount',
link_with : lib_mount,
dependencies : python.dependency(),
install : true)
if build_python
python.install_sources(
'__init__.py',
subdir : 'libmount',
pure : false)
endif

48
libsmartcols/meson.build

@ -0,0 +1,48 @@
dir_libsmartcols = include_directories('.', 'src')
defs = configuration_data()
defs.set('LIBSMARTCOLS_VERSION', libsmartcols_version)
libsmartcols_h = configure_file(
input : 'src/libsmartcols.h.in',
output : 'libsmartcols.h',
configuration : defs)
lib_smartcols_sources = '''
src/smartcolsP.h
src/iter.c
src/symbols.c
src/cell.c
src/column.c
src/line.c
src/table.c
src/print.c
src/fput.c
src/print-api.c
src/version.c
src/buffer.c
src/calculate.c
src/grouping.c
src/walk.c
src/init.c
'''.split()
libsmartcols_sym = 'src/libsmartcols.sym'
libsmartcols_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsmartcols_sym)
lib_smartcols = both_libraries(
'smartcols',
list_h,
lib_smartcols_sources,
include_directories : [dir_include, dir_libsmartcols],
link_depends : libsmartcols_sym,
version : libsmartcols_version,
link_args : ['-Wl,--version-script=@0@'.format(libsmartcols_sym_path)],
link_with : lib_common,
dependencies : build_libsmartcols ? [] : disabler(),
install : build_libsmartcols)
pkgconfig.generate(lib_smartcols,
description : 'table or tree library',
subdirs : 'libsmartcols',
version : pc_version)

60
libuuid/meson.build

@ -0,0 +1,60 @@
dir_libuuid = include_directories('src')
lib_uuid_sources = '''
src/uuidP.h
src/clear.c
src/compare.c
src/copy.c
src/gen_uuid.c
src/isnull.c
src/pack.c
src/parse.c
src/uuidd.h
src/uuid_time.c
'''.split()
predefined_c = files('src/predefined.c')
unpack_c = files('src/unpack.c')
unparse_c = files('src/unparse.c')
libuuid_sym = 'src/libuuid.sym'
libuuid_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libuuid_sym)
lib_uuid = both_libraries(
'uuid',
list_h,
lib_uuid_sources,
predefined_c,
unpack_c,
unparse_c,
randutils_c,
md5_c,
sha1_c,
include_directories : [dir_include, dir_libuuid],
link_depends : libuuid_sym,
version : libuuid_version,
link_args : ['-Wl,--version-script=@0@'.format(libuuid_sym_path)],
dependencies : [socket_libs,
build_libuuid ? [] : disabler()],
install : build_libuuid)
pkgconfig.generate(lib_uuid,
description : 'Universally unique id library',
subdirs : 'uuid',
version : pc_version)
if build_libuuid
install_man(
'man/uuid.3',
'man/uuid_clear.3',
'man/uuid_compare.3',
'man/uuid_copy.3',
'man/uuid_generate.3',
'man/uuid_is_null.3',
'man/uuid_parse.3',
'man/uuid_time.3',
'man/uuid_unparse.3',
'man/uuid_generate_random.3',
'man/uuid_generate_time.3',
'man/uuid_generate_time_safe.3')
endif

75
login-utils/meson.build

@ -0,0 +1,75 @@
chfn_chsh_sources = files(
'ch-common.c',
'ch-common.h',
)
chfn_chsh_deps = [lib_readline]
if chfn_chsh_password
chfn_chsh_sources += files(
'auth.c',
'auth.h',
)
chfn_chsh_deps += [
lib_pam,
lib_pam_misc,
]
endif
if lib_user.found()
chfn_chsh_sources += files(
'libuser.c',
'libuser.h',
)
chfn_chsh_deps += lib_user
else
chfn_chsh_sources += files(
'islocal.c',
'islocal.h',
'setpwnam.c',
'setpwnam.h',
)
endif
if lib_selinux.found()
chfn_chsh_sources += files(
'selinux_utils.c',
'selinux_utils.h',
)
chfn_chsh_deps += [lib_selinux]
endif
chfn_sources = files(
'chfn.c',
'logindefs.c',
'logindefs.h',
)
test_islocal_sources = files(
'islocal.c',
)
test_logindefs_sources = files(
'logindefs.c',
'logindefs.h',
)
test_consoles_sources = files(
'sulogin-consoles.c',
)
last_sources = files(
'last.c',
) + \
monotonic_c
login_sources = files(
'login.c',
'logindefs.c',
'logindefs.h',
)
sulogin_sources = files(
'sulogin.c',
'sulogin-consoles.c',
'sulogin-consoles.h',
)

2828
meson.build

@ -0,0 +1,2828 @@
project('util-linux', 'c',
version : '2.35-rc2',
license : 'GPLv2+')
pkgconfig = import('pkgconfig')
libblkid_version = '1.1.0'
libblkid_date = '11-Dec-2019'
libuuid_version = '1.3.0'
libmount_version = '1.1.0'
libsmartcols_version = '1.1.0'
libfdisk_version = '1.1.0'
prefixdir = get_option('prefix')
if not prefixdir.startswith('/')
error('Prefix is not absolute: "@0@"'.format(prefixdir))
endif
bindir = join_paths(prefixdir, get_option('bindir'))
sbindir = join_paths(prefixdir, get_option('sbindir'))
sysconfstaticdir = join_paths(prefixdir, 'lib')
docdir = '/usr/share/doc/util-linux'
runstatedir = '/run'
execprefixdir = '/usr'
usrbin_exec_dir = join_paths(execprefixdir, 'bin')
usrsbin_exec_dir = join_paths(execprefixdir, 'sbin')
add_project_arguments('-D_GNU_SOURCE', language : 'c')
cc = meson.get_compiler('c')
conf = configuration_data()
package_string = '@0@ @1@'.format(meson.project_name(), meson.project_version())
conf.set_quoted('PACKAGE_STRING', package_string)
conf.set_quoted('PACKAGE_VERSION', meson.project_version())
codes = [''' {print $1} ''',
''' {sub("-.*","",$2); print $2} ''',
''' {sub("-.*","",$3); print $3 ~ /^@<:@0-9@:>@+$/ ? $3 : 0} ''']
pc_version = []
foreach code : codes
res = run_command('bash', '-c',
'''echo '@0@' | awk -F. '@1@' '''.format(
meson.project_version(), code))
pc_version += res.stdout().strip()
endforeach
pc_version = '.'.join(pc_version)
conf.set_quoted('LIBBLKID_VERSION', libblkid_version)
conf.set_quoted('LIBBLKID_DATE', libblkid_date)
conf.set('bindir', bindir)
conf.set('sbindir', sbindir)
conf.set('runstatedir', runstatedir)
conf.set('usrsbin_execdir', usrsbin_exec_dir)
conf.set('docdir', docdir)
conf.set_quoted('_PATH_SYSCONFSTATICDIR', sysconfstaticdir)
conf.set_quoted('_PATH_RUNSTATEDIR', runstatedir)
conf.set_quoted('CONFIG_ADJTIME_PATH', '/etc/adjtime')
conf.set_quoted('ADJTIME_PATH', '/etc/adjtime') # yes, both are used :(
build_libblkid = not get_option('build-libblkid').disabled()
conf.set('HAVE_LIBBLKID', build_libblkid ? 1 : false)
summary('libblkid', build_libblkid ? 'enabled' : 'disabled', section : 'components')
build_libuuid = not get_option('build-libuuid').disabled()
conf.set('HAVE_LIBUUID', build_libuuid ? 1 : false)
summary('libuuid', build_libuuid ? 'enabled' : 'disabled', section : 'components')
build_libmount = not get_option('build-libmount').disabled()
conf.set('HAVE_LIBMOUNT', build_libmount ? 1 : false)
summary('libmount', build_libmount ? 'enabled' : 'disabled', section : 'components')
build_libsmartcols = not get_option('build-libsmartcols').disabled()
conf.set('HAVE_LIBSMARTCOLS', build_libsmartcols ? 1 : false)
summary('libsmartcols', build_libsmartcols ? 'enabled' : 'disabled', section : 'components')
build_libfdisk = not get_option('build-libfdisk').disabled()
conf.set('HAVE_LIBFDISK', build_libfdisk ? 1 : false)
summary('libfdisk', build_libfdisk ? 'enabled' : 'disabled', section : 'components')
build_uuidd = not get_option('build-uuidd').disabled()
conf.set('HAVE_UUIDD', build_uuidd ? 1 : false)
summary('uuidd', build_uuidd ? 'enabled' : 'disabled', section : 'components')
LINUX = host_machine.system() in ['linux']
BSD = host_machine.system() in ['dragonfly', 'freebsd', 'netbsd', 'openbsd']
############################################################
code = '''
#include <wchar.h>
#include <wctype.h>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
wchar_t wc;
wint_t w;
w = fgetwc(stdin);
if (w == WEOF)
return 1;
wc = w;
fputwc(wc,stdout);
return 0;
}
'''
have = cc.compiles(code, name : 'wchar_t support')
if not have and get_option('widechar').enabled()
error('widechar support requested but unavailable')
endif
if get_option('ncurses').enabled() and get_option('widechar').enabled()
error('widechar support is incompatible with non-wide ncurses')
endif
conf.set('HAVE_WIDECHAR', have ? 1 : false)
headers = '''
byteswap.h
crypt.h
endian.h
err.h
errno.h
fcntl.h
getopt.h
inttypes.h
langinfo.h
lastlog.h
libutil.h
locale.h
mntent.h
paths.h
pty.h
shadow.h
stdint.h
stdio_ext.h
stdlib.h
string.h
strings.h
unistd.h
utmp.h
utmpx.h
asm/io.h
linux/blkzoned.h
linux/capability.h
linux/cdrom.h
linux/compiler.h
linux/falloc.h
linux/fd.h
linux/fs.h
linux/net_namespace.h
linux/raw.h
linux/securebits.h
linux/tiocl.h
linux/version.h
linux/watchdog.h
net/if.h
net/if_dl.h
netinet/in.h
security/openpam.h
security/pam_appl.h
security/pam_misc.h
sys/disk.h
sys/disklabel.h
sys/endian.h
sys/file.h
sys/io.h
sys/ioccom.h
sys/ioctl.h
sys/mkdev.h
sys/mount.h
sys/param.h
sys/prctl.h
sys/resource.h
sys/signalfd.h
sys/socket.h
sys/sockio.h
sys/stat.h
sys/swap.h
sys/syscall.h
sys/sysmacros.h
sys/time.h
sys/timex.h
sys/ttydefaults.h
sys/types.h
sys/ucred.h
sys/un.h
'''.split()
lib_m = cc.find_library('m')
lib_tinfo = dependency(
'tinfo',
required : get_option('tinfo'))
lib_ncursesw = dependency(
'ncursesw',
required : get_option('ncursesw'))
if lib_ncursesw.found()
headers += ['ncursesw/ncurses.h',
'ncursesw/term.h',
'ncurses.h',
'term.h']
lib_ncurses = disabler()
else
lib_ncurses = dependency(
'ncurses',
required : get_option('ncurses'))
headers += ['ncurses.h',
'term.h']
endif
conf.set('HAVE_LIBNCURSESW', lib_ncursesw.found())
conf.set('HAVE_LIBNCURSES', lib_ncurses.found())
conf.set('HAVE_NCURSES', lib_ncursesw.found() or lib_ncurses.found())
lib_slang = dependency(
'slang',
required : get_option('slang'))
if lib_slang.found()
headers += ['slang.h',
'slang/slang.h',
'slcurses.h',
'slang/slcurses.h']
endif
conf.set('HAVE_SLANG', lib_slang.found())
foreach curses_libs : [lib_slang, lib_ncursesw, lib_ncurses]
if curses_libs.found()
break
endif
endforeach
lib_z = dependency(
'zlib',
required : get_option('zlib'))
lib_readline = dependency(
'readline',
required : get_option('readline'))
conf.set('HAVE_LIBREADLINE', lib_readline.found() ? 1 : false)
lib_pcre = dependency(
'libpcre2-8',
required : get_option('libpcre'))
conf.set('HAVE_PCRE', lib_pcre.found() ? 1 : false)
lib_user = dependency(
'libuser',
version : '>= 0.58',
required : get_option('libuser'))
conf.set('HAVE_LIBUSER', lib_user.found() ? 1 : false)
lib_util = cc.find_library(
'util',
required : get_option('libutil'))
conf.set('HAVE_LIBUTIL', lib_util.found() ? 1 : false)
lib_utempter = cc.find_library(
'utempter',
required : get_option('libutempter'))
conf.set('HAVE_LIBUTEMPTER', lib_utempter.found() ? 1 : false)
systemd = dependency(
'systemd',
required : get_option('systemd'))
lib_systemd = dependency(
'libsystemd',
required : get_option('systemd'))
conf.set('HAVE_LIBSYSTEMD', lib_systemd.found() ? 1 : false)
lib_udev = dependency(
'libudev',
required : get_option('systemd'))
conf.set('HAVE_LIBUDEV', lib_udev.found() ? 1 : false)
lib_crypt = cc.find_library('crypt')
lib_pam = cc.find_library('pam')
if lib_pam.found()
lib_pam_misc = cc.find_library('pam_misc')
lib_pam = [lib_pam, lib_pam_misc]
endif
lib_cryptsetup = dependency(
'libcryptsetup',
required : get_option('cryptsetup'))
conf.set('HAVE_CRYPTSETUP', lib_cryptsetup.found() ? 1 : false)
have = cc.has_function(
'crypt_activate_by_signed_key',
dependencies : lib_cryptsetup)
conf.set('HAVE_CRYPTSETUP', have ? 1 : false)
lib_cap_ng = dependency(
'libcap-ng')
lib_selinux = dependency(
'libselinux',
version : '>= 2.0',
required : get_option('selinux'))
conf.set('HAVE_LIBSELINUX', lib_selinux.found() ? 1 : false)
lib_audit = dependency(
'libaudit',
required : get_option('audit'))
conf.set('HAVE_LIBAUDIT', lib_audit.found() ? 1 : false)
conf.set('HAVE_SMACK', not get_option('smack').disabled())
foreach header : headers
have = cc.has_header(header)
conf.set('HAVE_' + header.underscorify().to_upper(), have ? 1 : false)
endforeach
header = 'linux/btrfs.h'
enable_btrfs = cc.has_header(header,
required : get_option('btrfs'))
conf.set('HAVE_' + header.underscorify().to_upper(), enable_btrfs ? 1 : false)
conf.set('HAVE_BTRFS_SUPPORT', enable_btrfs ? 1 : false)
prefix = conf.get('HAVE_LINUX_COMPILER_H') ? '#include <linux/compiler.h>' : ''
foreach header : [
'linux/blkpg.h',
'linux/major.h',
]
have = cc.has_header(header,
prefix : prefix)
conf.set('HAVE_' + header.underscorify().to_upper(), have ? 1 : false)
endforeach
have = cc.has_header('sched.h')
conf.set10('HAVE_DECL_CPU_ALLOC', have)
# We get -1 if the size cannot be determined
have_cpu_set_t = cc.sizeof('cpu_set_t', prefix : '#include <sched.h>') > 0
conf.set('HAVE_CPU_SET_T', have_cpu_set_t ? 1 : false)
have = cc.has_header_symbol('stdlib.h', 'environ')
conf.set10('HAVE_ENVIRON_DECL', have)
have = cc.has_header_symbol('signal.h', 'sighandler_t')
conf.set('HAVE_SIGHANDLER_T', have ? 1 : false)
have = cc.has_header_symbol('string.h', 'strsignal')
conf.set10('HAVE_STRSIGNAL_DECL', have)
have = cc.sizeof('union semun', prefix : '#include <sys/sem.h>') > 0
conf.set('HAVE_UNION_SEMUN', have ? 1 : false)
have = cc.compiles('''
#define _GNU_SOURCE 1
#include <langinfo.h>
int main(void) {
char *str;
str = nl_langinfo (ALTMON_1);
str = nl_langinfo (ALTMON_2);
str = nl_langinfo (ALTMON_3);
str = nl_langinfo (ALTMON_4);
str = nl_langinfo (ALTMON_5);
str = nl_langinfo (ALTMON_6);
str = nl_langinfo (ALTMON_7);
str = nl_langinfo (ALTMON_8);
str = nl_langinfo (ALTMON_9);
str = nl_langinfo (ALTMON_10);
str = nl_langinfo (ALTMON_11);
str = nl_langinfo (ALTMON_12);
return 0;
}
''',
name : 'langinfo.h defines ALTMON_x constants')
conf.set('HAVE_LANGINFO_ALTMON', have ? 1 : false)
have = cc.compiles('''
#define _GNU_SOURCE 1
#include <langinfo.h>
int main(void) {
char *str;
str = nl_langinfo (_NL_ABALTMON_1);
str = nl_langinfo (_NL_ABALTMON_2);
str = nl_langinfo (_NL_ABALTMON_3);
str = nl_langinfo (_NL_ABALTMON_4);
str = nl_langinfo (_NL_ABALTMON_5);
str = nl_langinfo (_NL_ABALTMON_6);
str = nl_langinfo (_NL_ABALTMON_7);
str = nl_langinfo (_NL_ABALTMON_8);
str = nl_langinfo (_NL_ABALTMON_9);
str = nl_langinfo (_NL_ABALTMON_10);
str = nl_langinfo (_NL_ABALTMON_11);
str = nl_langinfo (_NL_ABALTMON_12);
return 0;
}
''',
name : 'langinfo.h defines _NL_ABALTMON_x constants')
conf.set('HAVE_LANGINFO_NL_ABALTMON', have ? 1 : false)
funcs = '''
clearenv
__fpurge
fpurge
__fpending
secure_getenv
__secure_getenv
eaccess
err
errx
explicit_bzero
fmemopen
fseeko
fsync
utimensat
getdomainname
getdtablesize
getexecname
getmntinfo
getrandom
getrlimit
getsgnam
inotify_init
jrand48
lchown
llseek
lseek64
mempcpy
mkostemp
nanosleep
ntp_gettime
personality
pidfd_open
pidfd_send_signal
posix_fadvise
prctl
qsort_r
rpmatch
scandirat
setprogname
setns
setresgid
setresuid
sched_setattr
sched_setscheduler
sigqueue
srandom
strnchr
strndup
strnlen
sysconf
sysinfo
swapon
swapoff
timegm
unshare
usleep
vwarnx
warn
warnx
prlimit
openat
fstatat
unlinkat
ioperm
iopl
futimens
inotify_init1
open_memstream
reboot
getusershell
'''.split()
foreach func: funcs
have = cc.has_function(func)
# For autotools compatiblity, use either #define FOO 1 or #undef FOO.
# This makes little sense, but is necessary to avoid warnings about
# redefined macros from Python.h, which uses this convention.
conf.set('HAVE_' + func.to_upper(), have ? 1 : false)
if func == 'llseek' or func == 'lseek64'
conf.set('HAVE_' + func.to_upper() + '_PROTOTYPE', have ? 1 : false)
endif
endforeach
have = conf.get('HAVE_FUTIMENS') in [1] and conf.get('HAVE_INOTIFY_INIT1') in [1]
conf.set('AGETTY_RELOAD', have ? 1 : false)
if not have
warning('futimens or inotify_init1 not found; agetty(8) will not provide --reload functionality')
endif
have_dirfd = (cc.has_function('dirfd') or
cc.has_header_symbol('dirent.h', 'dirfd',
prefix : '#include <sys/types.h>'))
conf.set('HAVE_DIRFD', have_dirfd ? 1 : false)
have_ddfd = cc.has_member('DIR', 'dd_fd',
prefix : '''
#include <sys/types.h>
#include <dirent.h>
''')
conf.set('HAVE_DECL_DDFD', have_ddfd ? 1 : false)
have = cc.has_member('struct tm', 'tm_gmtoff',
prefix : '''
#include <time.h>
#include <unistd.h>
''')
conf.set('HAVE_TM_GMTOFF', have ? 1 : false)
have = cc.has_member('struct termios', 'c_line',
prefix : '#include <termios.h>')
conf.set('HAVE_STRUCT_TERMIOS_C_LINE', have ? 1 : false)
have = cc.has_member('struct stat', 'st_mtim.tv_nsec',
prefix : '#include <sys/stat.h>')
conf.set('HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC', have ? 1 : false)
# replacement for AC_STRUCT_TIMEZONE
have = cc.has_member('struct tm', 'tm_zone',
prefix : '#include <time.h>')
conf.set('HAVE_STRUCT_TM_TM_ZONE', have ? 1 : false)
have = cc.sizeof('tzname', prefix : '#include <time.h>') > 0
conf.set('HAVE_DECL_TZNAME', have ? 1 : false)
code = '''
#include <time.h>
#if !@0@
extern char *tzname[];
#endif
int main(void) {
return tzname ? 0 : 1;
}
'''.format(have ? 1 : 0)
result = cc.run(code, name : 'using tzname[]')
have = result.compiled() and result.returncode() == 0
conf.set('HAVE_TZNAME', have ? 1 : false)
socket_libs = []
if not cc.has_function('socket')
socket_libs += cc.find_library('socket', required : true)
have = cc.has_function('socket',
dependencies : socket_libs)
if not have
error('socket() function not available')
endif
endif
realtime_libs = []
have = cc.has_function('clock_gettime')
if not have
realtime_libs += cc.find_library('rt', required : true)
have = cc.has_function('clock_gettime',
dependencies : realtime_libs)
endif
conf.set('HAVE_CLOCK_GETTIME', have_dirfd ? 1 : false)
thread_libs = dependency('threads')
have = cc.has_function('timer_create')
if not have
realtime_libs = cc.find_library('rt', required : true)
have = cc.has_function('timer_create',
dependencies : realtime_libs)
if not have
realtime_libs += thread_libs
have = cc.has_function('timer_create',
dependencies : realtime_libs)
endif
endif
conf.set('HAVE_TIMER_CREATE', have ? 1 : false)
if not have
have = cc.has_function('setitimer')
conf.set('HAVE_SETITIMER', have ? 1 : false)
endif
rtas_libs = cc.find_library('rtas', required : false)
conf.set('HAVE_LIBRTAS', rtas_libs.found() ? 1 : false)
math_libs = []
if not cc.has_function('isnan')
lib = cc.find_library('m', required : true)
if (cc.has_function('isnan', dependencies : lib) and
cc.has_function('__isnan', dependencies : lib))
math_libs += lib
endif
endif
have = cc.has_header_symbol('errno.h', 'program_invocation_short_name',
args : '-D_GNU_SOURCE')
conf.set('HAVE_PROGRAM_INVOCATION_SHORT_NAME', have ? 1 : false)
code = '''
extern char *__progname;
int main(void) {
return (*__progname != 0);
}
'''
result = cc.run(code, name : 'using __progname')
have = result.compiled() and result.returncode() == 0
conf.set('HAVE___PROGNAME', have ? 1 : false)
code = '''
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
int rc = 1;
char *s;
i = sscanf("x", "@0@", &s);
if (i == 1 && *s == 'x')
rc = 0;
free(s);
return rc;
}
'''
have = false
foreach mod : ['ms', 'as']
if not have
result = cc.run(code.format('%' + mod), name : 'sscanf with %' + mod)
have = result.compiled() and result.returncode() == 0
conf.set('HAVE_SCANF_@0@_MODIFIER'.format(mod.to_upper()), have ? 1 : false)
endif
endforeach
# XXX: handle cross cross-compilation w/o ability to run binaries:
# meson.is_cross_build() and not meson.has_exe_wrapper()
build_plymouth_support = get_option('build-plymouth-support')
have_tiocglcktrmios = cc.has_header_symbol(
'sys/ioctl.h', 'TIOCGLCKTRMIOS',
required : build_plymouth_support.enabled())
have_sock_cloexec = cc.has_header_symbol(
'sys/socket.h', 'SOCK_CLOEXEC',
prefix : '#include <sys/types.h>',
required : build_plymouth_support.enabled())
have_sock_nonblock = cc.has_header_symbol(
'sys/socket.h', 'SOCK_NONBLOCK',
prefix : '#include <sys/types.h>',
required : build_plymouth_support.enabled())
have_so_passcred = cc.has_header_symbol(
'sys/socket.h', 'SO_PASSCRED',
prefix : '#include <sys/types.h>',
required : build_plymouth_support.enabled())
build_plymouth_support = (not build_plymouth_support.disabled() and
have_tiocglcktrmios and
have_sock_cloexec and
have_sock_nonblock and
have_so_passcred)
conf.set('ENABLE_PLYMOUTH_SUPPORT', build_plymouth_support ? 1 : false)
summary('plymouth support',
build_plymouth_support ? 'enabled' : 'disabled',
section : 'components')
# check for valid fallocate() function
# with 32 bits glibc 2.10, fallocate() exists but not fallocate64()
# when _FILE_OFFSET_BITS==64, fallocate() is redirect to fallocate64()
# and program can't be linked.
code = '''
#define _GNU_SOURCE
#include <unistd.h>
#include <fcntl.h>
int main(void) {