1 # TODO: Use vcs_tag() to generate version string
4 # TODO: -D__$(ENDIANESS)__ in cross
5 # TODO: CONFIG_BUILD_SHARED_LIBS
6 # TODO: fix clang build
11 default_options : ['buildtype=plain', 'c_std=gnu11', 'cpp_std=c++17', 'warning_level=3', 'werror=false', 'b_staticpic=false', 'default_library=shared', 'prefix=/' ],
14 cc = meson.get_compiler('c')
15 basename = find_program('basename')
16 dirname = find_program('dirname')
17 find = find_program('find')
18 grep = find_program('grep')
19 mkarray = find_program('tools/mkarray_for_meson.sh')
20 objdump = find_program('objdump')
21 sed = find_program('sed')
22 unzip = find_program('unzip')
23 which = find_program('which')
25 autocheck = generator(find_program('tools/autocheck.awk'),
26 arguments: [ '@INPUT@' ],
27 output: '@PLAINNAME@.check.c',
32 if get_option('default_library') == 'both'
33 error('You must use either shared or static for default_library.')
38 # Output compiler flags for use by third-party builds.
39 # NOTE: See $srcroot/meson/cross/$arch for architecture-specific compiler flags.
42 message('Cross c_args:')
43 message(meson.get_cross_property('c_args'))
44 message('Cross cpp_args:')
45 message(meson.get_cross_property('cpp_args'))
46 message('Cross c_link_args:')
47 message(meson.get_cross_property('c_link_args'))
48 message('Cross cpp_link_args:')
49 message(meson.get_cross_property('cpp_link_args'))
52 # Read some variables from Makefile.common
56 'CONFIG_BUILD_SHARED_LIBS',
61 'CONFIG_PCUT_SELF_TESTS',
64 'CONFIG_STRIP_BINARIES',
66 'CONFIG_USE_SHARED_LIBS',
73 'CONFIG_AM335X_TIMERS',
77 'CONFIG_BCM2835_MAILBOX',
85 'CONFIG_IOMAP_BITMAP',
99 'CONFIG_S3C24XX_IRQC',
100 'CONFIG_S3C24XX_UART',
114 foreach varname : config_variables
115 result = run_command(grep, '^' + varname + '\\b', meson.source_root() / 'Makefile.config')
116 if result.returncode() != 0
117 # TODO: Output negative/inapplicable variables too in config, so that we can check for typos here.
118 #warning('Missing configuration variable ' + varname + ' in Makefile.config')
119 set_variable(varname, false)
123 value = result.stdout().split('\n')[0].strip().split('=')[1].strip()
130 set_variable(varname, value)
132 message([ varname, value ])
136 # Also read version information.
137 version_variables = [
145 foreach varname : version_variables
146 line = run_command(grep, '^' + varname + '\\b', meson.source_root() / 'version', check: true).stdout().strip()
147 value = line.split('=')[1].strip()
148 set_variable('HELENOS_' + varname, value)
150 message([ 'HELENOS_' + varname, value ])
154 HELENOS_RELEASE = HELENOS_VERSION + '.' + HELENOS_PATCHLEVEL + '.' + HELENOS_SUBLEVEL
156 h_arch = meson.get_cross_property('h_arch')
158 meson.add_install_script('install.sh', CONFIG_DEVEL_FILES.to_string())
160 add_project_arguments(
161 # TODO: Remove from project arguments and only use where needed.
162 '-imacros', join_paths(meson.source_root(), 'config.h'),
166 add_project_link_arguments(
167 cc.get_supported_link_arguments([
171 '-Wl,--fatal-warnings',
172 language : [ 'c', 'cpp' ],
176 add_project_arguments(
177 '-mcpu=' + '-'.join(PROCESSOR.split('_')),
178 CONFIG_FPU ? '-mfloat-abi=hard' : [],
179 language : [ 'c', 'cpp' ],
182 add_project_link_arguments(
183 '-mcpu=' + '-'.join(PROCESSOR.split('_')),
184 CONFIG_FPU ? '-mfloat-abi=hard' : [],
185 language : [ 'c', 'cpp' ],
188 elif h_arch == 'ia32'
189 # FIXME: enabling -march for uspace makes malloc tests crash. Investigate.
191 # if PROCESSOR == 'core'
193 # add_project_arguments('-march=prescott', language : [ 'c', 'cpp' ])
194 # add_project_link_arguments('-march=prescott', language : [ 'c', 'cpp' ])
196 # add_project_arguments('-march=' + '-'.join(PROCESSOR.split('_')), language : [ 'c', 'cpp' ])
197 # add_project_link_arguments('-march=' + '-'.join(PROCESSOR.split('_')), language : [ 'c', 'cpp' ])
200 elif h_arch == 'mips32'
203 add_project_arguments('-march=r4000', language : [ 'c', 'cpp' ])
204 add_project_link_arguments('-march=r4000', language : [ 'c', 'cpp' ])
206 elif MACHINE == 'bmalta'
207 add_project_arguments('-march=4kc', language : [ 'c', 'cpp' ])
208 add_project_link_arguments('-march=4kc', language : [ 'c', 'cpp' ])
210 elif MACHINE == 'lmalta'
211 add_project_arguments('-march=4kc', language : [ 'c', 'cpp' ])
212 add_project_link_arguments('-march=4kc', language : [ 'c', 'cpp' ])
215 error('Unknown machine')
219 elif h_arch == 'ppc32'
222 float = '-mhard-float'
224 float = '-msoft-float'
227 add_project_arguments(float, language : [ 'c', 'cpp' ])
228 add_project_link_arguments(float, language : [ 'c', 'cpp' ])
232 # TODO: enable more warnings
233 # FIXME: -fno-builtin-strftime works around seemingly spurious format warning.
234 # We should investigate what's going on there.
236 extra_common_flags = [
238 '-fexec-charset=UTF-8',
239 '-finput-charset=UTF-8',
242 '-Wa,--fatal-warnings',
247 '-Werror-implicit-function-declaration',
253 '-Wno-unused-parameter',
256 '-ffunction-sections',
260 '-fdebug-prefix-map=' + meson.source_root() + '=.',
264 extra_common_flags += [ '-fvar-tracking-assignments' ]
268 extra_common_flags += [ '-Werror' ]
272 extra_common_flags += [ '-gdwarf-4', '-g3' ]
275 extra_cflags = extra_common_flags + [
276 '-imacros', join_paths(meson.source_root(), 'config.h'),
278 '-Wmissing-prototypes',
280 '-Wno-missing-braces',
281 '-Wno-missing-field-initializers',
282 '-Wno-unused-command-line-argument',
283 '-Wno-unused-parameter',
284 '-Wno-typedef-redefinition',
286 '-Wno-nonnull-compare',
288 '-fno-builtin-strftime',
292 extra_cflags += '-fsanitize=undefined'
295 extra_cppflags = extra_common_flags + [
302 'cpp': extra_cppflags,
305 # Process flags. Only sets those that compiler supports.
306 foreach lang : [ 'c', 'cpp' ]
307 extra_cflags = meson.get_compiler(lang).get_supported_arguments(w_flags.get(lang))
308 add_project_arguments(extra_cflags, language : [ lang ])
309 add_project_link_arguments(extra_cflags, language : [ lang ])
316 ## Generate config.mk
318 # Get the directory where the compiler resides.
320 cc_fullname = run_command(which, meson.get_compiler('c').cmd_array()[0].split(' ')[0], check: true).stdout().strip()
321 cc_path = run_command(dirname, cc_fullname, check: true).stdout().strip()
323 message(['Compiler directory is:', cc_path])
326 '-isystem', '$(HELENOS_EXPORT_ROOT)/include/posix',
327 '-isystem', '$(HELENOS_EXPORT_ROOT)/include/libc',
328 '-idirafter', '$(HELENOS_EXPORT_ROOT)/include',
333 '-L$(HELENOS_EXPORT_ROOT)/lib',
334 '-Wl,--whole-archive',
335 '$(HELENOS_EXPORT_ROOT)/lib/libstartfiles.a',
336 '-Wl,--no-whole-archive',
345 '-Wl,--no-as-needed',
348 cc_arch = meson.get_cross_property('cc_arch')
350 conf_data = configuration_data({
351 'HELENOS_CROSS_PATH' : cc_path,
352 'HELENOS_ARCH' : cc_arch,
353 'HELENOS_CFLAGS' : ' '.join(meson.get_cross_property('c_args')),
354 'HELENOS_CXXFLAGS' : ' '.join(meson.get_cross_property('cpp_args')),
355 'HELENOS_CPPFLAGS' : ' '.join(export_cppflags),
356 'HELENOS_LDFLAGS' : ' '.join(export_ldflags),
357 'HELENOS_LDLIBS' : ' '.join(export_ldlibs),
358 'HELENOS_TARGET' : cc_arch + '-helenos',
361 config_mk = configure_file(
362 input: 'config.mk.in',
364 configuration: conf_data,
366 install_dir: 'config',
369 custom_target('config.sh',
372 command: [ sed, 's:$(HELENOS_EXPORT_ROOT):${HELENOS_EXPORT_ROOT}:g', '@INPUT@' ],
375 install_dir: 'config',
378 install_data('Makefile.common', 'Makefile.config', install_dir: 'config')