Codebase list iputils / 08fb538f-5d0d-4657-a953-69b1a97bd4a7/main meson.build
08fb538f-5d0d-4657-a953-69b1a97bd4a7/main

Tree @08fb538f-5d0d-4657-a953-69b1a97bd4a7/main (Download .tar.gz)

meson.build @08fb538f-5d0d-4657-a953-69b1a97bd4a7/mainraw · history · blame

project('iputils', 'c',
	default_options : [
		'c_std=c99',
		'warning_level=3',
		'localstatedir=var',
	],
	meson_version : '>=0.39',
	version : '20210202') # keep in sync with: git describe | awk -F- '{print $1}'

cc = meson.get_compiler('c')

add_project_arguments(
	'-include', 'config.h',
	'-include', 'git-version.h',
	language : 'c'
)

conf = configuration_data()
conf.set_quoted('PACKAGE_NAME', meson.project_name())
conf.set('_GNU_SOURCE', 1, description : 'Enable GNU extensions on systems that have them.')

build_arping = get_option('BUILD_ARPING')
build_clockdiff = get_option('BUILD_CLOCKDIFF')
build_ninfod = get_option('BUILD_NINFOD')
nifold_messages = get_option('NINFOD_MESSAGES')
build_ping = get_option('BUILD_PING')
build_rarpd = get_option('BUILD_RARPD')
build_rdisc = get_option('BUILD_RDISC')
build_rdisc_server = get_option('ENABLE_RDISC_SERVER')
build_tftpd = get_option('BUILD_TFTPD')
build_tracepath = get_option('BUILD_TRACEPATH')
build_traceroute6 = get_option('BUILD_TRACEROUTE6')

build_mans = get_option('BUILD_MANS')
build_html_mans = get_option('BUILD_HTML_MANS')

prefix = get_option('prefix')
bindir = join_paths(prefix, get_option('bindir'))
localedir = join_paths(prefix, get_option('localedir'))
sbindir = join_paths(prefix, get_option('sbindir'))

systemd = dependency('systemd', required : false)
install_systemd_units = systemd.found() or get_option('INSTALL_SYSTEMD_UNITS')

systemdunitdir = get_option('systemdunitdir')
if systemdunitdir == '' and install_systemd_units
	systemdunitdir = systemd.get_pkgconfig_variable('systemdsystemunitdir')
endif

setcap_arping = false
setcap_clockdiff = false
setcap_ping = false
setcap_traceroute6 = false
if (not get_option('NO_SETCAP_OR_SUID'))
  setcap_arping = get_option('SETCAP_OR_SUID_ARPING')
  setcap_clockdiff = get_option('SETCAP_OR_SUID_CLOCKDIFF')
  setcap_ping = get_option('SETCAP_OR_SUID_PING')
  setcap_traceroute6 = get_option('SETCAP_OR_SUID_TRACEROUTE6')
endif

# Check functions.
foreach f : '''
	__fpending
	getrandom
	nanosleep
'''.split()
	if cc.has_function(f, args : '-D_GNU_SOURCE')
		conf.set('HAVE_' + f.to_upper(), 1,
			description : 'Define to 1 if you have the ' + f + ' function')
	endif
endforeach

if cc.compiles('''
	#include <sys/types.h>
	#include <netinet/in.h>
	#include <netinet/icmp6.h>
	int main(void) {
		struct icmp6_nodeinfo nodeinfo;
		return 0;
	}
''', name : 'struct icmp6_nodeinfo')
	conf.set('HAVE_STRUCT_ICMP6_NODEINFO', 1,
		description : 'Defined if struct icmp6_nodeinfo exists.')
endif

if cc.compiles('''
	#include <sys/types.h>
	#include <sys/time.h>
	#include <time.h>
	int main(void) {
		struct tm time;
		return 0;
	}
''', name : 'struct tm time;')
	conf.set('TIME_WITH_SYS_TIME', 1,
		description : 'Defined if struct tm exists.')
endif

m_dep = cc.find_library('m')
resolv_dep = cc.find_library('resolv')
if cc.has_function('clock_gettime')
	rt_dep = cc.find_library('disabler-appears-to-disable-executable-build', required : false)
else
	rt_dep = cc.find_library('rt')
endif

