# 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 == 'linux'
    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 == 'darwin'
    add_project_arguments([
            '-D__Userspace_os_Darwin',
            '-U__APPLE__',
            '-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"')
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,
        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())
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
