summaryrefslogtreecommitdiff
path: root/ext/sctp/usrsctp/meson.build
diff options
context:
space:
mode:
Diffstat (limited to 'ext/sctp/usrsctp/meson.build')
-rw-r--r--ext/sctp/usrsctp/meson.build220
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