cap = get_option('USE_CAP')
if cap == true
	cap_dep = cc.find_library('cap')
	conf.set('HAVE_LIBCAP', 1,
		description : 'Defined if libcap exists.')
else
	cap_dep = dependency('disabler-appears-to-disable-executable-build', required : false)
endif

opt = get_option('ARPING_DEFAULT_DEVICE')
if opt != ''
	conf.set_quoted('DEFAULT_DEVICE', opt, description : 'arping default device.')
endif

# Some systems needs intl for gettext
intl_dep = []
gettext = get_option('USE_GETTEXT')
if gettext == true
	add_project_arguments(['-DGETTEXT_PACKAGE="iputils"'], language: 'c')

	conf.set('ENABLE_NLS', 1, description : 'If set enable I18N.')
	conf.set_quoted('LOCALEDIR', localedir)
	subdir ('po')
	intl_dep += cc.find_library('intl', required : false)
endif

idn = get_option('USE_IDN')
if idn == true
	idn_dep = dependency('libidn2', required : false)
	if idn_dep.found()
		add_project_arguments('-DUSE_IDN', language : 'c')
		conf.set('USE_IDN', 1,
			description : 'If set use Internationalized Domain Name library.')
	endif
else
	idn_dep = dependency('disabler-appears-to-disable-executable-build', required : false)
endif

if host_machine.endian() == 'big'
	conf.set('WORDS_BIGENDIAN', '1')
endif

if build_rdisc == true
	if build_rdisc_server == true
		conf.set('RDISC_SERVER', 1, description : 'If set build rdisc server.')
	endif
endif

if build_ninfod == true
	foreach h : [
		'inttypes.h',
		'limits.h',
		'linux/rtnetlink.h',
		'memory.h',
		'netdb.h',
		'netinet/icmp6.h',
		'netinet/in.h',
		'netinet/ip6.h',
		'pwd.h',
		'stdint.h',
		'stdlib.h',
		'string.h',
		'strings.h',
		'sys/capability.h',
		'syslog.h',
		'sys/time.h',
		'sys/types.h',
		'sys/uio.h',
		'sys/utsname.h',
		'unistd.h',
	]
		if cc.has_header(h)
			conf.set('HAVE_' + h.to_upper().underscorify(), 1,
				description : 'Define if ' + h + ' can be included.')
		endif
	endforeach
	if cc.has_header('stdio.h') and cc.has_header('stdlib.h') and cc.has_header('stddef.h') and cc.has_header('stdarg.h')
		conf.set('STDC_HEADERS', 1,
			description : 'Define to 1 if you have the ANSI C header files.')
	endif
	threads = dependency('threads')
	if threads.found()
		conf.set('ENABLE_THREADS', 1,
			description : 'Defined if libpthread is found.')
	endif
	if host_machine.endian() == 'big'
		conf.set('WORDS_BIGENDIAN', 1,
			description : 'Defined if processor stores words with the most significant byte first.')
	endif
	if nifold_messages == true
		conf.set('ENABLE_DEBUG', 1, description : 'Enable ninfod syslog messages.')
	endif
endif

foreach h : [
	'error.h',
]
	if cc.has_header(h)
		conf.set('HAVE_' + h.to_upper().underscorify(), 1,
			description : 'Define if ' + h + ' can be included.')
	endif
endforeach

git_version_h = vcs_tag(
	input : 'git-version.h.meson',
	output : 'git-version.h',
	fallback : meson.project_version()
)

config_h = configure_file(
	output : 'config.h',
	configuration : conf)

setcap = find_program('setcap', '/usr/sbin/setcap', '/sbin/setcap', required : false)
if cap_dep.found() and setcap.found()
	perm_type = 'caps'
	setcap_path = setcap.path()
else
	perm_type = 'setuid'
	setcap_path = '/dev/null'
endif

############################################################
common_sources = files(
	'iputils_common.h', 'iputils_common.c',
	'md5.h', 'md5.c'
)
libcommon = static_library(
	'common',
	[common_sources, git_version_h],
	install : false)

if build_ping == true
	subdir ('ping')
endif

if build_tracepath == true
	executable('tracepath', ['tracepath.c', git_version_h],
		dependencies : [idn_dep, intl_dep],
		link_with : [libcommon],
		install: true)
endif

