# a sort-of realistic example that combines the sourceset and keyval # modules, inspired by QEMU's build system project('sourceset-example', 'cpp', default_options: ['cpp_std=c++11']) cppid = meson.get_compiler('cpp').get_id() if cppid == 'pgi' error('MESON_SKIP_TEST: Even PGI 19.4 that claims C++17 full support, cannot handle auto x = y syntax used in this test.') endif ss = import('sourceset') keyval = import('keyval') zlib = declare_dependency(compile_args: '-DZLIB=1') another = declare_dependency(compile_args: '-DANOTHER=1') not_found = dependency('not-found', required: false, method : 'pkg-config') common = ss.source_set() specific = ss.source_set() common.add(files('main.cc')) common.add(when: [zlib, another], if_true: files('zlib.cc')) common.add(when: not_found, if_true: files('was-found.cc'), if_false: files('not-found.cc')) subdir('boards') subdir('devices') if meson.is_unity() specific.add_all(common) common = ss.source_set() common.add(files('dummy.cpp')) endif common_lib = static_library('common', common.all_sources(), dependencies: common.all_dependencies()) targets = [ 'arm', 'aarch64', 'x86' ] target_dirs = { 'arm' : 'arm', 'aarch64' : 'arm', 'x86': 'x86' } foreach x : targets config = keyval.load('config' / x) target_specific = specific.apply(config, strict: false) target_common = common.apply(config, strict: false) target_deps = target_specific.dependencies() + target_common.dependencies() executable(x, objects: common_lib.extract_objects(target_common.sources()), sources: target_specific.sources(), dependencies: target_deps, include_directories: 'boards' / target_dirs[x], cpp_args: '-DTHE_TARGET="' + x + '"') endforeach