diff options
Diffstat (limited to 'ext/sctp/usrsctp/meson.build')
-rw-r--r-- | ext/sctp/usrsctp/meson.build | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/ext/sctp/usrsctp/meson.build b/ext/sctp/usrsctp/meson.build new file mode 100644 index 000000000..1d216e192 --- /dev/null +++ b/ext/sctp/usrsctp/meson.build @@ -0,0 +1,220 @@ +# Project definition +project('usrsctplib', 'c', + version: '1.0.0', + default_options: ['c_std=c99'], + meson_version: '>=0.49.0') + +# Set compiler warning flags +compiler = meson.get_compiler('c') +if compiler.get_argument_syntax() == 'msvc' + compiler_args = compiler.get_supported_arguments([ + '/wd4100', # 'identifier' : unreferenced formal parameter + '/wd4127', # conditional expression is constant + '/wd4200', # nonstandard extension used : zero-sized array in struct/union + '/wd4214', # bit field types other than int + '/wd4706', # assignment within conditional expression + '/wd4245', # 'conversion' : conversion from 'type1' to 'type2', signed/unsigned mismatch + '/wd4389', # 'operator' : signed/unsigned mismatch + '/wd4702', # unreachable code + '/wd4701', # Potentially uninitialized local variable 'name' used + '/wd4244', # 'conversion' conversion from 'type1' to 'type2', possible loss of data + ]) +else + compiler_args = compiler.get_supported_arguments([ + '-pedantic', + '-Wall', + '-Wextra', + '-Wfloat-equal', + '-Wshadow', + '-Wpointer-arith', + '-Winit-self', + '-Wno-unused-function', + '-Wno-unused-parameter', + '-Wno-unreachable-code', + '-Wstrict-prototypes', + ]) +endif +add_project_arguments(compiler_args, language: 'c') + +# Configuration +compile_args = [] + +# Dependency: Threads +thread_dep = dependency('threads', required: true) + +# Dependencies list +dependencies = [ + thread_dep, +] + +# Global settings +add_project_arguments([ + '-D__Userspace__', + '-DSCTP_SIMPLE_ALLOCATOR', + '-DSCTP_PROCESS_LEVEL_LOCKS', +], language: 'c') + +# OS-specific settings +system = host_machine.system() +if system in ['linux', 'android'] + add_project_arguments([ + '-D_GNU_SOURCE', + ], language: 'c') +elif system == 'freebsd' + add_project_arguments(compiler.get_supported_arguments([ + '-Wno-address-of-packed-member', + ]), language: 'c') +elif system in ['darwin', 'ios'] + add_project_arguments([ + '-D__APPLE_USE_RFC_2292', + ] + compiler.get_supported_arguments([ + '-Wno-address-of-packed-member', + '-Wno-deprecated-declarations', + ]), language: 'c') +elif system == 'windows' + dependencies += compiler.find_library('ws2_32', required: true) + dependencies += compiler.find_library('iphlpapi', required: true) + if compiler.get_id() == 'gcc' + add_project_arguments(compiler.get_supported_arguments([ + '-Wno-format', + '-D_WIN32_WINNT=0x601', # Enables inet_ntop and friends + ]), language: 'c') + endif +else + error('Unknown system: @0@'.format(system)) +endif + +# Feature: sys/queue +if compiler.has_header('sys/queue.h') + add_project_arguments('-DHAVE_SYS_QUEUE_H', language: 'c') +endif + +# Feature: sys/socket, linux/ifaddr, linux/rtnetlink +if compiler.has_header('sys/socket.h') + if compiler.has_header('linux/if_addr.h') + add_project_arguments('-DHAVE_LINUX_IF_ADDR_H', language: 'c') + endif + + if compiler.has_header('linux/rtnetlink.h') + add_project_arguments('-DHAVE_LINUX_RTNETLINK_H', language: 'c') + endif +endif + +# Feature: ICMP +have_sys_types = compiler.has_header('sys/types.h') +have_netinet_in = compiler.has_header('netinet/in.h') +have_netinet_ip = compiler.has_header('netinet/ip.h') +have_netinet_ip_icmp = compiler.has_header('netinet/ip_icmp.h') +if have_sys_types and have_netinet_in and have_netinet_ip and have_netinet_ip_icmp + add_project_arguments('-DHAVE_NETINET_IP_ICMP_H', language: 'c') +endif + +# Feature: stdatomic +if compiler.has_header('stdatomic.h') + add_project_arguments('-DHAVE_STDATOMIC_H', language: 'c') +endif + +# Feature: sockaddr.sa_len +prefix = ''' +#include <sys/types.h> +#include <sys/socket.h> +''' +have_sa_len = compiler.has_member('struct sockaddr', 'sa_len', prefix: prefix) +if have_sa_len + add_project_arguments('-DHAVE_SA_LEN', language: 'c') +endif + +# Feature: sockaddr_in.sin_len / sockaddr_in6.sin6_len / sockaddr_conn.sconn_len +prefix = ''' +#include <sys/types.h> +#include <netinet/in.h> +''' +have_sin_len = compiler.has_member('struct sockaddr_in', 'sin_len', prefix: prefix) +if have_sin_len + add_project_arguments('-DHAVE_SIN_LEN', language: 'c') +endif +have_sin6_len = compiler.has_member('struct sockaddr_in6', 'sin6_len', prefix: prefix) +if have_sin6_len + add_project_arguments('-DHAVE_SIN6_LEN', language: 'c') +endif +have_sconn_len = compiler.has_member('struct sockaddr_conn', 'sconn_len', prefix: '#include "usrsctp.h"', include_directories: include_directories('usrsctplib')) +if have_sconn_len + add_project_arguments('-DHAVE_SCONN_LEN', language: 'c') +endif + +# Options +if get_option('sctp_invariants') + add_project_arguments('-DINVARIANTS', language: 'c') +endif +if get_option('sctp_debug') + add_project_arguments('-DSCTP_DEBUG', language: 'c') + compile_args += '-DSCTP_DEBUG' +endif +if get_option('sctp_inet') + add_project_arguments('-DINET', language: 'c') +endif +if get_option('sctp_inet6') + add_project_arguments('-DINET6', language: 'c') +endif + +# Library +subdir('usrsctplib') + +# Build library +if compiler.get_id() == 'msvc' and get_option('default_library') == 'shared' + # Needed by usrsctp_def + find_program('dumpbin') + + usrsctp_static = static_library('usrsctp-static', sources, + dependencies: dependencies, + include_directories: include_dirs) + + usrsctp_def = custom_target('usrsctp.def', + command: [find_program('gen-def.py'), '@INPUT@'], + input: usrsctp_static, + output: 'usrsctp.def', + capture: true) + + usrsctp = shared_library('usrsctp', + link_whole: usrsctp_static, + dependencies: dependencies, + vs_module_defs: usrsctp_def, + install: true, + version: meson.project_version()) +else + usrsctp = library('usrsctp', sources, + dependencies: dependencies, + include_directories: include_dirs, + install: true, + version: meson.project_version(), + c_args: '-U__APPLE__') +endif + +# Declare dependency +usrsctp_dep = declare_dependency( + compile_args: compile_args, + include_directories: include_dirs, + link_with: usrsctp) + +# Generate pkg-config file +pkg = import('pkgconfig') +pkg.generate(usrsctp, + name: 'usrsctp', + description: 'A portable SCTP userland stack', + url: 'https://github.com/sctplab/usrsctp', + extra_cflags: compile_args) + +# Programs (optional) +if get_option('sctp_build_programs') + subdir('programs') + + # Build executables + foreach name, sources : programs + executable( + name, + programs_helper_sources + sources, + dependencies: dependencies, + link_with: usrsctp, + include_directories: include_dirs) + endforeach +endif |