| project('igt-gpu-tools', 'c', |
| version : '1.23', |
| default_options: [ |
| 'warning_level=2', |
| 'c_std=gnu11', |
| ], |
| license : 'MIT', |
| meson_version : '>=0.44.0') |
| |
| cc = meson.get_compiler('c') |
| |
| cc_args = [ |
| '-Wno-unused-parameter', |
| '-Wno-sign-compare', |
| '-Wno-missing-field-initializers', |
| '-Wno-clobbered', |
| # Macros asserting on the range of their arguments triggers this. |
| '-Wno-type-limits', |
| # igt_assert(0) in switch statements triggers a bunch of this. |
| '-Wimplicit-fallthrough=0', |
| ] |
| |
| foreach cc_arg : cc_args |
| if cc.has_argument(cc_arg) |
| add_global_arguments(cc_arg, language : 'c') |
| endif |
| endforeach |
| |
| _build_overlay = false |
| _overlay_required = false |
| _build_man = false |
| _man_required = false |
| _build_audio = false |
| _audio_required = false |
| _build_chamelium = false |
| _chamelium_required = false |
| _build_docs = false |
| _docs_required = false |
| _build_tests = false |
| _tests_required = false |
| _build_runner = false |
| _runner_required = false |
| |
| build_overlay = get_option('build_overlay') |
| overlay_backends = get_option('overlay_backends') |
| build_man = get_option('build_man') |
| with_valgrind = get_option('with_valgrind') |
| build_audio = get_option('build_audio') |
| build_chamelium = get_option('build_chamelium') |
| build_docs = get_option('build_docs') |
| build_tests = get_option('build_tests') |
| with_libdrm = get_option('with_libdrm') |
| build_runner = get_option('build_runner') |
| |
| _build_overlay = build_overlay != 'false' |
| _overlay_required = build_overlay == 'true' |
| _build_man = build_man != 'false' |
| _man_required = build_man == 'true' |
| _build_audio = build_audio != 'false' |
| _audio_required = build_audio == 'true' |
| _build_chamelium = build_chamelium != 'false' |
| _chamelium_required = build_chamelium == 'true' |
| _build_docs = build_docs != 'false' |
| _docs_required = build_docs == 'true' |
| _build_tests = build_tests != 'false' |
| _tests_required = build_tests == 'true' |
| _build_runner = build_runner != 'false' |
| _runner_required = build_runner == 'true' |
| |
| build_info = [] |
| |
| inc = include_directories('include/drm-uapi', 'lib', 'lib/stubs/syscalls', '.') |
| |
| inc_for_gtkdoc = include_directories('lib') |
| |
| config = configuration_data() |
| |
| null_dep = dependency('', required : false) |
| |
| libdrm_info = [] |
| libdrm_intel = null_dep |
| libdrm_nouveau = null_dep |
| libdrm_amdgpu = null_dep |
| |
| libdrm_version = '>=2.4.82' |
| libdrm = dependency('libdrm', version : libdrm_version) |
| if with_libdrm.contains('auto') or with_libdrm.contains('intel') |
| libdrm_intel = dependency('libdrm_intel', version : libdrm_version, required : with_libdrm.contains('intel')) |
| libdrm_info += 'intel' |
| endif |
| if with_libdrm.contains('auto') or with_libdrm.contains('nouveau') |
| libdrm_nouveau = dependency('libdrm_nouveau', version : libdrm_version, required : with_libdrm.contains('nouveau')) |
| libdrm_info += 'nouveau' |
| endif |
| if with_libdrm.contains('auto') or with_libdrm.contains('amdgpu') |
| libdrm_amdgpu = dependency('libdrm_amdgpu', version : libdrm_version, required : with_libdrm.contains('amdgpu')) |
| libdrm_info += 'amdgpu' |
| endif |
| |
| build_info += 'With libdrm: ' + ','.join(libdrm_info) |
| |
| pciaccess = dependency('pciaccess', version : '>=0.10') |
| libkmod = dependency('libkmod') |
| libprocps = dependency('libprocps', required : true) |
| libunwind = dependency('libunwind', required : true) |
| libdw = dependency('libdw', required : true) |
| ssl = dependency('openssl', required : true) |
| |
| valgrind = null_dep |
| valgrindinfo = 'No' |
| if with_valgrind != 'false' |
| valgrind = dependency('valgrind', required : with_valgrind == 'true') |
| if valgrind.found() |
| config.set('HAVE_VALGRIND', 1) |
| valgrindinfo = 'Yes' |
| endif |
| endif |
| build_info += 'Valgrind annotations: ' + valgrindinfo |
| |
| cairo = dependency('cairo', version : '>1.12.0', required : true) |
| libudev = dependency('libudev', required : true) |
| glib = dependency('glib-2.0', required : true) |
| |
| gsl = null_dep |
| alsa = null_dep |
| pixman = null_dep |
| if _build_audio or _build_chamelium |
| gsl = dependency('gsl', required : _audio_required or _chamelium_required) |
| endif |
| if _build_audio |
| alsa = dependency('alsa', required : _audio_required) |
| endif |
| if _build_chamelium |
| pixman = dependency('pixman-1', required : _chamelium_required) |
| endif |
| |
| audioinfo = 'No' |
| if _build_audio and alsa.found() and gsl.found() |
| audioinfo = 'Yes' |
| else |
| if _audio_required |
| error('Cannot build audio test due to missing dependencies') |
| endif |
| _build_audio = false |
| endif |
| build_info += 'Build audio test: ' + audioinfo |
| |
| xmlrpc = dependency('xmlrpc', required : false) |
| xmlrpc_util = dependency('xmlrpc_util', required : false) |
| xmlrpc_client = dependency('xmlrpc_client', required : false) |
| |
| xmlrpc_cmd = find_program('xmlrpc-c-config', required : false) |
| if not xmlrpc.found() and xmlrpc_cmd.found() |
| libs_cmd = run_command(xmlrpc_cmd, 'client', '--libs') |
| cflags_cmd = run_command(xmlrpc_cmd, 'client', '--cflags') |
| |
| if libs_cmd.returncode() == 0 and cflags_cmd.returncode() == 0 |
| xmlrpc = declare_dependency(compile_args: cflags_cmd.stdout().strip().split(), |
| link_args : libs_cmd.stdout().strip().split()) |
| xmlrpc_util = declare_dependency() |
| xmlrpc_client = declare_dependency() |
| endif |
| endif |
| |
| chamelium = null_dep |
| chameliuminfo = 'No' |
| if _build_chamelium and pixman.found() and gsl.found() and xmlrpc.found() and xmlrpc_util.found() and xmlrpc_client.found() |
| chamelium = declare_dependency(dependencies : [ pixman, xmlrpc, |
| xmlrpc_util, xmlrpc_client]) |
| config.set('HAVE_CHAMELIUM', 1) |
| chameliuminfo = 'Yes' |
| elif _chamelium_required |
| error('Cannot build chamelium test due to missing dependencies') |
| endif |
| build_info += 'Build Chamelium test: ' + chameliuminfo |
| |
| pthreads = dependency('threads') |
| math = cc.find_library('m') |
| realtime = cc.find_library('rt') |
| dlsym = cc.find_library('dl') |
| zlib = cc.find_library('z') |
| |
| if cc.has_header('linux/kd.h') |
| config.set('HAVE_LINUX_KD_H', 1) |
| endif |
| if cc.has_header('sys/kd.h') |
| config.set('HAVE_SYS_KD_H', 1) |
| endif |
| if cc.has_header('libgen.h') |
| config.set('HAVE_LIBGEN_H', 1) |
| endif |
| if cc.has_header('sys/io.h') |
| config.set('HAVE_SYS_IO_H', 1) |
| endif |
| if cc.has_header('cpuid.h') |
| # FIXME: Do we need the example link test from configure.ac? |
| config.set('HAVE_CPUID_H', 1) |
| endif |
| |
| if cc.has_member('struct sysinfo', 'totalram', |
| prefix : '#include <sys/sysinfo.h>') |
| config.set('HAVE_STRUCT_SYSINFO_TOTALRAM', 1) |
| endif |
| |
| have = cc.has_function('memfd_create', prefix : '''#include <sys/mman.h>''', args : '-D_GNU_SOURCE') |
| config.set10('HAVE_MEMFD_CREATE', have) |
| |
| add_project_arguments('-D_GNU_SOURCE', language : 'c') |
| add_project_arguments('-include', 'config.h', language : 'c') |
| |
| config.set('PACKAGE_NAME', meson.project_name()) |
| config.set_quoted('PACKAGE_VERSION', meson.project_version()) |
| config.set_quoted('PACKAGE', meson.project_name()) |
| config.set('PACKAGE_STRING', meson.project_name() + ' ' + meson.project_version()) |
| config.set_quoted('TARGET_CPU_PLATFORM', host_machine.cpu_family()) |
| |
| configure_file(output: 'config.h', install: false, configuration: config) |
| |
| prefix = get_option('prefix') |
| bindir = get_option('bindir') |
| datadir = join_paths(get_option('datadir'), 'igt-gpu-tools') |
| includedir = get_option('includedir') |
| libdir = get_option('libdir') |
| libexecdir = join_paths(get_option('libexecdir'), 'igt-gpu-tools') |
| amdgpudir = join_paths(libexecdir, 'amdgpu') |
| mandir = get_option('mandir') |
| pkgconfigdir = join_paths(libdir, 'pkgconfig') |
| |
| if get_option('use_rpath') |
| # Set up runpath for the test executables towards libigt.so. |
| # The path should be relative to $ORIGIN so the library is |
| # still found properly even if installed to a path other than |
| # prefix. |
| |
| # libdir and bindir are pathnames relative to prefix. meson |
| # enforces this. |
| |
| # 1. Start from the executable. |
| # 2. Executables are installed in certain dir. Add a .. for each |
| # directory name in it. |
| # 3. Add relative path to libdir. |
| |
| bindir_rpathdir = '$ORIGIN' |
| foreach p : bindir.split('/') |
| bindir_rpathdir = join_paths(bindir_rpathdir, '..') |
| endforeach |
| bindir_rpathdir = join_paths(bindir_rpathdir, libdir) |
| |
| libexecdir_rpathdir = '$ORIGIN' |
| foreach p : libexecdir.split('/') |
| libexecdir_rpathdir = join_paths(libexecdir_rpathdir, '..') |
| endforeach |
| libexecdir_rpathdir = join_paths(libexecdir_rpathdir, libdir) |
| |
| amdgpudir_rpathdir = '$ORIGIN' |
| foreach p : amdgpudir.split('/') |
| amdgpudir_rpathdir = join_paths(amdgpudir_rpathdir, '..') |
| endforeach |
| amdgpudir_rpathdir = join_paths(amdgpudir_rpathdir, libdir) |
| else |
| bindir_rpathdir = '' |
| libexecdir_rpathdir = '' |
| amdgpudir_rpathdir = '' |
| endif |
| |
| subdir('lib') |
| if _build_tests |
| subdir('tests') |
| build_info += 'Build tests: Yes' |
| else |
| build_info += 'Build tests: No' |
| endif |
| subdir('benchmarks') |
| subdir('tools') |
| subdir('runner') |
| if libdrm_intel.found() |
| subdir('assembler') |
| endif |
| subdir('overlay') |
| subdir('man') |
| |
| docs_info = 'No' |
| if _build_docs |
| if _build_tests |
| subdir('docs') |
| docs_info = 'Yes' |
| elif _docs_required |
| error('Documentation requires building tests') |
| endif |
| endif |
| build_info += 'Build documentation: ' + docs_info |
| |
| message('Build options') |
| message('=============') |
| foreach str : build_info |
| message(str) |
| endforeach |