Add tests for some device & address variables
[tinc] / src / meson.build
index c9f5d59..6399ddb 100644 (file)
@@ -11,11 +11,32 @@ cdata.set_quoted('SBINDIR', dir_sbin)
 
 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',
@@ -41,29 +62,44 @@ check_headers = [
   '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',
@@ -79,13 +115,17 @@ check_types = [
 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',
@@ -93,7 +133,6 @@ src_lib_tinc = [
   'utils.c',
   'version.c',
   'xoshiro.c',
-  'logger.c',
 ]
 
 src_tinc = [
@@ -101,7 +140,6 @@ src_tinc = [
   'ifconfig.c',
   'info.c',
   'invitation.c',
-  'tincctl.c',
   'top.c',
 ]
 
@@ -116,7 +154,6 @@ src_tincd = [
   'dummy_device.c',
   'edge.c',
   'event.c',
-  'fd_device.c',
   'graph.c',
   'meta.c',
   'multicast_device.c',
@@ -132,18 +169,29 @@ src_tincd = [
   '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']
@@ -151,7 +199,7 @@ 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
@@ -162,6 +210,11 @@ foreach h : check_headers
   endif
 endforeach
 
+if cdata.has('HAVE_SYS_UN_H')
+  src_tincd += 'fd_device.c'
+  cdata.set('HAVE_FD_DEVICE', 1)
+endif
+
 confdata = configuration_data()
 confdata.merge_from(cdata)
 configure_file(output: 'meson_config.h', configuration: confdata)
@@ -172,14 +225,10 @@ have_prefix = '''
 '''.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
 
@@ -197,8 +246,10 @@ foreach type : check_types
   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()
@@ -220,26 +271,30 @@ 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)
@@ -317,6 +372,11 @@ endif
 
 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,
@@ -326,13 +386,37 @@ lib_crypto = static_library(
   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,
@@ -340,8 +424,8 @@ lib_tinc = static_library(
 
 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,
@@ -351,9 +435,9 @@ exe_tinc = executable(
 
 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,
@@ -363,9 +447,9 @@ exe_tincd = executable(
 
 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,
@@ -373,9 +457,9 @@ exe_sptps_test = executable(
 
 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,
@@ -387,8 +471,8 @@ if os_name == 'linux'
   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,