if build_traceroute6 == true
	executable('traceroute6', ['traceroute6.c', git_version_h],
		dependencies : [cap_dep, intl_dep, idn_dep],
		link_with : [libcommon],
		install: true)
	if (setcap_traceroute6)
		meson.add_install_script('build-aux/setcap-setuid.sh',
			bindir,
			'traceroute6',
			perm_type,
			setcap_path
		)
	endif
endif

if build_clockdiff == true
	executable('clockdiff', ['clockdiff.c', git_version_h],
		dependencies : [cap_dep, intl_dep],
		link_with : [libcommon],
		install: true)
	if (setcap_clockdiff)
		meson.add_install_script('build-aux/setcap-setuid.sh',
			bindir,
			'clockdiff',
			perm_type,
			setcap_path
		)
	endif
endif

if build_rdisc == true
	executable('rdisc', ['rdisc.c', git_version_h],
		install_dir: sbindir,
		link_with : [libcommon],
		install: true)
	if install_systemd_units
		subs = configuration_data()
		subs.set('sbindir', sbindir)
		unit_file = configure_file(
			input: 'systemd/rdisc.service.in',
			output: 'rdisc.service',
			configuration: subs
		)
		install_data(unit_file, install_dir: systemdunitdir)
	endif
endif

if build_arping == true
	executable('arping', ['arping.c', git_version_h],
		dependencies : [rt_dep, cap_dep, idn_dep, intl_dep],
		link_with : [libcommon],
		install: true)
	if (setcap_arping)
		meson.add_install_script('build-aux/setcap-setuid.sh',
			bindir,
			'arping',
			perm_type,
			setcap_path
		)
	endif
endif

if build_tftpd == true
	subdir ('tftpd')
endif

if build_rarpd == true
	executable('rarpd', ['rarpd.c', git_version_h],
		install_dir: sbindir,
		link_with : [libcommon],
		install: true)
	if install_systemd_units
		subs = configuration_data()
		subs.set('sbindir', sbindir)
		unit_file = configure_file(
			input: 'systemd/rarpd.service.in',
			output: 'rarpd@.service',
			configuration: subs
		)
		install_data(unit_file, install_dir: systemdunitdir)
	endif
endif

if build_ninfod == true
	subdir ('ninfod')
endif

if build_mans == true or build_html_mans == true
	subdir ('doc')
endif

output = '\n\nAPPLICATIONS (build)\n'
output += 'man: ' + build_mans.to_string() + '\n'
output += 'HTML man: ' + build_html_mans.to_string() + '\n'
output += 'arping: ' + build_arping.to_string()
output += ' (capability or suid: ' + setcap_arping.to_string() + ')\n'
output += 'clockdiff: ' + build_clockdiff.to_string()
output += ' (capability or suid: ' + setcap_clockdiff.to_string() + ')\n'
output += 'ninfod: ' + build_ninfod.to_string()
output += ' (syslog: ' + nifold_messages.to_string() + ')\n'
output += 'ping: ' + build_ping.to_string()
output += ' (capability or suid: ' + setcap_ping.to_string() + ')\n'
output += 'rarpd: ' + build_rarpd.to_string() + '\n'
output += 'rdisc: ' + build_rdisc.to_string()
output += ' (server: ' + build_rdisc_server.to_string() + ')\n'
output += 'tftpd: ' + build_tftpd.to_string() + '\n'
output += 'tracepath: ' + build_tracepath.to_string() + '\n'
output += 'traceroute6: ' + build_traceroute6.to_string()
output += ' (capability or suid: ' + setcap_traceroute6.to_string() + ')\n'

output += '\nCONFIGURATION\n'
output += 'Capatiblity (with libcap): ' + cap.to_string() + '\n'
output += 'IDN (with libidn2): ' + idn.to_string() + '\n'
output += 'I18N (with gettext): ' + gettext.to_string() + '\n'
output += 'systemd: ' + install_systemd_units.to_string() + '\n'

output += '\nSYSTEM PATHS\n'
output += 'prefix: ' + prefix + '\n'
output += 'bindir: ' + bindir + '\n'
output += 'localedir: ' + localedir + '\n'
output += 'sbindir: ' + sbindir + '\n'
output += 'systemdunitdir: ' + systemdunitdir + '\n'

message(output)

############################################################
# FIXME: write tests
#test('ping to 127.0.0.1', p, args : ['-p 1', '127.0.0.1'])