You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
242 lines
7.3 KiB
242 lines
7.3 KiB
4 months ago
|
# 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__Userspace_os_Linux',
|
||
|
'-D_GNU_SOURCE',
|
||
|
], language: 'c')
|
||
|
elif system == 'freebsd'
|
||
|
add_project_arguments([
|
||
|
'-D__Userspace_os_FreeBSD',
|
||
|
'-U__FreeBSD__',
|
||
|
] + compiler.get_supported_arguments([
|
||
|
'-Wno-address-of-packed-member',
|
||
|
]), language: 'c')
|
||
|
elif system in ['darwin', 'ios']
|
||
|
add_project_arguments([
|
||
|
'-D__Userspace_os_Darwin',
|
||
|
'-D__APPLE_USE_RFC_2292',
|
||
|
] + compiler.get_supported_arguments([
|
||
|
'-Wno-address-of-packed-member',
|
||
|
'-Wno-deprecated-declarations',
|
||
|
]), language: 'c')
|
||
|
elif system == 'dragonfly'
|
||
|
add_project_arguments([
|
||
|
'-D__Userspace_os_DragonFly',
|
||
|
'-U__DragonFly__',
|
||
|
], language: 'c')
|
||
|
elif system == 'netbsd'
|
||
|
add_project_arguments([
|
||
|
'-D__Userspace_os_NetBSD',
|
||
|
'-U__NetBSD__',
|
||
|
], language: 'c')
|
||
|
elif system == 'openbsd'
|
||
|
add_project_arguments([
|
||
|
'-D__Userspace_os_OpenBSD',
|
||
|
'-U__OpenBSD__',
|
||
|
], language: 'c')
|
||
|
elif system == 'windows'
|
||
|
add_project_arguments('-D__Userspace_os_Windows', language: 'c')
|
||
|
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
|