X-Git-Url: https://www.tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fmeson.build;h=6399ddb1b5383fad426a1aa571938c5574dbfa80;hb=c8402791b82947c49ba1d04f855dab04191607ca;hp=c9f5d594c70ef44817cde833e58bca42fcebb1c2;hpb=df716df33af8e9a5b93d573a023ecd7fc24d9a03;p=tinc diff --git a/src/meson.build b/src/meson.build index c9f5d594..6399ddb1 100644 --- a/src/meson.build +++ b/src/meson.build @@ -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 + 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,