mirror of
https://github.com/iputils/iputils.git
synced 2026-01-12 00:04:28 +08:00
Along with checking for presence of <error.h> some toolchains also
require to check for error() function to avoid linking error, e.g.
powerpc64-unknown-linux-musl-gcc from Gentoo:
[17/18] powerpc64-unknown-linux-musl-gcc -o ping/ping ping/ping.p/ping.c.o ping/ping.p/ping_common.c.o ping/ping.p/ping6_common.c.o ping/ping.p/node_info.c.o -Wl,--as-needed -Wl,--no-undefined -Os -pipe -mcpu=970 -mtune=970 -maltivec -mabi=altivec -Wl,-O1 -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,--start-group libcommon.a -lm -lresolv -Wl,--end-group
FAILED: ping/ping
powerpc64-unknown-linux-musl-gcc -o ping/ping ping/ping.p/ping.c.o ping/ping.p/ping_common.c.o ping/ping.p/ping6_common.c.o ping/ping.p/node_info.c.o -Wl,--as-needed -Wl,--no-undefined -Os -pipe -mcpu=970 -mtune=970 -maltivec -mabi=altivec -Wl,-O1 -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,--start-group libcommon.a -lm -lresolv -Wl,--end-group
/usr/lib/gcc/powerpc64-unknown-linux-musl/14/../../../../powerpc64-unknown-linux-musl/bin/ld: ping/ping.p/ping.c.o: in function `ping_strtod':
ping.c:(.text+0x1c8): undefined reference to `error'
Closes: https://github.com/iputils/iputils/pull/601
Dowstream-bug: https://bugs.gentoo.org/951050
Reviewed-by: Petr Vorel <pvorel@suse.cz>
Signed-off-by: Brahmajit Das <listout@listout.xyz>
260 lines
6.9 KiB
Meson
260 lines
6.9 KiB
Meson
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
# Copyright (c) Iputils Project, 2017-2024
|
|
|
|
project('iputils', 'c',
|
|
default_options : [
|
|
'c_std=c99',
|
|
'warning_level=3',
|
|
'localstatedir=var',
|
|
],
|
|
meson_version : '>=0.44', # >=0.58 is required for 'meson dist'
|
|
version : '20250605') # 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())
|
|
|
|
build_arping = get_option('BUILD_ARPING')
|
|
build_clockdiff = get_option('BUILD_CLOCKDIFF')
|
|
build_ping = get_option('BUILD_PING')
|
|
build_tracepath = get_option('BUILD_TRACEPATH')
|
|
|
|
build_mans = get_option('BUILD_MANS')
|
|
build_html_mans = get_option('BUILD_HTML_MANS')
|
|
run_tests = not get_option('SKIP_TESTS')
|
|
|
|
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
|
|
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')
|
|
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
|
|
|
|
foreach h : [
|
|
'error.h',
|
|
]
|
|
if cc.has_header(h) and cc.has_function('error')
|
|
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
|
|
tracepath = executable('tracepath', ['tracepath.c', git_version_h],
|
|
dependencies : [idn_dep, intl_dep],
|
|
link_with : [libcommon],
|
|
install: true)
|
|
endif
|
|
|
|
if build_clockdiff == true
|
|
clockdiff = 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_arping == true
|
|
arping = 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_mans == true or build_html_mans == true
|
|
subdir ('doc')
|
|
|
|
if meson.version().version_compare('>=0.48.0')
|
|
meson.add_dist_script('build-aux/meson-build-dist-man.sh')
|
|
endif
|
|
endif
|
|
|
|
if run_tests
|
|
subdir('test')
|
|
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 += 'ping: ' + build_ping.to_string()
|
|
output += ' (capability or suid: ' + setcap_ping.to_string() + ')\n'
|
|
output += 'tracepath: ' + build_tracepath.to_string() + '\n'
|
|
|
|
output += '\nCONFIGURATION\n'
|
|
output += 'Capability (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 += 'run tests: ' + run_tests.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)
|