gstreamer/ext/sctp/usrsctp/meson.build
Tim-Philipp Müller f4538e24b6 sctp: import internal copy of usrsctp library
There are problems with global shared state and no API stability
guarantees, and we can't rely on distros shipping the fixes we
need. Both firefox and Chrome bundle their own copies too.

Imported from https://github.com/sctplab/usrsctp,
commit 547d3b46c64876c0336b9eef297fda58dbe1adaf
Date: Thu Jul 23 21:49:32 2020 +0200

Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/870

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1465>
2020-08-14 01:32:45 +01:00

221 lines
6.7 KiB
Meson

# 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