| project('libslirp', 'c', |
| version : '4.8.0', |
| license : 'BSD-3-Clause', |
| default_options : ['warning_level=1', 'c_std=gnu99'], |
| meson_version : '>= 0.50', |
| ) |
| |
| version = meson.project_version() |
| varr = version.split('.') |
| major_version = varr[0] |
| minor_version = varr[1] |
| micro_version = varr[2] |
| |
| conf = configuration_data() |
| conf.set('SLIRP_MAJOR_VERSION', major_version) |
| conf.set('SLIRP_MINOR_VERSION', minor_version) |
| conf.set('SLIRP_MICRO_VERSION', micro_version) |
| |
| want_ossfuzz = get_option('oss-fuzz') |
| want_libfuzzer = get_option('llvm-fuzz') |
| fuzz_reproduce = get_option('fuzz-reproduce') |
| if want_ossfuzz and want_libfuzzer |
| error('only one of oss-fuzz and llvm-fuzz can be specified') |
| endif |
| fuzzer_build = want_ossfuzz or want_libfuzzer |
| if fuzzer_build and fuzz_reproduce |
| error('fuzzer build and reproducer build are mutually exclusive') |
| endif |
| |
| cc = meson.get_compiler('c') |
| add_languages('cpp', required : fuzzer_build) |
| |
| if get_option('static') == true |
| add_global_arguments('-static', language : 'c') |
| endif |
| |
| if cc.get_argument_syntax() != 'msvc' |
| r = run_command('build-aux/git-version-gen', |
| '@0@/.tarball-version'.format(meson.current_source_dir()), |
| check : false) |
| |
| full_version = r.stdout().strip() |
| if r.returncode() != 0 or full_version.startswith('UNKNOWN') |
| full_version = meson.project_version() |
| elif not full_version.startswith(meson.project_version()) |
| error('meson.build project version @0@ does not match git-describe output @1@' |
| .format(meson.project_version(), full_version)) |
| endif |
| else |
| full_version = meson.project_version() |
| endif |
| conf.set_quoted('SLIRP_VERSION_STRING', full_version + get_option('version_suffix')) |
| |
| # libtool versioning - this applies to libslirp |
| # |
| # See http://sources.redhat.com/autobook/autobook/autobook_91.html#SEC91 for details |
| # |
| # - If interfaces have been changed or added, but binary compatibility |
| # has been preserved, change: |
| # CURRENT += 1 |
| # REVISION = 0 |
| # AGE += 1 |
| # - If binary compatibility has been broken (eg removed or changed |
| # interfaces), change: |
| # CURRENT += 1 |
| # REVISION = 0 |
| # AGE = 0 |
| # - If the interface is the same as the previous version, but bugs are |
| # fixed, change: |
| # REVISION += 1 |
| lt_current = 4 |
| lt_revision = 0 |
| lt_age = 4 |
| lt_version = '@0@.@1@.@2@'.format(lt_current - lt_age, lt_age, lt_revision) |
| |
| host_system = host_machine.system() |
| |
| glib_dep = dependency('glib-2.0', static : get_option('static')) |
| |
| add_project_arguments(cc.get_supported_arguments('-Wmissing-prototypes', '-Wstrict-prototypes', |
| '-Wredundant-decls', '-Wundef', '-Wwrite-strings'), |
| language: 'c', native: false) |
| |
| platform_deps = [] |
| |
| if host_system == 'windows' |
| platform_deps += [ |
| cc.find_library('ws2_32'), |
| cc.find_library('iphlpapi') |
| ] |
| elif host_system == 'darwin' |
| platform_deps += [ |
| cc.find_library('resolv') |
| ] |
| elif host_system == 'haiku' |
| platform_deps += [ |
| cc.find_library('network') |
| ] |
| endif |
| |
| cargs = [ |
| '-DG_LOG_DOMAIN="Slirp"', |
| '-DBUILDING_LIBSLIRP', |
| ] |
| |
| if cc.check_header('valgrind/valgrind.h') |
| cargs += [ '-DHAVE_VALGRIND=1' ] |
| endif |
| |
| sources = [ |
| 'src/arp_table.c', |
| 'src/bootp.c', |
| 'src/cksum.c', |
| 'src/dhcpv6.c', |
| 'src/dnssearch.c', |
| 'src/if.c', |
| 'src/ip6_icmp.c', |
| 'src/ip6_input.c', |
| 'src/ip6_output.c', |
| 'src/ip_icmp.c', |
| 'src/ip_input.c', |
| 'src/ip_output.c', |
| 'src/mbuf.c', |
| 'src/misc.c', |
| 'src/ncsi.c', |
| 'src/ndp_table.c', |
| 'src/sbuf.c', |
| 'src/slirp.c', |
| 'src/socket.c', |
| 'src/state.c', |
| 'src/stream.c', |
| 'src/tcp_input.c', |
| 'src/tcp_output.c', |
| 'src/tcp_subr.c', |
| 'src/tcp_timer.c', |
| 'src/tftp.c', |
| 'src/udp.c', |
| 'src/udp6.c', |
| 'src/util.c', |
| 'src/version.c', |
| 'src/vmstate.c', |
| ] |
| |
| mapfile = 'src/libslirp.map' |
| vflag = [] |
| vflag_test = '-Wl,--version-script,@0@/@1@'.format(meson.current_source_dir(), mapfile) |
| if cc.has_link_argument('-Wl,--version-script,@0@/@1@'.format(meson.current_source_dir(), 'src/libslirp.test.map')) |
| vflag += vflag_test |
| endif |
| |
| if fuzzer_build |
| cargs += '-fsanitize-coverage=edge,indirect-calls,trace-cmp' |
| cargs += '-fsanitize=fuzzer-no-link,address' |
| cargs += '-fprofile-instr-generate' |
| cargs += '-fcoverage-mapping' |
| cargs += '-g' |
| cargs += '-DSLIRP_DEBUG' |
| vflag += '-fsanitize=fuzzer-no-link,address' |
| vflag += '-fsanitize-coverage=edge,indirect-calls,trace-cmp' |
| vflag += '-fprofile-instr-generate' |
| vflag += '-fcoverage-mapping' |
| endif |
| if fuzz_reproduce |
| cargs += '-DSLIRP_DEBUG' |
| cargs += '-g' |
| endif |
| |
| install_devel = not meson.is_subproject() |
| |
| configure_file( |
| input : 'src/libslirp-version.h.in', |
| output : 'libslirp-version.h', |
| install : install_devel, |
| install_dir : join_paths(get_option('includedir'), 'slirp'), |
| configuration : conf |
| ) |
| |
| if fuzzer_build or fuzz_reproduce |
| lib = static_library('slirp', sources, |
| c_args : cargs, |
| link_args : vflag, |
| link_depends : mapfile, |
| dependencies : [glib_dep, platform_deps], |
| ) |
| else |
| lib = library('slirp', sources, |
| version : lt_version, |
| c_args : cargs, |
| link_args : vflag, |
| link_depends : mapfile, |
| dependencies : [glib_dep, platform_deps], |
| install : install_devel or get_option('default_library') == 'shared', |
| ) |
| endif |
| |
| pingtest = executable('pingtest', 'test/pingtest.c', |
| link_with: [ lib ], |
| c_args : cargs, |
| link_args : vflag, |
| include_directories: [ 'src' ], |
| dependencies : [ platform_deps ] |
| ) |
| |
| test('ping', pingtest) |
| |
| ncsitest = executable('ncsitest', 'test/ncsitest.c', |
| link_with: [lib], |
| c_args : cargs, |
| link_args : vflag, |
| include_directories: ['src'], |
| dependencies: [glib_dep, platform_deps] |
| ) |
| |
| test('ncsi', ncsitest) |
| |
| if install_devel |
| install_headers(['src/libslirp.h'], subdir : 'slirp') |
| |
| pkg = import('pkgconfig') |
| |
| pkg.generate( |
| version : version, |
| libraries : lib, |
| requires : [ |
| 'glib-2.0', |
| ], |
| name : 'slirp', |
| description : 'User-space network stack', |
| filebase : 'slirp', |
| subdirs : 'slirp', |
| ) |
| else |
| if get_option('default_library') == 'both' |
| lib = lib.get_static_lib() |
| endif |
| endif |
| |
| libslirp_dep = declare_dependency( |
| link_with : lib, |
| include_directories : [include_directories('src'), include_directories('.')], |
| ) |
| |
| subdir('fuzzing') |