mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-06-10 01:59:30 +00:00
f4538e24b6
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>
221 lines
6.7 KiB
Meson
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
|