VirtualBox

source: vbox/trunk/src/libs/libslirp-4.9.0/meson.build

Last change on this file was 109078, checked in by vboxsync, 2 weeks ago

libs/libslirp-4.9.0: Make it build on Linux, bugref:10268

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.9 KB
Line 
1project('libslirp', 'c',
2 version : '4.9.0',
3 license : 'BSD-3-Clause',
4 default_options : ['warning_level=1', 'c_std=gnu99'],
5 meson_version : '>= 0.60',
6)
7
8version = meson.project_version()
9varr = version.split('.')
10major_version = varr[0]
11minor_version = varr[1]
12micro_version = varr[2]
13
14conf = configuration_data()
15conf.set('SLIRP_MAJOR_VERSION', major_version)
16conf.set('SLIRP_MINOR_VERSION', minor_version)
17conf.set('SLIRP_MICRO_VERSION', micro_version)
18
19want_ossfuzz = get_option('oss-fuzz')
20want_libfuzzer = get_option('llvm-fuzz')
21fuzz_reproduce = get_option('fuzz-reproduce')
22target_winver = get_option('target_winver')
23if want_ossfuzz and want_libfuzzer
24 error('only one of oss-fuzz and llvm-fuzz can be specified')
25endif
26fuzzer_build = want_ossfuzz or want_libfuzzer
27if fuzzer_build and fuzz_reproduce
28 error('fuzzer build and reproducer build are mutually exclusive')
29endif
30
31cc = meson.get_compiler('c')
32add_languages('cpp', required : fuzzer_build)
33
34glib_static = get_option('static')
35
36if glib_static == true
37 add_global_arguments('-static', language : 'c')
38endif
39
40if cc.get_argument_syntax() != 'msvc'
41 r = run_command('build-aux/git-version-gen',
42 '@0@/.tarball-version'.format(meson.current_source_dir()),
43 check : false)
44
45 full_version = r.stdout().strip()
46 if r.returncode() != 0 or full_version.startswith('UNKNOWN')
47 full_version = meson.project_version()
48 elif not full_version.startswith(meson.project_version())
49 error('meson.build project version @0@ does not match git-describe output @1@'
50 .format(meson.project_version(), full_version))
51 endif
52else
53 full_version = meson.project_version()
54endif
55conf.set_quoted('SLIRP_VERSION_STRING', full_version + get_option('version_suffix'))
56
57# libtool versioning - this applies to libslirp
58#
59# See http://sources.redhat.com/autobook/autobook/autobook_91.html#SEC91 for details
60#
61# - If interfaces have been changed or added, but binary compatibility
62# has been preserved, change:
63# CURRENT += 1
64# REVISION = 0
65# AGE += 1
66# - If binary compatibility has been broken (eg removed or changed
67# interfaces), change:
68# CURRENT += 1
69# REVISION = 0
70# AGE = 0
71# - If the interface is the same as the previous version, but bugs are
72# fixed, change:
73# REVISION += 1
74lt_current = 4
75lt_revision = 0
76lt_age = 4
77lt_version = '@0@.@1@.@2@'.format(lt_current - lt_age, lt_age, lt_revision)
78
79host_system = host_machine.system()
80
81# libslirp_deps collects both the libslirp dependenc(y|ies) and the
82# platform dependencies.
83libslirp_deps = [ dependency('glib-2.0', static : glib_static) ]
84
85if host_system == 'windows'
86 # Windows: pkg-config fails us here because the static version of glib-2.0
87 # requires iconv, which is not emitted by 'pkg-config --libs --static'.
88 libslirp_deps += [ dependency('iconv', static : glib_static) ]
89endif
90
91add_project_arguments(cc.get_supported_arguments('-Wmissing-prototypes', '-Wstrict-prototypes',
92 '-Wredundant-decls', '-Wundef', '-Wwrite-strings'),
93 language: 'c', native: false)
94
95cargs = [
96 '-DG_LOG_DOMAIN="Slirp"',
97 '-DBUILDING_LIBSLIRP',
98]
99
100if glib_static == true
101 # This likely only applies to Windows... but... need to ensure that
102 # glib-2.0 doesn't set import/export defines.
103 cargs += [
104 '-DGLIB_STATIC_COMPILATION',
105 '-DGIO_STATIC_COMPILATION',
106 '-DGMODULE_STATIC_COMPILATION',
107 '-DGI_STATIC_COMPILATION',
108 '-DGOBJECT_STATIC_COMPILATION'
109 ]
110endif
111
112if host_system == 'windows'
113 libslirp_deps += [
114 cc.find_library('ws2_32'),
115 cc.find_library('iphlpapi')
116 ]
117
118 if target_winver != ''
119 cargs += '-DTARGET_WINVER=@0@'.format(target_winver)
120 endif
121elif host_system == 'darwin'
122 libslirp_deps += [
123 cc.find_library('resolv')
124 ]
125elif host_system == 'haiku'
126 libslirp_deps += [
127 cc.find_library('network')
128 ]
129endif
130
131if cc.check_header('valgrind/valgrind.h')
132 cargs += [ '-DHAVE_VALGRIND=1' ]
133endif
134
135sources = [
136 'src/arp_table.c',
137 'src/bootp.c',
138 'src/cksum.c',
139 'src/dhcpv6.c',
140 'src/dnssearch.c',
141 'src/if.c',
142 'src/ip6_icmp.c',
143 'src/ip6_input.c',
144 'src/ip6_output.c',
145 'src/ip_icmp.c',
146 'src/ip_input.c',
147 'src/ip_output.c',
148 'src/mbuf.c',
149 'src/misc.c',
150 'src/ncsi.c',
151 'src/ndp_table.c',
152 'src/sbuf.c',
153 'src/slirp.c',
154 'src/socket.c',
155 'src/state.c',
156 'src/stream.c',
157 'src/tcp_input.c',
158 'src/tcp_output.c',
159 'src/tcp_subr.c',
160 'src/tcp_timer.c',
161 'src/tftp.c',
162 'src/udp.c',
163 'src/udp6.c',
164 'src/util.c',
165 'src/version.c',
166 'src/vmstate.c',
167]
168
169mapfile = 'src/libslirp.map'
170vflag = []
171vflag_test = '-Wl,--version-script,@0@/@1@'.format(meson.current_source_dir(), mapfile)
172if cc.has_link_argument('-Wl,--version-script,@0@/@1@'.format(meson.current_source_dir(), 'src/libslirp.test.map'))
173 vflag += vflag_test
174endif
175
176if fuzzer_build
177 cargs += '-fsanitize-coverage=edge,indirect-calls,trace-cmp'
178 cargs += '-fsanitize=fuzzer-no-link,address'
179 cargs += '-fprofile-instr-generate'
180 cargs += '-fcoverage-mapping'
181 cargs += '-g'
182 cargs += '-DSLIRP_DEBUG'
183 vflag += '-fsanitize=fuzzer-no-link,address'
184 vflag += '-fsanitize-coverage=edge,indirect-calls,trace-cmp'
185 vflag += '-fprofile-instr-generate'
186 vflag += '-fcoverage-mapping'
187endif
188if fuzz_reproduce
189 cargs += '-DSLIRP_DEBUG'
190 cargs += '-g'
191endif
192
193install_devel = not meson.is_subproject()
194
195configure_file(
196 input : 'src/libslirp-version.h.in',
197 output : 'libslirp-version.h',
198 install : install_devel,
199 install_dir : join_paths(get_option('includedir'), 'slirp'),
200 configuration : conf
201)
202
203if glib_static or fuzzer_build or fuzz_reproduce
204 lib = static_library('slirp', sources,
205 c_args : cargs,
206 link_args : vflag,
207 link_depends : mapfile,
208 dependencies : libslirp_deps,
209 )
210else
211 lib = library('slirp', sources,
212 version : lt_version,
213 c_args : cargs,
214 link_args : vflag,
215 link_depends : mapfile,
216 dependencies : libslirp_deps,
217 install : install_devel or get_option('default_library') == 'shared',
218 )
219endif
220
221pingtest = executable('pingtest', 'test/pingtest.c',
222 link_with: [ lib ],
223 c_args : cargs,
224 link_args : vflag,
225 include_directories: [ 'src' ],
226 dependencies : libslirp_deps
227)
228
229test('ping', pingtest)
230
231ncsitest = executable('ncsitest', 'test/ncsitest.c',
232 link_with: [lib],
233 c_args : cargs,
234 link_args : vflag,
235 include_directories: ['src'],
236 dependencies: libslirp_deps
237)
238
239test('ncsi', ncsitest)
240
241if install_devel
242 install_headers(['src/libslirp.h'], subdir : 'slirp')
243
244 pkg = import('pkgconfig')
245
246 pkg.generate(
247 version : version,
248 libraries : lib,
249 requires : [
250 'glib-2.0',
251 ],
252 name : 'slirp',
253 description : 'User-space network stack',
254 filebase : 'slirp',
255 subdirs : 'slirp',
256 )
257else
258 if get_option('default_library') == 'both'
259 lib = lib.get_static_lib()
260 endif
261endif
262
263libslirp_libdep = declare_dependency(
264 link_with : lib,
265 include_directories : [include_directories('src'), include_directories('.')],
266)
267
268subdir('fuzzing')
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette