cdata.set('HAVE_' + os_name.to_upper(), 1)
-foreach attr : ['malloc', 'nonnull', 'warn_unused_result']
- cc.has_function_attribute(attr)
+foreach attr : ['malloc', 'nonnull', 'warn_unused_result', 'packed', 'format']
+ if cc.has_function_attribute(attr)
+ cdata.set('HAVE_ATTR_' + attr.to_upper(), 1,
+ description: '__attribute__((__@0@__))'.format(attr))
+ endif
endforeach
+if cc.compiles('''
+ #include <stdlib.h>
+ extern void *make() __attribute__((malloc(free)));
+ int main(void) { return 0; }
+''')
+ cdata.set('HAVE_ATTR_MALLOC_WITH_ARG', 1,
+ description: 'support for __attribute__((malloc(deallocator)))')
+endif
+
+if cc.compiles('''
+ _Static_assert(1, "ok");
+ int main(void) { return 0; }
+''')
+ cdata.set('HAVE_STATIC_ASSERT', 1,
+ description: 'C11 _Static_assert()')
+endif
+
check_headers = [
+ 'alloca.h',
'arpa/inet.h',
'arpa/nameser.h',
'dirent.h',
'sys/ioctl.h',
'sys/mman.h',
'sys/param.h',
+ 'sys/random.h',
'sys/resource.h',
'sys/socket.h',
'sys/stat.h',
'sys/time.h',
'sys/types.h',
- 'sys/un.h',
'sys/wait.h',
'syslog.h',
+ 'string.h',
'termios.h',
+ 'unistd.h',
]
+# 'struct msghdr' misses some required fields
+if os_name != 'sunos'
+ check_headers += 'sys/un.h'
+endif
+
check_functions = [
'asprintf',
'daemon',
+ 'explicit_bzero',
+ 'explicit_memset',
'fchmod',
- 'fork',
+ 'getentropy',
'gettimeofday',
+ 'memset_s',
'mlockall',
'putenv',
'strsignal',
'unsetenv',
]
+# Broken definition, fails to link
+if os_name != 'windows'
+ check_functions += 'fork'
+endif
+
check_types = [
'struct arphdr',
'struct ether_arp',
subdir('ed25519')
subdir('chacha-poly1305')
-src_lib_tinc = [
+src_lib_common = [
'conf.c',
+ 'console.c',
'dropin.c',
+ 'fs.c',
'keys.c',
'list.c',
+ 'logger.c',
'names.c',
'netutl.c',
+ 'pidfile.c',
'script.c',
'splay_tree.c',
'sptps.c',
'utils.c',
'version.c',
'xoshiro.c',
- 'logger.c',
]
src_tinc = [
'ifconfig.c',
'info.c',
'invitation.c',
- 'tincctl.c',
'top.c',
]
'dummy_device.c',
'edge.c',
'event.c',
- 'fd_device.c',
'graph.c',
'meta.c',
'multicast_device.c',
'protocol_key.c',
'protocol_misc.c',
'protocol_subnet.c',
+ 'proxy.c',
'raw_socket_device.c',
'route.c',
'subnet.c',
- 'tincd.c',
]
+src_event_select = files('event_select.c')
+
+if os_name != 'windows'
+ src_tincd += 'signal.c'
+endif
+
+cc_flags_tinc = cc_flags
cc_flags_tincd = cc_flags
deps_common = []
deps_tinc = []
deps_tincd = [cc.find_library('m', required: false)]
+if os_name != 'windows'
+ src_lib_common += 'random.c'
+endif
+
if os_name in ['linux', 'android']
subdir('linux')
elif os_name.endswith('bsd') or os_name in ['dragonfly', 'darwin']
elif os_name == 'sunos'
subdir('solaris')
elif os_name == 'windows'
- subdir('mingw')
+ subdir('windows')
endif
foreach h : check_headers
endif
endforeach
+if cdata.has('HAVE_SYS_UN_H')
+ src_tincd += 'fd_device.c'
+endif
+
confdata = configuration_data()
confdata.merge_from(cdata)
configure_file(output: 'meson_config.h', configuration: confdata)
'''.format(build_root, meson.current_source_dir())
foreach f : check_functions
- if f == 'fork' and os_name == 'windows'
- message('MinGW does not have correct definition for fork()')
- else
- if cc.has_function(f, prefix: have_prefix, args: cc_defs)
- cdata.set('HAVE_' + f.to_upper(),
- 1,
- description: 'function ' + f)
- endif
+ if cc.has_function(f, prefix: have_prefix, args: cc_defs)
+ cdata.set('HAVE_' + f.to_upper(),
+ 1,
+ description: 'function ' + f)
endif
endforeach
endif
endforeach
+src_getopt = []
if not cdata.has('HAVE_GETOPT_H') or not cc.has_function('getopt_long', prefix: have_prefix, args: cc_defs)
- src_lib_tinc += ['getopt.c', 'getopt1.c']
+ src_getopt = ['getopt.c', 'getopt1.c']
+ src_lib_common += src_getopt
endif
if not opt_miniupnpc.disabled()
endif
endif
-if opt_curses.auto() and os_name == 'windows'
- message('curses does not link under MinGW')
-else
+if not opt_curses.disabled()
# The meta-dependency covers more alternatives, but is only available in 0.54+
curses_name = meson_version.version_compare('>=0.54') ? 'curses' : 'ncurses'
dep_curses = dependency(curses_name, required: opt_curses, static: static)
if dep_curses.found()
cdata.set('HAVE_CURSES', 1)
deps_tinc += dep_curses
+ if static
+ cc_flags_tinc += '-DNCURSES_STATIC'
+ endif
endif
endif
# Some distributions do not supply pkg-config files for readline
if opt_readline.auto() and os_name == 'windows'
- message('readline does not link under MinGW')
+ message('readline not available on Windows')
else
dep_readline = dependency('readline', required: opt_readline, static: static)
if not dep_readline.found()
dep_readline = cc.find_library('readline', required: opt_readline, static: static)
endif
+ if not dep_readline.found()
+ dep_readline = cc.find_library('libedit', required: opt_readline, static: static)
+ endif
if dep_readline.found() and \
cc.has_header('readline/readline.h', dependencies: dep_readline) and \
cc.has_header('readline/history.h', dependencies: dep_readline)
subdir('include')
+have_sandbox = cdata.has('HAVE_SANDBOX')
+if not have_sandbox
+ src_lib_common += 'sandbox.c'
+endif
+
lib_crypto = static_library(
'tinc_crypto',
sources: src_lib_crypto,
build_by_default: false,
)
-deps_lib_tinc = [deps_common, dep_crypto]
+deps_lib_common = [deps_common, dep_crypto]
+deps_tinc += deps_lib_common
+deps_tincd += deps_lib_common
+
+lib_common = static_library(
+ 'common',
+ sources: src_lib_common,
+ dependencies: deps_lib_common,
+ link_with: [lib_ed25519, lib_chacha_poly, lib_crypto],
+ implicit_include_directories: false,
+ include_directories: inc_conf,
+ build_by_default: false,
+)
lib_tinc = static_library(
'tinc',
- sources: src_lib_tinc,
- dependencies: deps_lib_tinc,
- link_with: [lib_ed25519, lib_chacha_poly, lib_crypto],
+ sources: src_tinc,
+ dependencies: deps_tinc,
+ link_with: lib_common,
+ c_args: cc_flags_tinc,
+ implicit_include_directories: false,
+ include_directories: inc_conf,
+ build_by_default: false,
+)
+
+lib_tincd = static_library(
+ 'tincd',
+ sources: src_tincd,
+ dependencies: deps_tincd,
+ link_with: lib_common,
+ c_args: cc_flags_tincd,
implicit_include_directories: false,
include_directories: inc_conf,
build_by_default: false,
exe_tinc = executable(
'tinc',
- sources: src_tinc,
- dependencies: [deps_lib_tinc, deps_tinc],
+ sources: 'tincctl.c',
+ dependencies: deps_tinc,
link_with: lib_tinc,
implicit_include_directories: false,
include_directories: inc_conf,
exe_tincd = executable(
'tincd',
- sources: src_tincd,
- dependencies: [deps_lib_tinc, deps_tincd],
- link_with: lib_tinc,
+ sources: 'tincd.c',
+ dependencies: deps_tincd,
+ link_with: lib_tincd,
c_args: cc_flags_tincd,
implicit_include_directories: false,
include_directories: inc_conf,
exe_sptps_test = executable(
'sptps_test',
- sources: 'sptps_test.c',
- dependencies: deps_lib_tinc,
- link_with: lib_tinc,
+ sources: [src_getopt, 'sptps_test.c'],
+ dependencies: deps_lib_common,
+ link_with: lib_common,
implicit_include_directories: false,
include_directories: inc_conf,
build_by_default: false,
exe_sptps_keypair = executable(
'sptps_keypair',
- sources: 'sptps_keypair.c',
- dependencies: deps_lib_tinc,
- link_with: lib_tinc,
+ sources: [src_getopt, 'sptps_keypair.c'],
+ dependencies: deps_lib_common,
+ link_with: lib_common,
implicit_include_directories: false,
include_directories: inc_conf,
build_by_default: false,
exe_sptps_speed = executable(
'sptps_speed',
sources: 'sptps_speed.c',
- dependencies: [deps_lib_tinc, dep_rt],
- link_with: lib_tinc,
+ dependencies: [deps_lib_common, dep_rt],
+ link_with: lib_common,
implicit_include_directories: false,
include_directories: inc_conf,
build_by_default: false,