# 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 ['linux', 'android'].contains(system)
    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 ['darwin', 'ios'].contains(system)
    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
