# 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
