source: mainline/uspace/lib/meson.build@ f167c851

Last change on this file since f167c851 was a72f3b8, checked in by Jiri Svoboda <jiri@…>, 10 months ago

System protocol library, incl. unit tests

  • Property mode set to 100644
File size: 10.5 KB
Line 
1#
2# Copyright (c) 2019 Jiří Zárevúcky
3# All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions
7# are met:
8#
9# - Redistributions of source code must retain the above copyright
10# notice, this list of conditions and the following disclaimer.
11# - Redistributions in binary form must reproduce the above copyright
12# notice, this list of conditions and the following disclaimer in the
13# documentation and/or other materials provided with the distribution.
14# - The name of the author may not be used to endorse or promote products
15# derived from this software without specific prior written permission.
16#
17# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27#
28
29always_static = not CONFIG_BUILD_SHARED_LIBS
30
31# Which libraries are installed when CONFIG_DEVEL_FILES is enabled
32installed_libs = [
33 'c',
34 'math',
35 'console',
36 'display',
37 'input',
38 'output',
39 'pixconv',
40 'posix',
41 'clui',
42 'pcm',
43 'hound',
44 'gfx',
45 'gfximage',
46 'ipcgfx',
47 'congfx',
48 'display',
49 'ui',
50]
51
52# IMPORTANT: Dependencies must be listed before libs that depend on them.
53libs = [
54 'c',
55
56 'inet',
57
58 'input',
59 'output',
60 'console',
61 'device',
62
63 'block',
64 'clipboard',
65 'clui',
66 'codepage',
67 'compress',
68 'corecfg',
69 'cpp',
70 'crypto',
71 'dltest',
72 'fbfont',
73 'fdisk',
74 'fmtutil',
75 'fs',
76 'futil',
77 'gfx',
78 'http',
79 'ipctest',
80 'label',
81 'math',
82 'minix',
83 'nettl',
84 'ofw',
85 'pcm',
86 'pcut',
87 'pixconv',
88 'posix',
89 'riff',
90 'scsi',
91 'sif',
92 'system',
93 'tbarcfg',
94 'termui',
95 'trackmod',
96 'untar',
97 'uri',
98
99 'bithenge',
100 'congfx',
101 'drv',
102 'ext4',
103 'gfxfont',
104 'gfximage',
105 'hound',
106 'ipcgfx',
107 'memgfx',
108 'nic',
109 'usb',
110 'usbdev',
111 'usbhid',
112 'usbhost',
113 'usbvirt',
114 'virtio',
115
116 'ata',
117 'ieee80211',
118 'ddev',
119 'dispcfg',
120 'display',
121 'wndmgt',
122
123 'ui',
124 'vt',
125]
126
127# Generated list of include directory paths
128include_paths = []
129
130# Generated list of test sources
131testfiles = []
132
133# Text of the install script.
134uspace_lib_devel_install_script_text = []
135
136foreach l : libs
137 # Variables that might be defined in library meson files:
138
139 # List of source files.
140 # To set it correctly, use files('list.c', 'of.c', 'files.c')
141 # Often this is the only variable that needs to be set.
142 src = files()
143
144 # Public include directories. These are used by everyone who depends
145 # on this library.
146 # Use include_directories('include_dir1', 'include_dir2') to set this.
147 # If the variable is omitted, it defaults to 'include' subdirectory
148 # if it exists, or the source directory otherwise.
149 # If the library has no headers, you can use
150 # includes += include_directories()
151 includes = []
152
153 # Private include directories.
154 # Unnecessary if you always include private headers using relative
155 # paths, but may be useful if you need to override system headers.
156 private_includes = []
157
158 # List of dependency names.
159 # E.g. to use libnic and libuntar use
160 # `deps = [ 'nic', 'untar' ]`
161 deps = []
162
163 # Extra arguments for the C compiler.
164 # Don't use for arguments involving file paths.
165 c_args = []
166
167 # Shared object version of the library.
168 version = '0.0'
169
170 # Sources of unit tests.
171 # Automatically get compiled into a test binary,
172 # but not into the library itself.
173 test_src = []
174
175 # Language of the library.
176 # Currently supported options are 'c' and 'cpp', with 'c' being default.
177 language = 'c'
178
179 # Whether the library can be dynamically linked.
180 # Eventually, all libraries will be shared by default and this will go away.
181 allow_shared = false
182
183 subdir(l)
184
185 # Add `include` or `.` subdirectory to include dirs if needed.
186 if includes.length() == 0
187 incdir = join_paths(l, 'include')
188 if run_command('[', '-d', incdir, ']').returncode() == 0
189 includes += include_directories(incdir)
190 _sdir = meson.current_source_dir() / l / 'include'
191
192 if installed_libs.contains(l)
193 uspace_lib_devel_install_script_text += 'cp -R -L -T "@0@" "${DESTDIR}include/lib@1@"'.format(_sdir, l)
194 endif
195
196 exported_devel_files += ['include', _sdir, 'lib' + l]
197 else
198 includes += include_directories(l)
199
200 if installed_libs.contains(l)
201 _sdir = meson.current_source_dir() / l
202 uspace_lib_devel_install_script_text += 'mkdir -p "${DESTDIR}include/lib@0@"'.format(l)
203 uspace_lib_devel_install_script_text += 'cp -L -t "${DESTDIR}include/lib@0@" "@1@"/*.h || true'.format(l, _sdir)
204 endif
205 endif
206 endif
207
208 # Pretty much everything depends on libc.
209 if l != 'c'
210 deps += 'c'
211 endif
212
213 if language == 'cpp' and l != 'cpp'
214 deps += 'cpp'
215 endif
216
217 mapfile = meson.current_build_dir() / 'lib' + l + '.map'
218
219 link_args = [ '-Wl,--no-undefined,--no-allow-shlib-undefined' ]
220 # We want linker to generate link map for debugging.
221 link_args += [ '-Wl,-Map,' + mapfile ]
222
223 # Convert strings to dependency objects
224 # TODO: this dependency business is way too convoluted due to issues in current Meson
225 _any_deps = []
226 _static_deps = []
227 _shared_deps = []
228 _include_deps = []
229 foreach s : deps
230 _any_deps += get_variable('lib' + s).get('any')
231 _static_deps += get_variable('lib' + s).get('static')
232 if not always_static
233 _shared_deps += get_variable('lib' + s).get('shared')
234 endif
235 _include_deps += get_variable('lib' + s).get('include')
236 endforeach
237
238 install_static_lib = CONFIG_DEVEL_FILES and installed_libs.contains(l)
239 install_shared_lib = allow_shared
240
241 _shared_dep = disabler()
242
243 if src.length() > 0
244 if not always_static
245 _libname = 'lib' + l + '.so.' + version.split('.')[0]
246
247 _shared_lib = shared_library(l, src,
248 # TODO: Include private headers using #include "quoted",
249 # and get rid of private_includes.
250 include_directories: [ private_includes, includes ],
251 dependencies: _shared_deps,
252 c_args: arch_uspace_c_args + c_args,
253 cpp_args: arch_uspace_c_args + c_args,
254 link_args: arch_uspace_c_args + arch_uspace_link_args + link_args,
255 version: version,
256 build_by_default: true,
257 )
258
259 if install_shared_lib
260 install_files += [[ 'lib', _shared_lib.full_path(), _libname ]]
261 install_deps += [ _shared_lib ]
262 endif
263
264 if install_shared_lib and install_debug_files
265 install_files += [[ 'debug/lib', mapfile, _libname + '.map' ]]
266 endif
267
268 if disassemble
269 _disasm = custom_target('lib' + l + '.disasm',
270 command: [ objdump, '-S', '@INPUT@' ],
271 input: _shared_lib,
272 output: 'lib' + l + '.disasm',
273 capture: true,
274 build_by_default: true,
275 )
276
277 if install_shared_lib and install_debug_files
278 install_files += [[ 'debug/lib', _disasm.full_path(), _libname + '.disasm' ]]
279 install_deps += [ _disasm ]
280 endif
281 endif
282
283 _shared_dep = declare_dependency(
284 link_with: _shared_lib,
285 # TODO: Always use `include` subdirectory for public headers,
286 # and ditch the variable.
287 include_directories: includes,
288 dependencies: _shared_deps,
289 )
290 endif
291
292 _static_lib = static_library(l, src,
293 # TODO: Include private headers using #include "quoted",
294 # and get rid of private_includes.
295 include_directories: [ private_includes, includes ],
296 dependencies: _include_deps,
297 c_args: arch_uspace_c_args + c_args,
298 cpp_args: arch_uspace_c_args + c_args,
299 )
300
301 if install_static_lib
302 install_files += [[ 'lib', _static_lib.full_path(), 'lib' + l + '.a' ]]
303 install_deps += [ _static_lib ]
304 endif
305
306 exported_devel_files += ['staticlib', _static_lib, 'lib' + l + '.a']
307
308 _static_dep = declare_dependency(
309 link_with: _static_lib,
310 # TODO: Always use `include` subdirectory for public headers,
311 # and ditch the variable.
312 include_directories: includes,
313 dependencies: _static_deps,
314 )
315
316 if always_static or not allow_shared
317 _any_dep = declare_dependency(
318 link_with: _static_lib,
319 # TODO: Always use `include` subdirectory for public headers,
320 # and ditch the variable.
321 include_directories: includes,
322 dependencies: _any_deps,
323 )
324 else
325 _any_dep = declare_dependency(
326 link_with: _shared_lib,
327 # TODO: Always use `include` subdirectory for public headers,
328 # and ditch the variable.
329 include_directories: includes,
330 dependencies: _any_deps,
331 )
332 endif
333
334 _include_dep = declare_dependency(
335 # TODO: Always use `include` subdirectory for public headers,
336 # and ditch the variable.
337 include_directories: includes,
338 dependencies: _include_deps,
339 )
340 else
341 # Header-only library.
342 _any_dep = declare_dependency(
343 include_directories: includes,
344 dependencies: _any_deps,
345 )
346 _static_dep = declare_dependency(
347 include_directories: includes,
348 dependencies: _static_deps,
349 )
350 endif
351
352 if test_src.length() > 0
353 testfiles += [ {
354 'name': l,
355 'src': test_src,
356 'includes': [ private_includes, includes ],
357 } ]
358 endif
359
360 set_variable('lib' + l, {
361 'any': _any_dep,
362 'static': _static_dep,
363 'shared': _shared_dep,
364 'include': _include_dep,
365 })
366endforeach
367
368if not CONFIG_PCUT_TESTS
369 subdir_done()
370endif
371
372# Test binaries
373foreach test : testfiles
374 _testname = test['name']
375 _libname = _testname.split('-')[0]
376 _ldargs = []
377 _test_binname = 'test-lib' + _testname
378
379 if link_map
380 # We want linker to generate link map for debugging.
381 _ldargs += [ '-Wl,-Map,' + meson.current_build_dir() / _test_binname + '.map' ]
382 endif
383
384 _bin = executable(_test_binname, test.get('src'),
385 include_directories: test.get('includes'),
386 dependencies: [ get_variable('lib' + _libname).get('any'), libpcut.get('any') ],
387 link_whole: libstartfiles,
388 c_args: arch_uspace_c_args,
389 cpp_args: arch_uspace_c_args,
390 link_args: arch_uspace_c_args + arch_uspace_link_args + _ldargs,
391 build_by_default: true,
392 )
393
394 install_files += [[ 'test', _bin.full_path(), _test_binname ]]
395 install_deps += [ _bin ]
396
397 if disassemble
398 _disasm = custom_target(_test_binname + '.disasm',
399 command: [ objdump, '-S', '@INPUT@' ],
400 input: _bin,
401 output: _test_binname + '.disasm',
402 capture: true,
403 build_by_default: true,
404 )
405
406 if install_debug_files
407 install_files += [[ 'debug/test', _disasm.full_path(), _test_binname + '.disasm' ]]
408 install_deps += [ _disasm ]
409 endif
410 endif
411endforeach
Note: See TracBrowser for help on using the repository browser.