diff mbox

[i-g-t,12/22] meson: basic build system support

Message ID 20170905123624.21315-13-daniel.vetter@ffwll.ch (mailing list archive)
State New, archived
Headers show

Commit Message

Daniel Vetter Sept. 5, 2017, 12:36 p.m. UTC
Why?

Because it's fast.

Like really, really fast.

Some data (from a snb laptop, so rather lower-powered):

- Incremental build after $ touch lib/igt_core.c with meson: 0.6s
  It notices that the symbol list of the libigt.so hasn't changed and
  doesn't bother re-linking the almost 300 binaries we have. make -j 6
  for the same scenario takes 44s.

- Incremental build with nothing changed: make: 0.7s, meson: 0.2s This
  means stuff like --disable-git-hash is entirely pointless with
  meson, it's faster than a make ever can be (with 0.6s).

- Reconfigure stage: ninja reconfigure 0.8s vs. ./configure 8.6s)

- Running tests, after a full build: ninja test 6s vs. make check 24s

- Full build (i.e. including ./autogen.sh respectively meson build),
  including tests, from a pristine git checkout. automake 2m49s vs.
  meson 44s.

Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Eric Anholt <eric@anholt.net>
Cc: Daniel Stone <daniel@fooishbar.org>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
---
 .gitignore                       |   1 +
 assembler/meson.build            |  73 ++++++++++
 benchmarks/meson.build           |  36 +++++
 lib/meson.build                  | 166 ++++++++++++++++++++++
 lib/prepend_log_domain.sh        |   8 ++
 lib/tests/meson.build            |  34 +++++
 lib/version.h.in                 |   1 +
 meson.build                      | 105 ++++++++++++++
 overlay/meson.build              |  59 ++++++++
 tests/generate_testlist.sh       |  10 ++
 tests/meson.build                | 290 +++++++++++++++++++++++++++++++++++++++
 tools/meson.build                |  59 ++++++++
 tools/null_state_gen/meson.build |  15 ++
 13 files changed, 857 insertions(+)
 create mode 100644 assembler/meson.build
 create mode 100644 benchmarks/meson.build
 create mode 100644 lib/meson.build
 create mode 100755 lib/prepend_log_domain.sh
 create mode 100644 lib/tests/meson.build
 create mode 100644 lib/version.h.in
 create mode 100644 meson.build
 create mode 100644 overlay/meson.build
 create mode 100755 tests/generate_testlist.sh
 create mode 100644 tests/meson.build
 create mode 100644 tools/meson.build
 create mode 100644 tools/null_state_gen/meson.build

Comments

Jani Nikula Sept. 6, 2017, 2:01 p.m. UTC | #1
On Tue, 05 Sep 2017, Daniel Vetter <daniel.vetter@ffwll.ch> wrote:
> Why?
>
> Because it's fast.

And that's not even the main reason from my perspective! ;)

Please find some comments inline. None of them are blockers.

BR,
Jani.

>
> Like really, really fast.
>
> Some data (from a snb laptop, so rather lower-powered):
>
> - Incremental build after $ touch lib/igt_core.c with meson: 0.6s
>   It notices that the symbol list of the libigt.so hasn't changed and
>   doesn't bother re-linking the almost 300 binaries we have. make -j 6
>   for the same scenario takes 44s.
>
> - Incremental build with nothing changed: make: 0.7s, meson: 0.2s This
>   means stuff like --disable-git-hash is entirely pointless with
>   meson, it's faster than a make ever can be (with 0.6s).
>
> - Reconfigure stage: ninja reconfigure 0.8s vs. ./configure 8.6s)
>
> - Running tests, after a full build: ninja test 6s vs. make check 24s
>
> - Full build (i.e. including ./autogen.sh respectively meson build),
>   including tests, from a pristine git checkout. automake 2m49s vs.
>   meson 44s.
>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Cc: Eric Anholt <eric@anholt.net>
> Cc: Daniel Stone <daniel@fooishbar.org>
> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
> ---
>  .gitignore                       |   1 +
>  assembler/meson.build            |  73 ++++++++++
>  benchmarks/meson.build           |  36 +++++
>  lib/meson.build                  | 166 ++++++++++++++++++++++
>  lib/prepend_log_domain.sh        |   8 ++
>  lib/tests/meson.build            |  34 +++++
>  lib/version.h.in                 |   1 +
>  meson.build                      | 105 ++++++++++++++
>  overlay/meson.build              |  59 ++++++++
>  tests/generate_testlist.sh       |  10 ++
>  tests/meson.build                | 290 +++++++++++++++++++++++++++++++++++++++
>  tools/meson.build                |  59 ++++++++
>  tools/null_state_gen/meson.build |  15 ++
>  13 files changed, 857 insertions(+)
>  create mode 100644 assembler/meson.build
>  create mode 100644 benchmarks/meson.build
>  create mode 100644 lib/meson.build
>  create mode 100755 lib/prepend_log_domain.sh
>  create mode 100644 lib/tests/meson.build
>  create mode 100644 lib/version.h.in
>  create mode 100644 meson.build
>  create mode 100644 overlay/meson.build
>  create mode 100755 tests/generate_testlist.sh
>  create mode 100644 tests/meson.build
>  create mode 100644 tools/meson.build
>  create mode 100644 tools/null_state_gen/meson.build
>
> diff --git a/.gitignore b/.gitignore
> index 6204965a0e32..e6919272d8b6 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -93,3 +93,4 @@ intel-gpu-tools-*/
>  
>  piglit
>  results
> +build
> diff --git a/assembler/meson.build b/assembler/meson.build
> new file mode 100644
> index 000000000000..bdddd0e2db25
> --- /dev/null
> +++ b/assembler/meson.build
> @@ -0,0 +1,73 @@
> +lib_brw_src = [
> +	'brw_context.c',
> +	'brw_disasm.c',
> +	'brw_eu.c',
> +	'brw_eu_compact.c',
> +	'brw_eu_debug.c',
> +	'brw_eu_emit.c',
> +	'brw_eu_util.c',
> +	'gen8_disasm.c',
> +	'gen8_instruction.c',
> +	'ralloc.c',
> +]

FWIW I like this style of assigning lists.

> +
> +lib_brw = shared_library('brw', lib_brw_src,
> +		dependencies : igt_deps)

The Emacs meson mode nicely indents the continuation lines after the
opening (. These seem off... all over the place.

> +
> +flex = find_program('flex')
> +bison = find_program('bison')
> +
> +lgen = generator(flex,
> +		output : '@BASENAME@.c',
> +		arguments : ['-o', '@OUTPUT@', '@INPUT@'])
> +
> +lfiles = lgen.process('lex.l')
> +
> +pgen = generator(bison,
> +		output : ['@BASENAME@.c', '@BASENAME@.h'],
> +		arguments : ['@INPUT@', '--defines=@OUTPUT1@', '--output=@OUTPUT0@'])
> +
> +pfiles = pgen.process('gram.y')
> +
> +executable('intel-gen4asm', 'main.c', lfiles, pfiles, link_with : lib_brw)
> +
> +executable('intel-gen4disasm', 'disasm-main.c', link_with : lib_brw)
> +
> +gen4asm_testcases = [
> +	'test/mov',
> +	'test/frc',
> +	'test/rndd',
> +	'test/rndu',
> +	'test/rnde',
> +	'test/rnde-intsrc',
> +	'test/rndz',
> +	'test/lzd',
> +	'test/not',
> +	'test/immediate',
> +]
> +
> +# Those tests were already failing when the assembler was imported from
> +# the intel-gen4asm git repository:
> +#   http://cgit.freedesktop.org/xorg/app/intel-gen4asm/
> +# We disable them "for now" as a workaround to be able to release i-g-t
> +gen4asm_testcases_broken = [
> +	'test/declare',
> +	'test/jmpi',
> +	'test/if',
> +	'test/iff',
> +	'test/while',
> +	'test/else',
> +	'test/break',
> +	'test/cont',
> +	'test/halt',
> +	'test/wait',
> +	'test/endif',
> +]
> +
> +test_runner = find_program('test/run-test.sh')
> +foreach testcase : gen4asm_testcases
> +	test('assembler: ' + testcase, test_runner,
> +			args : testcase,
> +			env : [ 'srcdir=' + meson.current_source_dir(),
> +				'top_builddir=' + meson.current_build_dir()])
> +endforeach
> diff --git a/benchmarks/meson.build b/benchmarks/meson.build
> new file mode 100644
> index 000000000000..9ab738f76588
> --- /dev/null
> +++ b/benchmarks/meson.build
> @@ -0,0 +1,36 @@
> +benchmark_progs = [
> +	'gem_blt',
> +	'gem_busy',
> +	'gem_create',
> +	'gem_exec_ctx',
> +	'gem_exec_fault',
> +	'gem_exec_nop',
> +	'gem_exec_reloc',
> +	'gem_exec_trace',
> +	'gem_latency',
> +	'gem_mmap',
> +	'gem_prw',
> +	'gem_set_domain',
> +	'gem_syslatency',
> +	'gem_wsim',
> +	'kms_vblank',
> +	'prime_lookup',
> +	'vgem_mmap',
> +]
> +
> +if libdrm_intel.found()
> +	benchmark_progs += [
> +		'intel_upload_blit_large',
> +		'intel_upload_blit_large_gtt',
> +		'intel_upload_blit_large_map',
> +		'intel_upload_blit_small',
> +		'gem_userptr_benchmark',
> +	]
> +endif
> +
> +foreach prog : benchmark_progs
> +	# FIXME meson doesn't like binaries with the same name
> +	# meanwhile just suffix with _bench
> +	executable(prog + '_bench', prog + '.c',
> +			dependencies : test_deps)
> +endforeach
> diff --git a/lib/meson.build b/lib/meson.build
> new file mode 100644
> index 000000000000..51d3f9e278da
> --- /dev/null
> +++ b/lib/meson.build
> @@ -0,0 +1,166 @@
> +lib_headers = [
> +	'debug.h',
> +	'drmtest.h',
> +	'i830_reg.h',
> +	'i915_3d.h',
> +	'i915_reg.h',
> +	'i915_pciids.h',
> +	'igt.h',
> +	'igt_debugfs.h',
> +	'igt_aux.h',
> +	'igt_edid_template.h',
> +	'igt_gt.h',
> +	'igt_gvt.h',
> +	'igt_primes.h',
> +	'igt_rand.h',
> +	'igt_stats.h',
> +	'igt_sysfs.h',
> +	'igt_x86.h',
> +	'igt_vgem.h',
> +	'instdone.h',
> +	'intel_batchbuffer.h',
> +	'intel_chipset.h',
> +	'intel_io.h',
> +	'intel_reg.h',
> +	'ioctl_wrappers.h',
> +	'media_fill.h',
> +	'media_spin.h',
> +	'gpgpu_fill.h',
> +	'gen7_media.h',
> +	'gen8_media.h',
> +	'gen6_render.h',
> +	'gen7_render.h',
> +	'gen8_render.h',
> +	'gen9_render.h',
> +	'rendercopy.h',
> +	'sw_sync.h',
> +	'igt_kms.h',
> +	'igt_fb.h',
> +	'igt_core.h',
> +	'igt_draw.h',
> +	'igt_pm.h',
> +	'igt_dummyload.h',
> +	'uwildmat/uwildmat.h',
> +	'igt_kmod.h',
> +]
> +
> +lib_sources = [
> +	'drmtest.c',
> +	'igt_debugfs.c',
> +	'igt_aux.c',
> +	'igt_gt.c',
> +	'igt_gvt.c',
> +	'igt_primes.c',
> +	'igt_rand.c',
> +	'igt_stats.c',
> +	'igt_sysfs.c',
> +	'igt_x86.c',
> +	'igt_vgem.c',
> +	'instdone.c',
> +	'intel_batchbuffer.c',
> +	'intel_chipset.c',
> +	'intel_device_info.c',
> +	'intel_os.c',
> +	'intel_mmio.c',
> +	'ioctl_wrappers.c',
> +	'media_fill_gen7.c',
> +	'media_fill_gen8.c',
> +	'media_fill_gen8lp.c',
> +	'media_fill_gen9.c',
> +	'media_spin.c',
> +	'gpgpu_fill.c',
> +	'rendercopy_i915.c',
> +	'rendercopy_i830.c',
> +	'rendercopy_gen6.c',
> +	'rendercopy_gen7.c',
> +	'rendercopy_gen8.c',
> +	'rendercopy_gen9.c',
> +	'sw_sync.c',
> +	'intel_reg_map.c',
> +	'intel_iosf.c',
> +	'igt_kms.c',
> +	'igt_fb.c',
> +	'igt_core.c',
> +	'igt_draw.c',
> +	'igt_pm.c',
> +	'igt_dummyload.c',
> +	'uwildmat/uwildmat.c',
> +	'igt_kmod.c',
> +]
> +
> +lib_deps = [
> +	cairo,
> +	glib,
> +	libdrm,
> +	libkmod,
> +	libprocps,
> +	libudev,
> +	libunwind,
> +	pciaccess,
> +	pthreads,
> +	math,
> +	realtime,
> +]
> +
> +if libdrm_intel.found()
> +	lib_deps += libdrm_intel
> +else
> +	lib_headers += 'stubs/drm/intel_bufmgr.h'
> +	lib_sources += 'stubs/drm/intel_bufmgr.c'
> +endif
> +
> +if libdrm_vc4.found()
> +	lib_headers += 'igt_vc4.h'
> +	lib_sources += 'igt_vc4.c'
> +endif
> +if valgrind.found()
> +	lib_deps += valgrind
> +endif
> +
> +if gsl.found()
> +	lib_deps += gsl
> +	lib_headers += [ 'igt_frame.h', 'igt_audio.h' ]
> +	lib_sources += [ 'igt_frame.c', 'igt_audio.c' ]
> +endif
> +
> +if alsa.found()
> +	lib_deps += alsa
> +	lib_headers += 'igt_alsa.h'
> +	lib_sources += 'igt_alsa.c'
> +endif
> +
> +if chamelium.found()
> +	lib_deps += chamelium
> +	lib_headers += 'igt_chamelium.h'
> +	lib_sources += 'igt_chamelium.c'
> +endif
> +
> +install_headers(lib_headers)
> +
> +pkgdatadir = join_paths(get_option('prefix'), get_option('datadir'), 'intel-gpu-tools')
> +srcdir = join_paths(meson.source_root(), 'tests')
> +
> +vcs_tag(input : 'version.h.in', output : 'version.h',
> +	fallback : 'NO-GIT',
> +	command : [ 'git', 'log', '-n1', '--pretty=format:g%h' ] )
> +
> +# FIXME we don't regenerate when the script changes
> +prepend_log_domain = generator(find_program('prepend_log_domain.sh'),
> +		arguments : [ '@INPUT@', '@OUTPUT@' ],
> +		output : '@PLAINNAME@' + '.pre.c')
> +
> +processed_src_dep = prepend_log_domain.process(lib_sources)
> +
> +lib_igt_build = shared_library('igt',
> +			 processed_src_dep,
> +			 include_directories : inc,
> +			 dependencies : lib_deps,
> +			 c_args : [ '-DIGT_DATADIR="@0@"'.format(pkgdatadir),
> +				'-DIGT_SRCDIR="@0@"'.format(srcdir), ])
> +
> +lib_igt = declare_dependency(link_with : lib_igt_build,
> +			    include_directories : inc)
> +
> +igt_deps = [ lib_igt ] + lib_deps
> +
> +subdir('tests')
> diff --git a/lib/prepend_log_domain.sh b/lib/prepend_log_domain.sh
> new file mode 100755
> index 000000000000..93a911508b7f
> --- /dev/null
> +++ b/lib/prepend_log_domain.sh
> @@ -0,0 +1,8 @@
> +#!/bin/bash
> +
> +input=$1
> +output=$2
> +basename=$(basename $1 .c)
> +
> +echo "#define IGT_LOG_DOMAIN \"$basename\"" > $output
> +cat $input >> $output
> diff --git a/lib/tests/meson.build b/lib/tests/meson.build
> new file mode 100644
> index 000000000000..29bdb2c4222c
> --- /dev/null
> +++ b/lib/tests/meson.build
> @@ -0,0 +1,34 @@
> +lib_tests = [
> +	'igt_fork_helper',
> +	'igt_list_only',
> +	'igt_simulation',
> +	'igt_stats',
> +	'igt_segfault',
> +	'igt_subtest_group',
> +	'igt_assert',
> +	'igt_exit_handler',
> +	'igt_hdmi_inject',
> +	'igt_can_fail',
> +	'igt_can_fail_simple',
> +]
> +
> +lib_fail_tests = [
> +	'igt_no_exit',
> +	'igt_no_exit_list_only',
> +	'igt_no_subtest',
> +	'igt_simple_test_subtests',
> +	'igt_timeout',
> +	'igt_invalid_subtest_name',
> +]
> +
> +foreach lib_test : lib_tests
> +	exec = executable(lib_test, lib_test + '.c', install : true,
> +			dependencies : igt_deps)
> +	test('lib: ' + lib_test, exec)
> +endforeach
> +
> +foreach lib_test : lib_fail_tests
> +	exec = executable(lib_test, lib_test + '.c', install : true,
> +			dependencies : igt_deps)
> +	test('lib: ' + lib_test, exec, should_fail : true)
> +endforeach
> diff --git a/lib/version.h.in b/lib/version.h.in
> new file mode 100644
> index 000000000000..72fc6978cf32
> --- /dev/null
> +++ b/lib/version.h.in
> @@ -0,0 +1 @@
> +#define IGT_GIT_SHA1 "@VCS_TAG@"
> diff --git a/meson.build b/meson.build
> new file mode 100644
> index 000000000000..fee64fcdf36e
> --- /dev/null
> +++ b/meson.build
> @@ -0,0 +1,105 @@
> +project('IGT gpu tests', 'c',
> +	version : '1.19',
> +        default_options: [
> +          'warning_level=2',
> +          'c_std=gnu99',
> +        ],
> +	license : 'MIT')
> +
> +cc = meson.get_compiler('c')
> +
> +inc = include_directories('lib', '.')
> +
> +config_h = configuration_data()
> +
> +libdrm = dependency('libdrm', version : '>=2.4.82')
> +libdrm_intel = dependency('libdrm_intel', required : false)
> +libdrm_vc4 = dependency('libdrm_vc4', required : false)
> +libdrm_nouveau = dependency('libdrm_nouveau', required : false)
> +libdrm_amdgpu = dependency('libdrm_amdgpu', required : false)
> +
> +pciaccess = dependency('pciaccess', version : '>=0.10')
> +libkmod = dependency('libkmod')
> +libprocps = dependency('libprocps', required : false)
> +if libprocps.found()
> +	config_h.set('HAVE_PROCPS', 1)
> +endif

I wish we used #if instead of #ifdef in code. With that you could use
the one-liner:

config_h.set10('HAVE_PROCPS', libprocps.found())

and have

#define HAVE_PROCPS 0

in config.h, which is helpful for debugging issues.

> +
> +valgrind = dependency('valgrind', required : false)
> +if valgrind.found()
> +	config_h.set('HAVE_VALGRIND', 1)
> +endif
> +
> +cairo = dependency('cairo', version : '>1.12.0', required : false)
> +
> +libudev = dependency('libudev', required : false)
> +if libudev.found()
> +	config_h.set('HAVE_UDEV', 1)
> +endif
> +
> +glib = dependency('glib-2.0', required : false)
> +if glib.found()
> +	config_h.set('HAVE_GLIB', 1)
> +endif
> +
> +libunwind = dependency('libunwind')
> +gsl = dependency('gsl', required : false)
> +alsa = dependency('alsa', required : false)
> +
> +pixman = dependency('pixman-1', required : false)
> +xmlrpc = dependency('xmlrpc', required : false)
> +xmlrpc_util = dependency('xmlrpc_util', required : false)
> +xmlrpc_client = dependency('xmlrpc_client', required : false)
> +
> +if pixman.found() and xmlrpc.found() and xmlrpc_util.found() and xmlrpc_client.found()
> +	chamelium = declare_dependency(dependencies : [ pixman, xmlrpc,
> +	  xmlrpc_util, xmlrpc_client])
> +else
> +	chamelium = dependency('', required: false)
> +endif
> +
> +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_h.set('HAVE_LINUX_KD_H', 1)
> +endif
> +if cc.has_header('sys/kd.h')
> +	config_h.set('HAVE_SYS_KD_H', 1)
> +endif
> +if cc.has_header('libgen.h')
> +	config_h.set('HAVE_LIBGEN_H', 1)
> +endif
> +if cc.has_header('sys/io.h')
> +	config_h.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_h.set('HAVE_CPUID_H', 1)
> +endif
> +
> +if cc.has_member('struct sysinfo', 'totalram',
> +		prefix : '#include <sys/sysinfo.h>')
> +	config_h.set('HAVE_STRUCT_SYSINFO_TOTALRAM', 1)
> +endif
> +
> +add_project_arguments('-D_GNU_SOURCE', language : 'c')
> +add_project_arguments('-include', 'config.h', language : 'c')

Ooo, that's a nice way to do this. TIL.

> +
> +config_h.set_quoted('PACKAGE_VERSION', meson.project_version())
> +config_h.set_quoted('PACKAGE', meson.project_name())
> +config_h.set_quoted('TARGET_CPU_PLATFORM', host_machine.cpu_family())
> +
> +configure_file(output: 'config.h', install: false, configuration: config_h)

This makes me think config_h is a misnomer for the configuration data
object. I'd probably use plain "config" instead.

I think we'll end up wanting to use the configuration data for the test
runner shell scripts too, and generate a sh.config from the same
config. We can source the sh.config from e.g. run-tests.sh, to figure
out the source and build directories. We can use find_program() to find
piglit, for example, and shove that into sh.config.

Look at the beginning of run-tests.sh and see how much better it could
be with a sh.config.

Of course, the alternative is to use a separate configuration data
object for sh.config, but I think it's clearer to use one, and use .in
files to decide what goes in them.

> +
> +subdir('lib')
> +subdir('tests')
> +subdir('benchmarks')
> +subdir('tools')
> +if libdrm_intel.found()
> +	subdir('assembler')
> +	subdir('overlay')
> +endif
> diff --git a/overlay/meson.build b/overlay/meson.build
> new file mode 100644
> index 000000000000..a4b778ca5a86
> --- /dev/null
> +++ b/overlay/meson.build
> @@ -0,0 +1,59 @@
> +gpu_overlay_src = [
> +	'chart.c',
> +	'config.c',
> +	'cpu-top.c',
> +	'debugfs.c',
> +	'gem-interrupts.c',
> +	'gem-objects.c',
> +	'gpu-top.c',
> +	'gpu-perf.c',
> +	'gpu-freq.c',
> +	'igfx.c',
> +	'overlay.c',
> +	'perf.c',
> +	'power.c',
> +	'rc6.c',
> +]
> +
> +xv = dependency('xv', required : false)
> +x11 = dependency('x11', required : false)
> +xext = dependency('xext', required : false)
> +dri2proto = dependency('dri2proto', version : '>= 2.6', required : false)
> +cairo_xlib = dependency('cairo-xlib', required : false)
> +xrandr = dependency('xrandr', version : '>=1.3', required : false)
> +
> +gpu_overlay_deps = [ realtime, cairo, pciaccess, libdrm, libdrm_intel ]
> +
> +both_x11_src = ''
> +
> +gpu_overlay_cflags = []
> +if xv.found() and x11.found() and xext.found() and dri2proto.found()
> +	both_x11_src = 'x11/position.c'
> +	gpu_overlay_src += [
> +		'x11/dri2.c',
> +		'x11/dri2.h',
> +		'x11/rgb2yuv.c',
> +		'x11/rgb2yuv.h',
> +		'x11/x11-overlay.c',
> +	]
> +	gpu_overlay_deps += [ xv, x11, xext, dri2proto ]
> +	gpu_overlay_cflags += [ '-DHAVE_OVERLAY_XVLIB' ]

Hmm, seems a bit odd to have the config data split between a
configuration data object and flags like this.

> +endif
> +
> +if cairo_xlib.found() and xrandr.found() and dri2proto.found()
> +	both_x11_src = 'x11/position.c'
> +	gpu_overlay_src += 'x11/x11-window.c'
> +	gpu_overlay_deps += [ cairo_xlib, dri2proto ]
> +	gpu_overlay_cflags += [ '-DHAVE_OVERLAY_XLIB' ]

Ditto.

> +endif
> +
> +gpu_overlay_src += both_x11_src
> +
> +gpu_overlay_src += 'kms/kms-overlay.c'
> +
> +if xrandr.found() and cairo.found()
> +	executable('intel_gpu_overlay', gpu_overlay_src,
> +			include_directories : inc,
> +			c_args : gpu_overlay_cflags,
> +			dependencies : gpu_overlay_deps)
> +endif
> diff --git a/tests/generate_testlist.sh b/tests/generate_testlist.sh
> new file mode 100755
> index 000000000000..6ea78655daca
> --- /dev/null
> +++ b/tests/generate_testlist.sh
> @@ -0,0 +1,10 @@
> +#!/bin/bash
> +
> +echo TESTLIST > $MESON_BUILD_ROOT/tests/test-list.txt
> +
> +while [[ $# -gt 0 ]] ; do
> +	echo $1 >> $MESON_BUILD_ROOT/tests/test-list.txt
> +	shift
> +done
> +
> +echo END TESTLIST >> $MESON_BUILD_ROOT/tests/test-list.txt
> diff --git a/tests/meson.build b/tests/meson.build
> new file mode 100644
> index 000000000000..73833758be0e
> --- /dev/null
> +++ b/tests/meson.build
> @@ -0,0 +1,290 @@
> +test_progs = [
> +	'core_auth',
> +	'core_get_client_auth',
> +	'core_getclient',
> +	'core_getstats',
> +	'core_getversion',
> +	'core_prop_blob',
> +	'core_setmaster_vs_auth',
> +	'debugfs_test',
> +	'drm_import_export',
> +	'drm_mm',
> +	'drm_read',
> +	'drm_vma_limiter',
> +	'drm_vma_limiter_cached',
> +	'drm_vma_limiter_cpu',
> +	'drm_vma_limiter_gtt',
> +	'drv_getparams_basic',
> +	'drv_hangman',
> +	'drv_missed_irq',
> +	'drv_module_reload',
> +	'drv_selftest',
> +	'drv_suspend',
> +	'gem_bad_length',
> +	'gem_bad_reloc',
> +	'gem_basic',
> +	'gem_busy',
> +	'gem_caching',
> +	'gem_close',
> +	'gem_close_race',
> +	'gem_concurrent_blit',
> +	'gem_cpu_reloc',
> +	'gem_create',
> +	'gem_cs_prefetch',
> +	'gem_cs_tlb',
> +	'gem_ctx_bad_destroy',
> +	'gem_ctx_bad_exec',
> +	'gem_ctx_basic',
> +	'gem_ctx_create',
> +	'gem_ctx_exec',
> +	'gem_ctx_param',
> +	'gem_ctx_switch',
> +	'gem_ctx_thrash',
> +	'gem_double_irq_loop',
> +	'gem_eio',
> +	'gem_evict_alignment',
> +	'gem_evict_everything',
> +	'gem_exec_alignment',
> +	'gem_exec_async',
> +	'gem_exec_await',
> +	'gem_exec_bad_domains',
> +	'gem_exec_basic',
> +	'gem_exec_big',
> +	'gem_exec_blt',
> +	'gem_exec_capture',
> +	'gem_exec_create',
> +	'gem_exec_faulting_reloc',
> +	'gem_exec_fence',
> +	'gem_exec_flush',
> +	'gem_exec_gttfill',
> +	'gem_exec_latency',
> +	'gem_exec_lut_handle',
> +	'gem_exec_nop',
> +	'gem_exec_parallel',
> +	'gem_exec_params',
> +	'gem_exec_parse',
> +	'gem_exec_reloc',
> +	'gem_exec_reuse',
> +	'gem_exec_schedule',
> +	'gem_exec_store',
> +	'gem_exec_suspend',
> +	'gem_exec_whisper',
> +	'gem_fd_exhaustion',
> +	'gem_fence_thrash',
> +	'gem_fence_upload',
> +	'gem_fenced_exec_thrash',
> +	'gem_flink_basic',
> +	'gem_flink_race',
> +	'gem_gpgpu_fill',
> +	'gem_gtt_cpu_tlb',
> +	'gem_gtt_hog',
> +	'gem_gtt_speed',
> +	'gem_hangcheck_forcewake',
> +	'gem_largeobject',
> +	'gem_linear_blits',
> +	'gem_lut_handle',
> +	'gem_madvise',
> +	'gem_media_fill',
> +	'gem_mmap',
> +	'gem_mmap_gtt',
> +	'gem_mmap_offset_exhaustion',
> +	'gem_mmap_wc',
> +	'gem_mocs_settings',
> +	'gem_partial_pwrite_pread',
> +	'gem_persistent_relocs',
> +	'gem_pin',
> +	'gem_pipe_control_store_loop',
> +	'gem_ppgtt',
> +	'gem_pread',
> +	'gem_pread_after_blit',
> +	'gem_pwrite',
> +	'gem_pwrite_pread',
> +	'gem_pwrite_snooped',
> +	'gem_read_read_speed',
> +	'gem_readwrite',
> +	'gem_reg_read',
> +	'gem_reloc_overflow',
> +	'gem_reloc_vs_gpu',
> +	'gem_render_copy',
> +	'gem_render_copy_redux',
> +	'gem_render_linear_blits',
> +	'gem_render_tiled_blits',
> +	'gem_request_retire',
> +	'gem_reset_stats',
> +	'gem_ring_sync_copy',
> +	'gem_ring_sync_loop',
> +	'gem_ringfill',
> +	'gem_seqno_wrap',
> +	'gem_set_tiling_vs_blt',
> +	'gem_set_tiling_vs_gtt',
> +	'gem_set_tiling_vs_pwrite',
> +	'gem_shrink',
> +	'gem_softpin',
> +	'gem_spin_batch',
> +	'gem_stolen',
> +	'gem_storedw_batches_loop',
> +	'gem_storedw_loop',
> +	'gem_streaming_writes',
> +	'gem_sync',
> +	'gem_threaded_access_tiled',
> +	'gem_tiled_blits',
> +	'gem_tiled_fence_blits',
> +	'gem_tiled_partial_pwrite_pread',
> +	'gem_tiled_pread_basic',
> +	'gem_tiled_pread_pwrite',
> +	'gem_tiled_swapping',
> +	'gem_tiled_wb',
> +	'gem_tiled_wc',
> +	'gem_tiling_max_stride',
> +	'gem_unfence_active_buffers',
> +	'gem_unref_active_buffers',
> +	'gem_userptr_blits',
> +	'gem_wait',
> +	'gem_workarounds',
> +	'gem_write_read_ring_switch',
> +	'gen3_mixed_blits',
> +	'gen3_render_linear_blits',
> +	'gen3_render_mixed_blits',
> +	'gen3_render_tiledx_blits',
> +	'gen3_render_tiledy_blits',
> +	'gen7_forcewake_mt',
> +	'gvt_basic',
> +	'kms_3d',
> +	'kms_addfb_basic',
> +	'kms_atomic',
> +	'kms_atomic_transition',
> +	'kms_busy',
> +	'kms_ccs',
> +	'kms_chv_cursor_fail',
> +	'kms_concurrent',
> +	'kms_crtc_background_color',
> +	'kms_cursor_crc',
> +	'kms_cursor_legacy',
> +	'kms_draw_crc',
> +	'kms_fbc_crc',
> +	'kms_fbcon_fbt',
> +	'kms_fence_pin_leak',
> +	'kms_flip',
> +	'kms_flip_event_leak',
> +	'kms_flip_tiling',
> +	'kms_force_connector_basic',
> +	'kms_frontbuffer_tracking',
> +	'kms_hdmi_inject',
> +	'kms_invalid_dotclock',
> +	'kms_legacy_colorkey',
> +	'kms_mmap_write_crc',
> +	'kms_mmio_vs_cs_flip',
> +	'kms_panel_fitting',
> +	'kms_pipe_b_c_ivb',
> +	'kms_pipe_color',
> +	'kms_pipe_crc_basic',
> +	'kms_plane',
> +	'kms_plane_lowres',
> +	'kms_plane_multiple',
> +	'kms_plane_scaling',
> +	'kms_properties',
> +	'kms_psr_sink_crc',
> +	'kms_pwrite_crc',
> +	'kms_render',
> +	'kms_rmfb',
> +	'kms_rotation_crc',
> +	'kms_setmode',
> +	'kms_sink_crc_basic',
> +	'kms_sysfs_edid_timing',
> +	'kms_tv_load_detect',
> +	'kms_universal_plane',
> +	'kms_vblank',
> +	'meta_test',
> +	'perf',
> +	'pm_backlight',
> +	'pm_lpsp',
> +	'pm_rc6_residency',
> +	'pm_rpm',
> +	'pm_rps',
> +	'pm_sseu',
> +	'prime_busy',
> +	'prime_mmap',
> +	'prime_mmap_coherency',
> +	'prime_mmap_kms',
> +	'prime_self_import',
> +	'prime_udl',
> +	'prime_vgem',
> +	'sw_sync',
> +	'syncobj_basic',
> +	'template',
> +	'tools_test',
> +	'vgem_basic',
> +	'vgem_slow',
> +]
> +
> +test_deps = [ igt_deps ]
> +if libdrm_nouveau.found()
> +	test_progs += [
> +		'prime_nv_api',
> +		'prime_nv_pcopy',
> +		'prime_nv_test',
> +	]
> +	test_deps += libdrm_nouveau
> +endif
> +
> +if libdrm_vc4.found()
> +	test_progs += [
> +		'vc4_create_bo',
> +		'vc4_dmabuf_poll',
> +		'vc4_lookup_fail',
> +		'vc4_wait_bo',
> +		'vc4_wait_seqno',
> +	]
> +	test_deps += libdrm_vc4
> +endif
> +
> +if libdrm_amdgpu.found()
> +	# FIXME meson/ninja really doesn't like build targets with paths in them
> +	test_progs += [
> +		'amdgpu/amd_basic',
> +		'amdgpu/amd_cs_nop',
> +		'amdgpu/amd_prime',
> +	]
> +	test_deps += libdrm_amdgpu
> +endif
> +
> +if alsa.found()
> +	test_progs += [
> +		'audio',
> +	]
> +	test_deps += alsa
> +endif
> +
> +foreach prog : test_progs
> +	executable(prog, prog + '.c',
> +			dependencies : test_deps)
> +endforeach
> +
> +executable('testdisplay', ['testdisplay.c', 'testdisplay_hotplug.c'],
> +		dependencies : test_deps)
> +test_progs += 'testdisplay'
> +
> +run_command('generate_testlist.sh', test_progs)
> +
> +test_script = find_program('igt_command_line.sh')
> +foreach prog : test_progs
> +	test('testcase check: ' + prog, test_script,
> +			args : prog)
> +endforeach
> +
> +executable('gem_stress', 'gem_stress.c', dependencies : igt_deps)
> +
> +# IMPORTANT: These tests here are all disabled because the result in sometime
> +# unrecoverable gpu hangs. Don't put real testcases here.
> +hang_progs = [
> +	'gem_bad_batch',
> +	'gem_hang',
> +	'gem_bad_blit',
> +	'gem_bad_address',
> +	'gem_non_secure_batch',
> +]
> +foreach prog : hang_progs
> +	executable(prog, prog + '.c',
> +			dependencies : igt_deps,
> +			install : false)
> +endforeach
> diff --git a/tools/meson.build b/tools/meson.build
> new file mode 100644
> index 000000000000..d2d4410e2130
> --- /dev/null
> +++ b/tools/meson.build
> @@ -0,0 +1,59 @@
> +tools_progs_noisnt = [
> +	'hsw_compute_wrpll',
> +	'skl_compute_wrpll',
> +	'skl_ddb_allocation',
> +]
> +
> +foreach prog : tools_progs_noisnt
> +	executable(prog, prog + '.c',
> +			dependencies : igt_deps,
> +			install : false)
> +endforeach
> +
> +tools_progs = [
> +	# FIXME we already have a libtestcase with this name as target
> +	#'igt_stats',
> +	'intel_audio_dump',
> +	'intel_backlight',
> +	'intel_bios_dumper',
> +	'intel_display_crc',
> +	'intel_display_poller',
> +	'intel_forcewaked',
> +	'intel_gpu_frequency',
> +	'intel_firmware_decode',
> +	'intel_gpu_time',
> +	'intel_gpu_top',
> +	'intel_gtt',
> +	'intel_guc_logger',
> +	'intel_infoframes',
> +	'intel_lid',
> +	'intel_opregion_decode',
> +	'intel_panel_fitter',
> +	'intel_reg_checker',
> +	'intel_residency',
> +	'intel_stepping',
> +	'intel_vbt_decode',
> +	'intel_watermark',
> +	'intel_gem_info',
> +	'intel_gvtg_test',
> +]
> +tool_deps = igt_deps
> +
> +if libdrm_intel.found()
> +	tools_progs += [
> +		'intel_dump_decode',
> +		'intel_error_decode',
> +		'intel_framebuffer_dump',
> +		'intel_perf_counters',
> +	]
> +	tool_deps += zlib
> +endif
> +
> +foreach prog : tools_progs
> +	executable(prog, prog + '.c',
> +			dependencies : tool_deps)
> +endforeach
> +
> +shared_library('intel_aubdump', 'aubdump.c', dependencies : [ igt_deps, dlsym ])
> +
> +subdir('null_state_gen')
> diff --git a/tools/null_state_gen/meson.build b/tools/null_state_gen/meson.build
> new file mode 100644
> index 000000000000..96697dbf64f1
> --- /dev/null
> +++ b/tools/null_state_gen/meson.build
> @@ -0,0 +1,15 @@
> +intel_null_state_gen_src = [
> +	'intel_batchbuffer.c',
> +	'intel_renderstate_gen6.c',
> +	'intel_renderstate_gen7.c',
> +	'intel_renderstate_gen8.c',
> +	'intel_renderstate_gen9.c',
> +	'intel_null_state_gen.c',
> +]
> +
> +intel_null_state_gen = executable('intel_null_state_gen',
> +		intel_null_state_gen_src, dependencies : igt_deps,
> +		install : false)
> +
> +# FIXME actual null_state generation. We probably want to push the the copyright
> +# header generation into intel_null_state_gen for simplicity
Daniel Vetter Sept. 8, 2017, 6:50 a.m. UTC | #2
On Wed, Sep 06, 2017 at 05:01:42PM +0300, Jani Nikula wrote:
> On Tue, 05 Sep 2017, Daniel Vetter <daniel.vetter@ffwll.ch> wrote:
> > Why?
> >
> > Because it's fast.
> 
> And that's not even the main reason from my perspective! ;)
> 
> Please find some comments inline. None of them are blockers.
> 
> BR,
> Jani.
> 
> >
> > Like really, really fast.
> >
> > Some data (from a snb laptop, so rather lower-powered):
> >
> > - Incremental build after $ touch lib/igt_core.c with meson: 0.6s
> >   It notices that the symbol list of the libigt.so hasn't changed and
> >   doesn't bother re-linking the almost 300 binaries we have. make -j 6
> >   for the same scenario takes 44s.
> >
> > - Incremental build with nothing changed: make: 0.7s, meson: 0.2s This
> >   means stuff like --disable-git-hash is entirely pointless with
> >   meson, it's faster than a make ever can be (with 0.6s).
> >
> > - Reconfigure stage: ninja reconfigure 0.8s vs. ./configure 8.6s)
> >
> > - Running tests, after a full build: ninja test 6s vs. make check 24s
> >
> > - Full build (i.e. including ./autogen.sh respectively meson build),
> >   including tests, from a pristine git checkout. automake 2m49s vs.
> >   meson 44s.
> >
> > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > Cc: Eric Anholt <eric@anholt.net>
> > Cc: Daniel Stone <daniel@fooishbar.org>
> > Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
> > ---
> >  .gitignore                       |   1 +
> >  assembler/meson.build            |  73 ++++++++++
> >  benchmarks/meson.build           |  36 +++++
> >  lib/meson.build                  | 166 ++++++++++++++++++++++
> >  lib/prepend_log_domain.sh        |   8 ++
> >  lib/tests/meson.build            |  34 +++++
> >  lib/version.h.in                 |   1 +
> >  meson.build                      | 105 ++++++++++++++
> >  overlay/meson.build              |  59 ++++++++
> >  tests/generate_testlist.sh       |  10 ++
> >  tests/meson.build                | 290 +++++++++++++++++++++++++++++++++++++++
> >  tools/meson.build                |  59 ++++++++
> >  tools/null_state_gen/meson.build |  15 ++
> >  13 files changed, 857 insertions(+)
> >  create mode 100644 assembler/meson.build
> >  create mode 100644 benchmarks/meson.build
> >  create mode 100644 lib/meson.build
> >  create mode 100755 lib/prepend_log_domain.sh
> >  create mode 100644 lib/tests/meson.build
> >  create mode 100644 lib/version.h.in
> >  create mode 100644 meson.build
> >  create mode 100644 overlay/meson.build
> >  create mode 100755 tests/generate_testlist.sh
> >  create mode 100644 tests/meson.build
> >  create mode 100644 tools/meson.build
> >  create mode 100644 tools/null_state_gen/meson.build
> >
> > diff --git a/.gitignore b/.gitignore
> > index 6204965a0e32..e6919272d8b6 100644
> > --- a/.gitignore
> > +++ b/.gitignore
> > @@ -93,3 +93,4 @@ intel-gpu-tools-*/
> >  
> >  piglit
> >  results
> > +build
> > diff --git a/assembler/meson.build b/assembler/meson.build
> > new file mode 100644
> > index 000000000000..bdddd0e2db25
> > --- /dev/null
> > +++ b/assembler/meson.build
> > @@ -0,0 +1,73 @@
> > +lib_brw_src = [
> > +	'brw_context.c',
> > +	'brw_disasm.c',
> > +	'brw_eu.c',
> > +	'brw_eu_compact.c',
> > +	'brw_eu_debug.c',
> > +	'brw_eu_emit.c',
> > +	'brw_eu_util.c',
> > +	'gen8_disasm.c',
> > +	'gen8_instruction.c',
> > +	'ralloc.c',
> > +]
> 
> FWIW I like this style of assigning lists.
> 
> > +
> > +lib_brw = shared_library('brw', lib_brw_src,
> > +		dependencies : igt_deps)
> 
> The Emacs meson mode nicely indents the continuation lines after the
> opening (. These seem off... all over the place.
> 
> > +
> > +flex = find_program('flex')
> > +bison = find_program('bison')
> > +
> > +lgen = generator(flex,
> > +		output : '@BASENAME@.c',
> > +		arguments : ['-o', '@OUTPUT@', '@INPUT@'])
> > +
> > +lfiles = lgen.process('lex.l')
> > +
> > +pgen = generator(bison,
> > +		output : ['@BASENAME@.c', '@BASENAME@.h'],
> > +		arguments : ['@INPUT@', '--defines=@OUTPUT1@', '--output=@OUTPUT0@'])
> > +
> > +pfiles = pgen.process('gram.y')
> > +
> > +executable('intel-gen4asm', 'main.c', lfiles, pfiles, link_with : lib_brw)
> > +
> > +executable('intel-gen4disasm', 'disasm-main.c', link_with : lib_brw)
> > +
> > +gen4asm_testcases = [
> > +	'test/mov',
> > +	'test/frc',
> > +	'test/rndd',
> > +	'test/rndu',
> > +	'test/rnde',
> > +	'test/rnde-intsrc',
> > +	'test/rndz',
> > +	'test/lzd',
> > +	'test/not',
> > +	'test/immediate',
> > +]
> > +
> > +# Those tests were already failing when the assembler was imported from
> > +# the intel-gen4asm git repository:
> > +#   http://cgit.freedesktop.org/xorg/app/intel-gen4asm/
> > +# We disable them "for now" as a workaround to be able to release i-g-t
> > +gen4asm_testcases_broken = [
> > +	'test/declare',
> > +	'test/jmpi',
> > +	'test/if',
> > +	'test/iff',
> > +	'test/while',
> > +	'test/else',
> > +	'test/break',
> > +	'test/cont',
> > +	'test/halt',
> > +	'test/wait',
> > +	'test/endif',
> > +]
> > +
> > +test_runner = find_program('test/run-test.sh')
> > +foreach testcase : gen4asm_testcases
> > +	test('assembler: ' + testcase, test_runner,
> > +			args : testcase,
> > +			env : [ 'srcdir=' + meson.current_source_dir(),
> > +				'top_builddir=' + meson.current_build_dir()])
> > +endforeach
> > diff --git a/benchmarks/meson.build b/benchmarks/meson.build
> > new file mode 100644
> > index 000000000000..9ab738f76588
> > --- /dev/null
> > +++ b/benchmarks/meson.build
> > @@ -0,0 +1,36 @@
> > +benchmark_progs = [
> > +	'gem_blt',
> > +	'gem_busy',
> > +	'gem_create',
> > +	'gem_exec_ctx',
> > +	'gem_exec_fault',
> > +	'gem_exec_nop',
> > +	'gem_exec_reloc',
> > +	'gem_exec_trace',
> > +	'gem_latency',
> > +	'gem_mmap',
> > +	'gem_prw',
> > +	'gem_set_domain',
> > +	'gem_syslatency',
> > +	'gem_wsim',
> > +	'kms_vblank',
> > +	'prime_lookup',
> > +	'vgem_mmap',
> > +]
> > +
> > +if libdrm_intel.found()
> > +	benchmark_progs += [
> > +		'intel_upload_blit_large',
> > +		'intel_upload_blit_large_gtt',
> > +		'intel_upload_blit_large_map',
> > +		'intel_upload_blit_small',
> > +		'gem_userptr_benchmark',
> > +	]
> > +endif
> > +
> > +foreach prog : benchmark_progs
> > +	# FIXME meson doesn't like binaries with the same name
> > +	# meanwhile just suffix with _bench
> > +	executable(prog + '_bench', prog + '.c',
> > +			dependencies : test_deps)
> > +endforeach
> > diff --git a/lib/meson.build b/lib/meson.build
> > new file mode 100644
> > index 000000000000..51d3f9e278da
> > --- /dev/null
> > +++ b/lib/meson.build
> > @@ -0,0 +1,166 @@
> > +lib_headers = [
> > +	'debug.h',
> > +	'drmtest.h',
> > +	'i830_reg.h',
> > +	'i915_3d.h',
> > +	'i915_reg.h',
> > +	'i915_pciids.h',
> > +	'igt.h',
> > +	'igt_debugfs.h',
> > +	'igt_aux.h',
> > +	'igt_edid_template.h',
> > +	'igt_gt.h',
> > +	'igt_gvt.h',
> > +	'igt_primes.h',
> > +	'igt_rand.h',
> > +	'igt_stats.h',
> > +	'igt_sysfs.h',
> > +	'igt_x86.h',
> > +	'igt_vgem.h',
> > +	'instdone.h',
> > +	'intel_batchbuffer.h',
> > +	'intel_chipset.h',
> > +	'intel_io.h',
> > +	'intel_reg.h',
> > +	'ioctl_wrappers.h',
> > +	'media_fill.h',
> > +	'media_spin.h',
> > +	'gpgpu_fill.h',
> > +	'gen7_media.h',
> > +	'gen8_media.h',
> > +	'gen6_render.h',
> > +	'gen7_render.h',
> > +	'gen8_render.h',
> > +	'gen9_render.h',
> > +	'rendercopy.h',
> > +	'sw_sync.h',
> > +	'igt_kms.h',
> > +	'igt_fb.h',
> > +	'igt_core.h',
> > +	'igt_draw.h',
> > +	'igt_pm.h',
> > +	'igt_dummyload.h',
> > +	'uwildmat/uwildmat.h',
> > +	'igt_kmod.h',
> > +]
> > +
> > +lib_sources = [
> > +	'drmtest.c',
> > +	'igt_debugfs.c',
> > +	'igt_aux.c',
> > +	'igt_gt.c',
> > +	'igt_gvt.c',
> > +	'igt_primes.c',
> > +	'igt_rand.c',
> > +	'igt_stats.c',
> > +	'igt_sysfs.c',
> > +	'igt_x86.c',
> > +	'igt_vgem.c',
> > +	'instdone.c',
> > +	'intel_batchbuffer.c',
> > +	'intel_chipset.c',
> > +	'intel_device_info.c',
> > +	'intel_os.c',
> > +	'intel_mmio.c',
> > +	'ioctl_wrappers.c',
> > +	'media_fill_gen7.c',
> > +	'media_fill_gen8.c',
> > +	'media_fill_gen8lp.c',
> > +	'media_fill_gen9.c',
> > +	'media_spin.c',
> > +	'gpgpu_fill.c',
> > +	'rendercopy_i915.c',
> > +	'rendercopy_i830.c',
> > +	'rendercopy_gen6.c',
> > +	'rendercopy_gen7.c',
> > +	'rendercopy_gen8.c',
> > +	'rendercopy_gen9.c',
> > +	'sw_sync.c',
> > +	'intel_reg_map.c',
> > +	'intel_iosf.c',
> > +	'igt_kms.c',
> > +	'igt_fb.c',
> > +	'igt_core.c',
> > +	'igt_draw.c',
> > +	'igt_pm.c',
> > +	'igt_dummyload.c',
> > +	'uwildmat/uwildmat.c',
> > +	'igt_kmod.c',
> > +]
> > +
> > +lib_deps = [
> > +	cairo,
> > +	glib,
> > +	libdrm,
> > +	libkmod,
> > +	libprocps,
> > +	libudev,
> > +	libunwind,
> > +	pciaccess,
> > +	pthreads,
> > +	math,
> > +	realtime,
> > +]
> > +
> > +if libdrm_intel.found()
> > +	lib_deps += libdrm_intel
> > +else
> > +	lib_headers += 'stubs/drm/intel_bufmgr.h'
> > +	lib_sources += 'stubs/drm/intel_bufmgr.c'
> > +endif
> > +
> > +if libdrm_vc4.found()
> > +	lib_headers += 'igt_vc4.h'
> > +	lib_sources += 'igt_vc4.c'
> > +endif
> > +if valgrind.found()
> > +	lib_deps += valgrind
> > +endif
> > +
> > +if gsl.found()
> > +	lib_deps += gsl
> > +	lib_headers += [ 'igt_frame.h', 'igt_audio.h' ]
> > +	lib_sources += [ 'igt_frame.c', 'igt_audio.c' ]
> > +endif
> > +
> > +if alsa.found()
> > +	lib_deps += alsa
> > +	lib_headers += 'igt_alsa.h'
> > +	lib_sources += 'igt_alsa.c'
> > +endif
> > +
> > +if chamelium.found()
> > +	lib_deps += chamelium
> > +	lib_headers += 'igt_chamelium.h'
> > +	lib_sources += 'igt_chamelium.c'
> > +endif
> > +
> > +install_headers(lib_headers)
> > +
> > +pkgdatadir = join_paths(get_option('prefix'), get_option('datadir'), 'intel-gpu-tools')
> > +srcdir = join_paths(meson.source_root(), 'tests')
> > +
> > +vcs_tag(input : 'version.h.in', output : 'version.h',
> > +	fallback : 'NO-GIT',
> > +	command : [ 'git', 'log', '-n1', '--pretty=format:g%h' ] )
> > +
> > +# FIXME we don't regenerate when the script changes
> > +prepend_log_domain = generator(find_program('prepend_log_domain.sh'),
> > +		arguments : [ '@INPUT@', '@OUTPUT@' ],
> > +		output : '@PLAINNAME@' + '.pre.c')
> > +
> > +processed_src_dep = prepend_log_domain.process(lib_sources)
> > +
> > +lib_igt_build = shared_library('igt',
> > +			 processed_src_dep,
> > +			 include_directories : inc,
> > +			 dependencies : lib_deps,
> > +			 c_args : [ '-DIGT_DATADIR="@0@"'.format(pkgdatadir),
> > +				'-DIGT_SRCDIR="@0@"'.format(srcdir), ])
> > +
> > +lib_igt = declare_dependency(link_with : lib_igt_build,
> > +			    include_directories : inc)
> > +
> > +igt_deps = [ lib_igt ] + lib_deps
> > +
> > +subdir('tests')
> > diff --git a/lib/prepend_log_domain.sh b/lib/prepend_log_domain.sh
> > new file mode 100755
> > index 000000000000..93a911508b7f
> > --- /dev/null
> > +++ b/lib/prepend_log_domain.sh
> > @@ -0,0 +1,8 @@
> > +#!/bin/bash
> > +
> > +input=$1
> > +output=$2
> > +basename=$(basename $1 .c)
> > +
> > +echo "#define IGT_LOG_DOMAIN \"$basename\"" > $output
> > +cat $input >> $output
> > diff --git a/lib/tests/meson.build b/lib/tests/meson.build
> > new file mode 100644
> > index 000000000000..29bdb2c4222c
> > --- /dev/null
> > +++ b/lib/tests/meson.build
> > @@ -0,0 +1,34 @@
> > +lib_tests = [
> > +	'igt_fork_helper',
> > +	'igt_list_only',
> > +	'igt_simulation',
> > +	'igt_stats',
> > +	'igt_segfault',
> > +	'igt_subtest_group',
> > +	'igt_assert',
> > +	'igt_exit_handler',
> > +	'igt_hdmi_inject',
> > +	'igt_can_fail',
> > +	'igt_can_fail_simple',
> > +]
> > +
> > +lib_fail_tests = [
> > +	'igt_no_exit',
> > +	'igt_no_exit_list_only',
> > +	'igt_no_subtest',
> > +	'igt_simple_test_subtests',
> > +	'igt_timeout',
> > +	'igt_invalid_subtest_name',
> > +]
> > +
> > +foreach lib_test : lib_tests
> > +	exec = executable(lib_test, lib_test + '.c', install : true,
> > +			dependencies : igt_deps)
> > +	test('lib: ' + lib_test, exec)
> > +endforeach
> > +
> > +foreach lib_test : lib_fail_tests
> > +	exec = executable(lib_test, lib_test + '.c', install : true,
> > +			dependencies : igt_deps)
> > +	test('lib: ' + lib_test, exec, should_fail : true)
> > +endforeach
> > diff --git a/lib/version.h.in b/lib/version.h.in
> > new file mode 100644
> > index 000000000000..72fc6978cf32
> > --- /dev/null
> > +++ b/lib/version.h.in
> > @@ -0,0 +1 @@
> > +#define IGT_GIT_SHA1 "@VCS_TAG@"
> > diff --git a/meson.build b/meson.build
> > new file mode 100644
> > index 000000000000..fee64fcdf36e
> > --- /dev/null
> > +++ b/meson.build
> > @@ -0,0 +1,105 @@
> > +project('IGT gpu tests', 'c',
> > +	version : '1.19',
> > +        default_options: [
> > +          'warning_level=2',
> > +          'c_std=gnu99',
> > +        ],
> > +	license : 'MIT')
> > +
> > +cc = meson.get_compiler('c')
> > +
> > +inc = include_directories('lib', '.')
> > +
> > +config_h = configuration_data()
> > +
> > +libdrm = dependency('libdrm', version : '>=2.4.82')
> > +libdrm_intel = dependency('libdrm_intel', required : false)
> > +libdrm_vc4 = dependency('libdrm_vc4', required : false)
> > +libdrm_nouveau = dependency('libdrm_nouveau', required : false)
> > +libdrm_amdgpu = dependency('libdrm_amdgpu', required : false)
> > +
> > +pciaccess = dependency('pciaccess', version : '>=0.10')
> > +libkmod = dependency('libkmod')
> > +libprocps = dependency('libprocps', required : false)
> > +if libprocps.found()
> > +	config_h.set('HAVE_PROCPS', 1)
> > +endif
> 
> I wish we used #if instead of #ifdef in code. With that you could use
> the one-liner:
> 
> config_h.set10('HAVE_PROCPS', libprocps.found())
> 
> and have
> 
> #define HAVE_PROCPS 0
> 
> in config.h, which is helpful for debugging issues.
> 
> > +
> > +valgrind = dependency('valgrind', required : false)
> > +if valgrind.found()
> > +	config_h.set('HAVE_VALGRIND', 1)
> > +endif
> > +
> > +cairo = dependency('cairo', version : '>1.12.0', required : false)
> > +
> > +libudev = dependency('libudev', required : false)
> > +if libudev.found()
> > +	config_h.set('HAVE_UDEV', 1)
> > +endif
> > +
> > +glib = dependency('glib-2.0', required : false)
> > +if glib.found()
> > +	config_h.set('HAVE_GLIB', 1)
> > +endif
> > +
> > +libunwind = dependency('libunwind')
> > +gsl = dependency('gsl', required : false)
> > +alsa = dependency('alsa', required : false)
> > +
> > +pixman = dependency('pixman-1', required : false)
> > +xmlrpc = dependency('xmlrpc', required : false)
> > +xmlrpc_util = dependency('xmlrpc_util', required : false)
> > +xmlrpc_client = dependency('xmlrpc_client', required : false)
> > +
> > +if pixman.found() and xmlrpc.found() and xmlrpc_util.found() and xmlrpc_client.found()
> > +	chamelium = declare_dependency(dependencies : [ pixman, xmlrpc,
> > +	  xmlrpc_util, xmlrpc_client])
> > +else
> > +	chamelium = dependency('', required: false)
> > +endif
> > +
> > +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_h.set('HAVE_LINUX_KD_H', 1)
> > +endif
> > +if cc.has_header('sys/kd.h')
> > +	config_h.set('HAVE_SYS_KD_H', 1)
> > +endif
> > +if cc.has_header('libgen.h')
> > +	config_h.set('HAVE_LIBGEN_H', 1)
> > +endif
> > +if cc.has_header('sys/io.h')
> > +	config_h.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_h.set('HAVE_CPUID_H', 1)
> > +endif
> > +
> > +if cc.has_member('struct sysinfo', 'totalram',
> > +		prefix : '#include <sys/sysinfo.h>')
> > +	config_h.set('HAVE_STRUCT_SYSINFO_TOTALRAM', 1)
> > +endif
> > +
> > +add_project_arguments('-D_GNU_SOURCE', language : 'c')
> > +add_project_arguments('-include', 'config.h', language : 'c')
> 
> Ooo, that's a nice way to do this. TIL.
> 
> > +
> > +config_h.set_quoted('PACKAGE_VERSION', meson.project_version())
> > +config_h.set_quoted('PACKAGE', meson.project_name())
> > +config_h.set_quoted('TARGET_CPU_PLATFORM', host_machine.cpu_family())
> > +
> > +configure_file(output: 'config.h', install: false, configuration: config_h)
> 
> This makes me think config_h is a misnomer for the configuration data
> object. I'd probably use plain "config" instead.
> 
> I think we'll end up wanting to use the configuration data for the test
> runner shell scripts too, and generate a sh.config from the same
> config. We can source the sh.config from e.g. run-tests.sh, to figure
> out the source and build directories. We can use find_program() to find
> piglit, for example, and shove that into sh.config.
> 
> Look at the beginning of run-tests.sh and see how much better it could
> be with a sh.config.
> 
> Of course, the alternative is to use a separate configuration data
> object for sh.config, but I think it's clearer to use one, and use .in
> files to decide what goes in them.

configuration_data() seems to just be a special-purpose
wrangler/generator. I use it also for mangling manpages later on iirc.

> 
> > +
> > +subdir('lib')
> > +subdir('tests')
> > +subdir('benchmarks')
> > +subdir('tools')
> > +if libdrm_intel.found()
> > +	subdir('assembler')
> > +	subdir('overlay')
> > +endif
> > diff --git a/overlay/meson.build b/overlay/meson.build
> > new file mode 100644
> > index 000000000000..a4b778ca5a86
> > --- /dev/null
> > +++ b/overlay/meson.build
> > @@ -0,0 +1,59 @@
> > +gpu_overlay_src = [
> > +	'chart.c',
> > +	'config.c',
> > +	'cpu-top.c',
> > +	'debugfs.c',
> > +	'gem-interrupts.c',
> > +	'gem-objects.c',
> > +	'gpu-top.c',
> > +	'gpu-perf.c',
> > +	'gpu-freq.c',
> > +	'igfx.c',
> > +	'overlay.c',
> > +	'perf.c',
> > +	'power.c',
> > +	'rc6.c',
> > +]
> > +
> > +xv = dependency('xv', required : false)
> > +x11 = dependency('x11', required : false)
> > +xext = dependency('xext', required : false)
> > +dri2proto = dependency('dri2proto', version : '>= 2.6', required : false)
> > +cairo_xlib = dependency('cairo-xlib', required : false)
> > +xrandr = dependency('xrandr', version : '>=1.3', required : false)
> > +
> > +gpu_overlay_deps = [ realtime, cairo, pciaccess, libdrm, libdrm_intel ]
> > +
> > +both_x11_src = ''
> > +
> > +gpu_overlay_cflags = []
> > +if xv.found() and x11.found() and xext.found() and dri2proto.found()
> > +	both_x11_src = 'x11/position.c'
> > +	gpu_overlay_src += [
> > +		'x11/dri2.c',
> > +		'x11/dri2.h',
> > +		'x11/rgb2yuv.c',
> > +		'x11/rgb2yuv.h',
> > +		'x11/x11-overlay.c',
> > +	]
> > +	gpu_overlay_deps += [ xv, x11, xext, dri2proto ]
> > +	gpu_overlay_cflags += [ '-DHAVE_OVERLAY_XVLIB' ]
> 
> Hmm, seems a bit odd to have the config data split between a
> configuration data object and flags like this.
> 
> > +endif
> > +
> > +if cairo_xlib.found() and xrandr.found() and dri2proto.found()
> > +	both_x11_src = 'x11/position.c'
> > +	gpu_overlay_src += 'x11/x11-window.c'
> > +	gpu_overlay_deps += [ cairo_xlib, dri2proto ]
> > +	gpu_overlay_cflags += [ '-DHAVE_OVERLAY_XLIB' ]
> 
> Ditto.

The overlay is a bit a strange subproject, and I guess I can't decided
whether I want config.h or -Ddefines on the gcc cmdline. I can respin,
assuming there's some real interest in meson (thus far you seem the first
besides me).
-Daniel


> 
> > +endif
> > +
> > +gpu_overlay_src += both_x11_src
> > +
> > +gpu_overlay_src += 'kms/kms-overlay.c'
> > +
> > +if xrandr.found() and cairo.found()
> > +	executable('intel_gpu_overlay', gpu_overlay_src,
> > +			include_directories : inc,
> > +			c_args : gpu_overlay_cflags,
> > +			dependencies : gpu_overlay_deps)
> > +endif
> > diff --git a/tests/generate_testlist.sh b/tests/generate_testlist.sh
> > new file mode 100755
> > index 000000000000..6ea78655daca
> > --- /dev/null
> > +++ b/tests/generate_testlist.sh
> > @@ -0,0 +1,10 @@
> > +#!/bin/bash
> > +
> > +echo TESTLIST > $MESON_BUILD_ROOT/tests/test-list.txt
> > +
> > +while [[ $# -gt 0 ]] ; do
> > +	echo $1 >> $MESON_BUILD_ROOT/tests/test-list.txt
> > +	shift
> > +done
> > +
> > +echo END TESTLIST >> $MESON_BUILD_ROOT/tests/test-list.txt
> > diff --git a/tests/meson.build b/tests/meson.build
> > new file mode 100644
> > index 000000000000..73833758be0e
> > --- /dev/null
> > +++ b/tests/meson.build
> > @@ -0,0 +1,290 @@
> > +test_progs = [
> > +	'core_auth',
> > +	'core_get_client_auth',
> > +	'core_getclient',
> > +	'core_getstats',
> > +	'core_getversion',
> > +	'core_prop_blob',
> > +	'core_setmaster_vs_auth',
> > +	'debugfs_test',
> > +	'drm_import_export',
> > +	'drm_mm',
> > +	'drm_read',
> > +	'drm_vma_limiter',
> > +	'drm_vma_limiter_cached',
> > +	'drm_vma_limiter_cpu',
> > +	'drm_vma_limiter_gtt',
> > +	'drv_getparams_basic',
> > +	'drv_hangman',
> > +	'drv_missed_irq',
> > +	'drv_module_reload',
> > +	'drv_selftest',
> > +	'drv_suspend',
> > +	'gem_bad_length',
> > +	'gem_bad_reloc',
> > +	'gem_basic',
> > +	'gem_busy',
> > +	'gem_caching',
> > +	'gem_close',
> > +	'gem_close_race',
> > +	'gem_concurrent_blit',
> > +	'gem_cpu_reloc',
> > +	'gem_create',
> > +	'gem_cs_prefetch',
> > +	'gem_cs_tlb',
> > +	'gem_ctx_bad_destroy',
> > +	'gem_ctx_bad_exec',
> > +	'gem_ctx_basic',
> > +	'gem_ctx_create',
> > +	'gem_ctx_exec',
> > +	'gem_ctx_param',
> > +	'gem_ctx_switch',
> > +	'gem_ctx_thrash',
> > +	'gem_double_irq_loop',
> > +	'gem_eio',
> > +	'gem_evict_alignment',
> > +	'gem_evict_everything',
> > +	'gem_exec_alignment',
> > +	'gem_exec_async',
> > +	'gem_exec_await',
> > +	'gem_exec_bad_domains',
> > +	'gem_exec_basic',
> > +	'gem_exec_big',
> > +	'gem_exec_blt',
> > +	'gem_exec_capture',
> > +	'gem_exec_create',
> > +	'gem_exec_faulting_reloc',
> > +	'gem_exec_fence',
> > +	'gem_exec_flush',
> > +	'gem_exec_gttfill',
> > +	'gem_exec_latency',
> > +	'gem_exec_lut_handle',
> > +	'gem_exec_nop',
> > +	'gem_exec_parallel',
> > +	'gem_exec_params',
> > +	'gem_exec_parse',
> > +	'gem_exec_reloc',
> > +	'gem_exec_reuse',
> > +	'gem_exec_schedule',
> > +	'gem_exec_store',
> > +	'gem_exec_suspend',
> > +	'gem_exec_whisper',
> > +	'gem_fd_exhaustion',
> > +	'gem_fence_thrash',
> > +	'gem_fence_upload',
> > +	'gem_fenced_exec_thrash',
> > +	'gem_flink_basic',
> > +	'gem_flink_race',
> > +	'gem_gpgpu_fill',
> > +	'gem_gtt_cpu_tlb',
> > +	'gem_gtt_hog',
> > +	'gem_gtt_speed',
> > +	'gem_hangcheck_forcewake',
> > +	'gem_largeobject',
> > +	'gem_linear_blits',
> > +	'gem_lut_handle',
> > +	'gem_madvise',
> > +	'gem_media_fill',
> > +	'gem_mmap',
> > +	'gem_mmap_gtt',
> > +	'gem_mmap_offset_exhaustion',
> > +	'gem_mmap_wc',
> > +	'gem_mocs_settings',
> > +	'gem_partial_pwrite_pread',
> > +	'gem_persistent_relocs',
> > +	'gem_pin',
> > +	'gem_pipe_control_store_loop',
> > +	'gem_ppgtt',
> > +	'gem_pread',
> > +	'gem_pread_after_blit',
> > +	'gem_pwrite',
> > +	'gem_pwrite_pread',
> > +	'gem_pwrite_snooped',
> > +	'gem_read_read_speed',
> > +	'gem_readwrite',
> > +	'gem_reg_read',
> > +	'gem_reloc_overflow',
> > +	'gem_reloc_vs_gpu',
> > +	'gem_render_copy',
> > +	'gem_render_copy_redux',
> > +	'gem_render_linear_blits',
> > +	'gem_render_tiled_blits',
> > +	'gem_request_retire',
> > +	'gem_reset_stats',
> > +	'gem_ring_sync_copy',
> > +	'gem_ring_sync_loop',
> > +	'gem_ringfill',
> > +	'gem_seqno_wrap',
> > +	'gem_set_tiling_vs_blt',
> > +	'gem_set_tiling_vs_gtt',
> > +	'gem_set_tiling_vs_pwrite',
> > +	'gem_shrink',
> > +	'gem_softpin',
> > +	'gem_spin_batch',
> > +	'gem_stolen',
> > +	'gem_storedw_batches_loop',
> > +	'gem_storedw_loop',
> > +	'gem_streaming_writes',
> > +	'gem_sync',
> > +	'gem_threaded_access_tiled',
> > +	'gem_tiled_blits',
> > +	'gem_tiled_fence_blits',
> > +	'gem_tiled_partial_pwrite_pread',
> > +	'gem_tiled_pread_basic',
> > +	'gem_tiled_pread_pwrite',
> > +	'gem_tiled_swapping',
> > +	'gem_tiled_wb',
> > +	'gem_tiled_wc',
> > +	'gem_tiling_max_stride',
> > +	'gem_unfence_active_buffers',
> > +	'gem_unref_active_buffers',
> > +	'gem_userptr_blits',
> > +	'gem_wait',
> > +	'gem_workarounds',
> > +	'gem_write_read_ring_switch',
> > +	'gen3_mixed_blits',
> > +	'gen3_render_linear_blits',
> > +	'gen3_render_mixed_blits',
> > +	'gen3_render_tiledx_blits',
> > +	'gen3_render_tiledy_blits',
> > +	'gen7_forcewake_mt',
> > +	'gvt_basic',
> > +	'kms_3d',
> > +	'kms_addfb_basic',
> > +	'kms_atomic',
> > +	'kms_atomic_transition',
> > +	'kms_busy',
> > +	'kms_ccs',
> > +	'kms_chv_cursor_fail',
> > +	'kms_concurrent',
> > +	'kms_crtc_background_color',
> > +	'kms_cursor_crc',
> > +	'kms_cursor_legacy',
> > +	'kms_draw_crc',
> > +	'kms_fbc_crc',
> > +	'kms_fbcon_fbt',
> > +	'kms_fence_pin_leak',
> > +	'kms_flip',
> > +	'kms_flip_event_leak',
> > +	'kms_flip_tiling',
> > +	'kms_force_connector_basic',
> > +	'kms_frontbuffer_tracking',
> > +	'kms_hdmi_inject',
> > +	'kms_invalid_dotclock',
> > +	'kms_legacy_colorkey',
> > +	'kms_mmap_write_crc',
> > +	'kms_mmio_vs_cs_flip',
> > +	'kms_panel_fitting',
> > +	'kms_pipe_b_c_ivb',
> > +	'kms_pipe_color',
> > +	'kms_pipe_crc_basic',
> > +	'kms_plane',
> > +	'kms_plane_lowres',
> > +	'kms_plane_multiple',
> > +	'kms_plane_scaling',
> > +	'kms_properties',
> > +	'kms_psr_sink_crc',
> > +	'kms_pwrite_crc',
> > +	'kms_render',
> > +	'kms_rmfb',
> > +	'kms_rotation_crc',
> > +	'kms_setmode',
> > +	'kms_sink_crc_basic',
> > +	'kms_sysfs_edid_timing',
> > +	'kms_tv_load_detect',
> > +	'kms_universal_plane',
> > +	'kms_vblank',
> > +	'meta_test',
> > +	'perf',
> > +	'pm_backlight',
> > +	'pm_lpsp',
> > +	'pm_rc6_residency',
> > +	'pm_rpm',
> > +	'pm_rps',
> > +	'pm_sseu',
> > +	'prime_busy',
> > +	'prime_mmap',
> > +	'prime_mmap_coherency',
> > +	'prime_mmap_kms',
> > +	'prime_self_import',
> > +	'prime_udl',
> > +	'prime_vgem',
> > +	'sw_sync',
> > +	'syncobj_basic',
> > +	'template',
> > +	'tools_test',
> > +	'vgem_basic',
> > +	'vgem_slow',
> > +]
> > +
> > +test_deps = [ igt_deps ]
> > +if libdrm_nouveau.found()
> > +	test_progs += [
> > +		'prime_nv_api',
> > +		'prime_nv_pcopy',
> > +		'prime_nv_test',
> > +	]
> > +	test_deps += libdrm_nouveau
> > +endif
> > +
> > +if libdrm_vc4.found()
> > +	test_progs += [
> > +		'vc4_create_bo',
> > +		'vc4_dmabuf_poll',
> > +		'vc4_lookup_fail',
> > +		'vc4_wait_bo',
> > +		'vc4_wait_seqno',
> > +	]
> > +	test_deps += libdrm_vc4
> > +endif
> > +
> > +if libdrm_amdgpu.found()
> > +	# FIXME meson/ninja really doesn't like build targets with paths in them
> > +	test_progs += [
> > +		'amdgpu/amd_basic',
> > +		'amdgpu/amd_cs_nop',
> > +		'amdgpu/amd_prime',
> > +	]
> > +	test_deps += libdrm_amdgpu
> > +endif
> > +
> > +if alsa.found()
> > +	test_progs += [
> > +		'audio',
> > +	]
> > +	test_deps += alsa
> > +endif
> > +
> > +foreach prog : test_progs
> > +	executable(prog, prog + '.c',
> > +			dependencies : test_deps)
> > +endforeach
> > +
> > +executable('testdisplay', ['testdisplay.c', 'testdisplay_hotplug.c'],
> > +		dependencies : test_deps)
> > +test_progs += 'testdisplay'
> > +
> > +run_command('generate_testlist.sh', test_progs)
> > +
> > +test_script = find_program('igt_command_line.sh')
> > +foreach prog : test_progs
> > +	test('testcase check: ' + prog, test_script,
> > +			args : prog)
> > +endforeach
> > +
> > +executable('gem_stress', 'gem_stress.c', dependencies : igt_deps)
> > +
> > +# IMPORTANT: These tests here are all disabled because the result in sometime
> > +# unrecoverable gpu hangs. Don't put real testcases here.
> > +hang_progs = [
> > +	'gem_bad_batch',
> > +	'gem_hang',
> > +	'gem_bad_blit',
> > +	'gem_bad_address',
> > +	'gem_non_secure_batch',
> > +]
> > +foreach prog : hang_progs
> > +	executable(prog, prog + '.c',
> > +			dependencies : igt_deps,
> > +			install : false)
> > +endforeach
> > diff --git a/tools/meson.build b/tools/meson.build
> > new file mode 100644
> > index 000000000000..d2d4410e2130
> > --- /dev/null
> > +++ b/tools/meson.build
> > @@ -0,0 +1,59 @@
> > +tools_progs_noisnt = [
> > +	'hsw_compute_wrpll',
> > +	'skl_compute_wrpll',
> > +	'skl_ddb_allocation',
> > +]
> > +
> > +foreach prog : tools_progs_noisnt
> > +	executable(prog, prog + '.c',
> > +			dependencies : igt_deps,
> > +			install : false)
> > +endforeach
> > +
> > +tools_progs = [
> > +	# FIXME we already have a libtestcase with this name as target
> > +	#'igt_stats',
> > +	'intel_audio_dump',
> > +	'intel_backlight',
> > +	'intel_bios_dumper',
> > +	'intel_display_crc',
> > +	'intel_display_poller',
> > +	'intel_forcewaked',
> > +	'intel_gpu_frequency',
> > +	'intel_firmware_decode',
> > +	'intel_gpu_time',
> > +	'intel_gpu_top',
> > +	'intel_gtt',
> > +	'intel_guc_logger',
> > +	'intel_infoframes',
> > +	'intel_lid',
> > +	'intel_opregion_decode',
> > +	'intel_panel_fitter',
> > +	'intel_reg_checker',
> > +	'intel_residency',
> > +	'intel_stepping',
> > +	'intel_vbt_decode',
> > +	'intel_watermark',
> > +	'intel_gem_info',
> > +	'intel_gvtg_test',
> > +]
> > +tool_deps = igt_deps
> > +
> > +if libdrm_intel.found()
> > +	tools_progs += [
> > +		'intel_dump_decode',
> > +		'intel_error_decode',
> > +		'intel_framebuffer_dump',
> > +		'intel_perf_counters',
> > +	]
> > +	tool_deps += zlib
> > +endif
> > +
> > +foreach prog : tools_progs
> > +	executable(prog, prog + '.c',
> > +			dependencies : tool_deps)
> > +endforeach
> > +
> > +shared_library('intel_aubdump', 'aubdump.c', dependencies : [ igt_deps, dlsym ])
> > +
> > +subdir('null_state_gen')
> > diff --git a/tools/null_state_gen/meson.build b/tools/null_state_gen/meson.build
> > new file mode 100644
> > index 000000000000..96697dbf64f1
> > --- /dev/null
> > +++ b/tools/null_state_gen/meson.build
> > @@ -0,0 +1,15 @@
> > +intel_null_state_gen_src = [
> > +	'intel_batchbuffer.c',
> > +	'intel_renderstate_gen6.c',
> > +	'intel_renderstate_gen7.c',
> > +	'intel_renderstate_gen8.c',
> > +	'intel_renderstate_gen9.c',
> > +	'intel_null_state_gen.c',
> > +]
> > +
> > +intel_null_state_gen = executable('intel_null_state_gen',
> > +		intel_null_state_gen_src, dependencies : igt_deps,
> > +		install : false)
> > +
> > +# FIXME actual null_state generation. We probably want to push the the copyright
> > +# header generation into intel_null_state_gen for simplicity
> 
> -- 
> Jani Nikula, Intel Open Source Technology Center
Jani Nikula Sept. 8, 2017, 8:53 a.m. UTC | #3
On Fri, 08 Sep 2017, Daniel Vetter <daniel@ffwll.ch> wrote:
> On Wed, Sep 06, 2017 at 05:01:42PM +0300, Jani Nikula wrote:
>> On Tue, 05 Sep 2017, Daniel Vetter <daniel.vetter@ffwll.ch> wrote:
>> > +configure_file(output: 'config.h', install: false, configuration: config_h)
>> 
>> This makes me think config_h is a misnomer for the configuration data
>> object. I'd probably use plain "config" instead.
>> 
>> I think we'll end up wanting to use the configuration data for the test
>> runner shell scripts too, and generate a sh.config from the same
>> config. We can source the sh.config from e.g. run-tests.sh, to figure
>> out the source and build directories. We can use find_program() to find
>> piglit, for example, and shove that into sh.config.
>> 
>> Look at the beginning of run-tests.sh and see how much better it could
>> be with a sh.config.
>> 
>> Of course, the alternative is to use a separate configuration data
>> object for sh.config, but I think it's clearer to use one, and use .in
>> files to decide what goes in them.
>
> configuration_data() seems to just be a special-purpose
> wrangler/generator. I use it also for mangling manpages later on iirc.

We had a misunderstanding here, clarified on IRC.

I meant, do use configuration data, but only use one configuration data
object, and generate several outputs from one object. I think we'll
benefit from being able to pull in some config data to a sh.config later
on, and using that in run-tests.sh and elsewhere. Which means "config_h"
will be a slightly misleading name, just call it "config".

BR,
Jani.
diff mbox

Patch

diff --git a/.gitignore b/.gitignore
index 6204965a0e32..e6919272d8b6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -93,3 +93,4 @@  intel-gpu-tools-*/
 
 piglit
 results
+build
diff --git a/assembler/meson.build b/assembler/meson.build
new file mode 100644
index 000000000000..bdddd0e2db25
--- /dev/null
+++ b/assembler/meson.build
@@ -0,0 +1,73 @@ 
+lib_brw_src = [
+	'brw_context.c',
+	'brw_disasm.c',
+	'brw_eu.c',
+	'brw_eu_compact.c',
+	'brw_eu_debug.c',
+	'brw_eu_emit.c',
+	'brw_eu_util.c',
+	'gen8_disasm.c',
+	'gen8_instruction.c',
+	'ralloc.c',
+]
+
+lib_brw = shared_library('brw', lib_brw_src,
+		dependencies : igt_deps)
+
+flex = find_program('flex')
+bison = find_program('bison')
+
+lgen = generator(flex,
+		output : '@BASENAME@.c',
+		arguments : ['-o', '@OUTPUT@', '@INPUT@'])
+
+lfiles = lgen.process('lex.l')
+
+pgen = generator(bison,
+		output : ['@BASENAME@.c', '@BASENAME@.h'],
+		arguments : ['@INPUT@', '--defines=@OUTPUT1@', '--output=@OUTPUT0@'])
+
+pfiles = pgen.process('gram.y')
+
+executable('intel-gen4asm', 'main.c', lfiles, pfiles, link_with : lib_brw)
+
+executable('intel-gen4disasm', 'disasm-main.c', link_with : lib_brw)
+
+gen4asm_testcases = [
+	'test/mov',
+	'test/frc',
+	'test/rndd',
+	'test/rndu',
+	'test/rnde',
+	'test/rnde-intsrc',
+	'test/rndz',
+	'test/lzd',
+	'test/not',
+	'test/immediate',
+]
+
+# Those tests were already failing when the assembler was imported from
+# the intel-gen4asm git repository:
+#   http://cgit.freedesktop.org/xorg/app/intel-gen4asm/
+# We disable them "for now" as a workaround to be able to release i-g-t
+gen4asm_testcases_broken = [
+	'test/declare',
+	'test/jmpi',
+	'test/if',
+	'test/iff',
+	'test/while',
+	'test/else',
+	'test/break',
+	'test/cont',
+	'test/halt',
+	'test/wait',
+	'test/endif',
+]
+
+test_runner = find_program('test/run-test.sh')
+foreach testcase : gen4asm_testcases
+	test('assembler: ' + testcase, test_runner,
+			args : testcase,
+			env : [ 'srcdir=' + meson.current_source_dir(),
+				'top_builddir=' + meson.current_build_dir()])
+endforeach
diff --git a/benchmarks/meson.build b/benchmarks/meson.build
new file mode 100644
index 000000000000..9ab738f76588
--- /dev/null
+++ b/benchmarks/meson.build
@@ -0,0 +1,36 @@ 
+benchmark_progs = [
+	'gem_blt',
+	'gem_busy',
+	'gem_create',
+	'gem_exec_ctx',
+	'gem_exec_fault',
+	'gem_exec_nop',
+	'gem_exec_reloc',
+	'gem_exec_trace',
+	'gem_latency',
+	'gem_mmap',
+	'gem_prw',
+	'gem_set_domain',
+	'gem_syslatency',
+	'gem_wsim',
+	'kms_vblank',
+	'prime_lookup',
+	'vgem_mmap',
+]
+
+if libdrm_intel.found()
+	benchmark_progs += [
+		'intel_upload_blit_large',
+		'intel_upload_blit_large_gtt',
+		'intel_upload_blit_large_map',
+		'intel_upload_blit_small',
+		'gem_userptr_benchmark',
+	]
+endif
+
+foreach prog : benchmark_progs
+	# FIXME meson doesn't like binaries with the same name
+	# meanwhile just suffix with _bench
+	executable(prog + '_bench', prog + '.c',
+			dependencies : test_deps)
+endforeach
diff --git a/lib/meson.build b/lib/meson.build
new file mode 100644
index 000000000000..51d3f9e278da
--- /dev/null
+++ b/lib/meson.build
@@ -0,0 +1,166 @@ 
+lib_headers = [
+	'debug.h',
+	'drmtest.h',
+	'i830_reg.h',
+	'i915_3d.h',
+	'i915_reg.h',
+	'i915_pciids.h',
+	'igt.h',
+	'igt_debugfs.h',
+	'igt_aux.h',
+	'igt_edid_template.h',
+	'igt_gt.h',
+	'igt_gvt.h',
+	'igt_primes.h',
+	'igt_rand.h',
+	'igt_stats.h',
+	'igt_sysfs.h',
+	'igt_x86.h',
+	'igt_vgem.h',
+	'instdone.h',
+	'intel_batchbuffer.h',
+	'intel_chipset.h',
+	'intel_io.h',
+	'intel_reg.h',
+	'ioctl_wrappers.h',
+	'media_fill.h',
+	'media_spin.h',
+	'gpgpu_fill.h',
+	'gen7_media.h',
+	'gen8_media.h',
+	'gen6_render.h',
+	'gen7_render.h',
+	'gen8_render.h',
+	'gen9_render.h',
+	'rendercopy.h',
+	'sw_sync.h',
+	'igt_kms.h',
+	'igt_fb.h',
+	'igt_core.h',
+	'igt_draw.h',
+	'igt_pm.h',
+	'igt_dummyload.h',
+	'uwildmat/uwildmat.h',
+	'igt_kmod.h',
+]
+
+lib_sources = [
+	'drmtest.c',
+	'igt_debugfs.c',
+	'igt_aux.c',
+	'igt_gt.c',
+	'igt_gvt.c',
+	'igt_primes.c',
+	'igt_rand.c',
+	'igt_stats.c',
+	'igt_sysfs.c',
+	'igt_x86.c',
+	'igt_vgem.c',
+	'instdone.c',
+	'intel_batchbuffer.c',
+	'intel_chipset.c',
+	'intel_device_info.c',
+	'intel_os.c',
+	'intel_mmio.c',
+	'ioctl_wrappers.c',
+	'media_fill_gen7.c',
+	'media_fill_gen8.c',
+	'media_fill_gen8lp.c',
+	'media_fill_gen9.c',
+	'media_spin.c',
+	'gpgpu_fill.c',
+	'rendercopy_i915.c',
+	'rendercopy_i830.c',
+	'rendercopy_gen6.c',
+	'rendercopy_gen7.c',
+	'rendercopy_gen8.c',
+	'rendercopy_gen9.c',
+	'sw_sync.c',
+	'intel_reg_map.c',
+	'intel_iosf.c',
+	'igt_kms.c',
+	'igt_fb.c',
+	'igt_core.c',
+	'igt_draw.c',
+	'igt_pm.c',
+	'igt_dummyload.c',
+	'uwildmat/uwildmat.c',
+	'igt_kmod.c',
+]
+
+lib_deps = [
+	cairo,
+	glib,
+	libdrm,
+	libkmod,
+	libprocps,
+	libudev,
+	libunwind,
+	pciaccess,
+	pthreads,
+	math,
+	realtime,
+]
+
+if libdrm_intel.found()
+	lib_deps += libdrm_intel
+else
+	lib_headers += 'stubs/drm/intel_bufmgr.h'
+	lib_sources += 'stubs/drm/intel_bufmgr.c'
+endif
+
+if libdrm_vc4.found()
+	lib_headers += 'igt_vc4.h'
+	lib_sources += 'igt_vc4.c'
+endif
+if valgrind.found()
+	lib_deps += valgrind
+endif
+
+if gsl.found()
+	lib_deps += gsl
+	lib_headers += [ 'igt_frame.h', 'igt_audio.h' ]
+	lib_sources += [ 'igt_frame.c', 'igt_audio.c' ]
+endif
+
+if alsa.found()
+	lib_deps += alsa
+	lib_headers += 'igt_alsa.h'
+	lib_sources += 'igt_alsa.c'
+endif
+
+if chamelium.found()
+	lib_deps += chamelium
+	lib_headers += 'igt_chamelium.h'
+	lib_sources += 'igt_chamelium.c'
+endif
+
+install_headers(lib_headers)
+
+pkgdatadir = join_paths(get_option('prefix'), get_option('datadir'), 'intel-gpu-tools')
+srcdir = join_paths(meson.source_root(), 'tests')
+
+vcs_tag(input : 'version.h.in', output : 'version.h',
+	fallback : 'NO-GIT',
+	command : [ 'git', 'log', '-n1', '--pretty=format:g%h' ] )
+
+# FIXME we don't regenerate when the script changes
+prepend_log_domain = generator(find_program('prepend_log_domain.sh'),
+		arguments : [ '@INPUT@', '@OUTPUT@' ],
+		output : '@PLAINNAME@' + '.pre.c')
+
+processed_src_dep = prepend_log_domain.process(lib_sources)
+
+lib_igt_build = shared_library('igt',
+			 processed_src_dep,
+			 include_directories : inc,
+			 dependencies : lib_deps,
+			 c_args : [ '-DIGT_DATADIR="@0@"'.format(pkgdatadir),
+				'-DIGT_SRCDIR="@0@"'.format(srcdir), ])
+
+lib_igt = declare_dependency(link_with : lib_igt_build,
+			    include_directories : inc)
+
+igt_deps = [ lib_igt ] + lib_deps
+
+subdir('tests')
diff --git a/lib/prepend_log_domain.sh b/lib/prepend_log_domain.sh
new file mode 100755
index 000000000000..93a911508b7f
--- /dev/null
+++ b/lib/prepend_log_domain.sh
@@ -0,0 +1,8 @@ 
+#!/bin/bash
+
+input=$1
+output=$2
+basename=$(basename $1 .c)
+
+echo "#define IGT_LOG_DOMAIN \"$basename\"" > $output
+cat $input >> $output
diff --git a/lib/tests/meson.build b/lib/tests/meson.build
new file mode 100644
index 000000000000..29bdb2c4222c
--- /dev/null
+++ b/lib/tests/meson.build
@@ -0,0 +1,34 @@ 
+lib_tests = [
+	'igt_fork_helper',
+	'igt_list_only',
+	'igt_simulation',
+	'igt_stats',
+	'igt_segfault',
+	'igt_subtest_group',
+	'igt_assert',
+	'igt_exit_handler',
+	'igt_hdmi_inject',
+	'igt_can_fail',
+	'igt_can_fail_simple',
+]
+
+lib_fail_tests = [
+	'igt_no_exit',
+	'igt_no_exit_list_only',
+	'igt_no_subtest',
+	'igt_simple_test_subtests',
+	'igt_timeout',
+	'igt_invalid_subtest_name',
+]
+
+foreach lib_test : lib_tests
+	exec = executable(lib_test, lib_test + '.c', install : true,
+			dependencies : igt_deps)
+	test('lib: ' + lib_test, exec)
+endforeach
+
+foreach lib_test : lib_fail_tests
+	exec = executable(lib_test, lib_test + '.c', install : true,
+			dependencies : igt_deps)
+	test('lib: ' + lib_test, exec, should_fail : true)
+endforeach
diff --git a/lib/version.h.in b/lib/version.h.in
new file mode 100644
index 000000000000..72fc6978cf32
--- /dev/null
+++ b/lib/version.h.in
@@ -0,0 +1 @@ 
+#define IGT_GIT_SHA1 "@VCS_TAG@"
diff --git a/meson.build b/meson.build
new file mode 100644
index 000000000000..fee64fcdf36e
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,105 @@ 
+project('IGT gpu tests', 'c',
+	version : '1.19',
+        default_options: [
+          'warning_level=2',
+          'c_std=gnu99',
+        ],
+	license : 'MIT')
+
+cc = meson.get_compiler('c')
+
+inc = include_directories('lib', '.')
+
+config_h = configuration_data()
+
+libdrm = dependency('libdrm', version : '>=2.4.82')
+libdrm_intel = dependency('libdrm_intel', required : false)
+libdrm_vc4 = dependency('libdrm_vc4', required : false)
+libdrm_nouveau = dependency('libdrm_nouveau', required : false)
+libdrm_amdgpu = dependency('libdrm_amdgpu', required : false)
+
+pciaccess = dependency('pciaccess', version : '>=0.10')
+libkmod = dependency('libkmod')
+libprocps = dependency('libprocps', required : false)
+if libprocps.found()
+	config_h.set('HAVE_PROCPS', 1)
+endif
+
+valgrind = dependency('valgrind', required : false)
+if valgrind.found()
+	config_h.set('HAVE_VALGRIND', 1)
+endif
+
+cairo = dependency('cairo', version : '>1.12.0', required : false)
+
+libudev = dependency('libudev', required : false)
+if libudev.found()
+	config_h.set('HAVE_UDEV', 1)
+endif
+
+glib = dependency('glib-2.0', required : false)
+if glib.found()
+	config_h.set('HAVE_GLIB', 1)
+endif
+
+libunwind = dependency('libunwind')
+gsl = dependency('gsl', required : false)
+alsa = dependency('alsa', required : false)
+
+pixman = dependency('pixman-1', required : false)
+xmlrpc = dependency('xmlrpc', required : false)
+xmlrpc_util = dependency('xmlrpc_util', required : false)
+xmlrpc_client = dependency('xmlrpc_client', required : false)
+
+if pixman.found() and xmlrpc.found() and xmlrpc_util.found() and xmlrpc_client.found()
+	chamelium = declare_dependency(dependencies : [ pixman, xmlrpc,
+	  xmlrpc_util, xmlrpc_client])
+else
+	chamelium = dependency('', required: false)
+endif
+
+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_h.set('HAVE_LINUX_KD_H', 1)
+endif
+if cc.has_header('sys/kd.h')
+	config_h.set('HAVE_SYS_KD_H', 1)
+endif
+if cc.has_header('libgen.h')
+	config_h.set('HAVE_LIBGEN_H', 1)
+endif
+if cc.has_header('sys/io.h')
+	config_h.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_h.set('HAVE_CPUID_H', 1)
+endif
+
+if cc.has_member('struct sysinfo', 'totalram',
+		prefix : '#include <sys/sysinfo.h>')
+	config_h.set('HAVE_STRUCT_SYSINFO_TOTALRAM', 1)
+endif
+
+add_project_arguments('-D_GNU_SOURCE', language : 'c')
+add_project_arguments('-include', 'config.h', language : 'c')
+
+config_h.set_quoted('PACKAGE_VERSION', meson.project_version())
+config_h.set_quoted('PACKAGE', meson.project_name())
+config_h.set_quoted('TARGET_CPU_PLATFORM', host_machine.cpu_family())
+
+configure_file(output: 'config.h', install: false, configuration: config_h)
+
+subdir('lib')
+subdir('tests')
+subdir('benchmarks')
+subdir('tools')
+if libdrm_intel.found()
+	subdir('assembler')
+	subdir('overlay')
+endif
diff --git a/overlay/meson.build b/overlay/meson.build
new file mode 100644
index 000000000000..a4b778ca5a86
--- /dev/null
+++ b/overlay/meson.build
@@ -0,0 +1,59 @@ 
+gpu_overlay_src = [
+	'chart.c',
+	'config.c',
+	'cpu-top.c',
+	'debugfs.c',
+	'gem-interrupts.c',
+	'gem-objects.c',
+	'gpu-top.c',
+	'gpu-perf.c',
+	'gpu-freq.c',
+	'igfx.c',
+	'overlay.c',
+	'perf.c',
+	'power.c',
+	'rc6.c',
+]
+
+xv = dependency('xv', required : false)
+x11 = dependency('x11', required : false)
+xext = dependency('xext', required : false)
+dri2proto = dependency('dri2proto', version : '>= 2.6', required : false)
+cairo_xlib = dependency('cairo-xlib', required : false)
+xrandr = dependency('xrandr', version : '>=1.3', required : false)
+
+gpu_overlay_deps = [ realtime, cairo, pciaccess, libdrm, libdrm_intel ]
+
+both_x11_src = ''
+
+gpu_overlay_cflags = []
+if xv.found() and x11.found() and xext.found() and dri2proto.found()
+	both_x11_src = 'x11/position.c'
+	gpu_overlay_src += [
+		'x11/dri2.c',
+		'x11/dri2.h',
+		'x11/rgb2yuv.c',
+		'x11/rgb2yuv.h',
+		'x11/x11-overlay.c',
+	]
+	gpu_overlay_deps += [ xv, x11, xext, dri2proto ]
+	gpu_overlay_cflags += [ '-DHAVE_OVERLAY_XVLIB' ]
+endif
+
+if cairo_xlib.found() and xrandr.found() and dri2proto.found()
+	both_x11_src = 'x11/position.c'
+	gpu_overlay_src += 'x11/x11-window.c'
+	gpu_overlay_deps += [ cairo_xlib, dri2proto ]
+	gpu_overlay_cflags += [ '-DHAVE_OVERLAY_XLIB' ]
+endif
+
+gpu_overlay_src += both_x11_src
+
+gpu_overlay_src += 'kms/kms-overlay.c'
+
+if xrandr.found() and cairo.found()
+	executable('intel_gpu_overlay', gpu_overlay_src,
+			include_directories : inc,
+			c_args : gpu_overlay_cflags,
+			dependencies : gpu_overlay_deps)
+endif
diff --git a/tests/generate_testlist.sh b/tests/generate_testlist.sh
new file mode 100755
index 000000000000..6ea78655daca
--- /dev/null
+++ b/tests/generate_testlist.sh
@@ -0,0 +1,10 @@ 
+#!/bin/bash
+
+echo TESTLIST > $MESON_BUILD_ROOT/tests/test-list.txt
+
+while [[ $# -gt 0 ]] ; do
+	echo $1 >> $MESON_BUILD_ROOT/tests/test-list.txt
+	shift
+done
+
+echo END TESTLIST >> $MESON_BUILD_ROOT/tests/test-list.txt
diff --git a/tests/meson.build b/tests/meson.build
new file mode 100644
index 000000000000..73833758be0e
--- /dev/null
+++ b/tests/meson.build
@@ -0,0 +1,290 @@ 
+test_progs = [
+	'core_auth',
+	'core_get_client_auth',
+	'core_getclient',
+	'core_getstats',
+	'core_getversion',
+	'core_prop_blob',
+	'core_setmaster_vs_auth',
+	'debugfs_test',
+	'drm_import_export',
+	'drm_mm',
+	'drm_read',
+	'drm_vma_limiter',
+	'drm_vma_limiter_cached',
+	'drm_vma_limiter_cpu',
+	'drm_vma_limiter_gtt',
+	'drv_getparams_basic',
+	'drv_hangman',
+	'drv_missed_irq',
+	'drv_module_reload',
+	'drv_selftest',
+	'drv_suspend',
+	'gem_bad_length',
+	'gem_bad_reloc',
+	'gem_basic',
+	'gem_busy',
+	'gem_caching',
+	'gem_close',
+	'gem_close_race',
+	'gem_concurrent_blit',
+	'gem_cpu_reloc',
+	'gem_create',
+	'gem_cs_prefetch',
+	'gem_cs_tlb',
+	'gem_ctx_bad_destroy',
+	'gem_ctx_bad_exec',
+	'gem_ctx_basic',
+	'gem_ctx_create',
+	'gem_ctx_exec',
+	'gem_ctx_param',
+	'gem_ctx_switch',
+	'gem_ctx_thrash',
+	'gem_double_irq_loop',
+	'gem_eio',
+	'gem_evict_alignment',
+	'gem_evict_everything',
+	'gem_exec_alignment',
+	'gem_exec_async',
+	'gem_exec_await',
+	'gem_exec_bad_domains',
+	'gem_exec_basic',
+	'gem_exec_big',
+	'gem_exec_blt',
+	'gem_exec_capture',
+	'gem_exec_create',
+	'gem_exec_faulting_reloc',
+	'gem_exec_fence',
+	'gem_exec_flush',
+	'gem_exec_gttfill',
+	'gem_exec_latency',
+	'gem_exec_lut_handle',
+	'gem_exec_nop',
+	'gem_exec_parallel',
+	'gem_exec_params',
+	'gem_exec_parse',
+	'gem_exec_reloc',
+	'gem_exec_reuse',
+	'gem_exec_schedule',
+	'gem_exec_store',
+	'gem_exec_suspend',
+	'gem_exec_whisper',
+	'gem_fd_exhaustion',
+	'gem_fence_thrash',
+	'gem_fence_upload',
+	'gem_fenced_exec_thrash',
+	'gem_flink_basic',
+	'gem_flink_race',
+	'gem_gpgpu_fill',
+	'gem_gtt_cpu_tlb',
+	'gem_gtt_hog',
+	'gem_gtt_speed',
+	'gem_hangcheck_forcewake',
+	'gem_largeobject',
+	'gem_linear_blits',
+	'gem_lut_handle',
+	'gem_madvise',
+	'gem_media_fill',
+	'gem_mmap',
+	'gem_mmap_gtt',
+	'gem_mmap_offset_exhaustion',
+	'gem_mmap_wc',
+	'gem_mocs_settings',
+	'gem_partial_pwrite_pread',
+	'gem_persistent_relocs',
+	'gem_pin',
+	'gem_pipe_control_store_loop',
+	'gem_ppgtt',
+	'gem_pread',
+	'gem_pread_after_blit',
+	'gem_pwrite',
+	'gem_pwrite_pread',
+	'gem_pwrite_snooped',
+	'gem_read_read_speed',
+	'gem_readwrite',
+	'gem_reg_read',
+	'gem_reloc_overflow',
+	'gem_reloc_vs_gpu',
+	'gem_render_copy',
+	'gem_render_copy_redux',
+	'gem_render_linear_blits',
+	'gem_render_tiled_blits',
+	'gem_request_retire',
+	'gem_reset_stats',
+	'gem_ring_sync_copy',
+	'gem_ring_sync_loop',
+	'gem_ringfill',
+	'gem_seqno_wrap',
+	'gem_set_tiling_vs_blt',
+	'gem_set_tiling_vs_gtt',
+	'gem_set_tiling_vs_pwrite',
+	'gem_shrink',
+	'gem_softpin',
+	'gem_spin_batch',
+	'gem_stolen',
+	'gem_storedw_batches_loop',
+	'gem_storedw_loop',
+	'gem_streaming_writes',
+	'gem_sync',
+	'gem_threaded_access_tiled',
+	'gem_tiled_blits',
+	'gem_tiled_fence_blits',
+	'gem_tiled_partial_pwrite_pread',
+	'gem_tiled_pread_basic',
+	'gem_tiled_pread_pwrite',
+	'gem_tiled_swapping',
+	'gem_tiled_wb',
+	'gem_tiled_wc',
+	'gem_tiling_max_stride',
+	'gem_unfence_active_buffers',
+	'gem_unref_active_buffers',
+	'gem_userptr_blits',
+	'gem_wait',
+	'gem_workarounds',
+	'gem_write_read_ring_switch',
+	'gen3_mixed_blits',
+	'gen3_render_linear_blits',
+	'gen3_render_mixed_blits',
+	'gen3_render_tiledx_blits',
+	'gen3_render_tiledy_blits',
+	'gen7_forcewake_mt',
+	'gvt_basic',
+	'kms_3d',
+	'kms_addfb_basic',
+	'kms_atomic',
+	'kms_atomic_transition',
+	'kms_busy',
+	'kms_ccs',
+	'kms_chv_cursor_fail',
+	'kms_concurrent',
+	'kms_crtc_background_color',
+	'kms_cursor_crc',
+	'kms_cursor_legacy',
+	'kms_draw_crc',
+	'kms_fbc_crc',
+	'kms_fbcon_fbt',
+	'kms_fence_pin_leak',
+	'kms_flip',
+	'kms_flip_event_leak',
+	'kms_flip_tiling',
+	'kms_force_connector_basic',
+	'kms_frontbuffer_tracking',
+	'kms_hdmi_inject',
+	'kms_invalid_dotclock',
+	'kms_legacy_colorkey',
+	'kms_mmap_write_crc',
+	'kms_mmio_vs_cs_flip',
+	'kms_panel_fitting',
+	'kms_pipe_b_c_ivb',
+	'kms_pipe_color',
+	'kms_pipe_crc_basic',
+	'kms_plane',
+	'kms_plane_lowres',
+	'kms_plane_multiple',
+	'kms_plane_scaling',
+	'kms_properties',
+	'kms_psr_sink_crc',
+	'kms_pwrite_crc',
+	'kms_render',
+	'kms_rmfb',
+	'kms_rotation_crc',
+	'kms_setmode',
+	'kms_sink_crc_basic',
+	'kms_sysfs_edid_timing',
+	'kms_tv_load_detect',
+	'kms_universal_plane',
+	'kms_vblank',
+	'meta_test',
+	'perf',
+	'pm_backlight',
+	'pm_lpsp',
+	'pm_rc6_residency',
+	'pm_rpm',
+	'pm_rps',
+	'pm_sseu',
+	'prime_busy',
+	'prime_mmap',
+	'prime_mmap_coherency',
+	'prime_mmap_kms',
+	'prime_self_import',
+	'prime_udl',
+	'prime_vgem',
+	'sw_sync',
+	'syncobj_basic',
+	'template',
+	'tools_test',
+	'vgem_basic',
+	'vgem_slow',
+]
+
+test_deps = [ igt_deps ]
+if libdrm_nouveau.found()
+	test_progs += [
+		'prime_nv_api',
+		'prime_nv_pcopy',
+		'prime_nv_test',
+	]
+	test_deps += libdrm_nouveau
+endif
+
+if libdrm_vc4.found()
+	test_progs += [
+		'vc4_create_bo',
+		'vc4_dmabuf_poll',
+		'vc4_lookup_fail',
+		'vc4_wait_bo',
+		'vc4_wait_seqno',
+	]
+	test_deps += libdrm_vc4
+endif
+
+if libdrm_amdgpu.found()
+	# FIXME meson/ninja really doesn't like build targets with paths in them
+	test_progs += [
+		'amdgpu/amd_basic',
+		'amdgpu/amd_cs_nop',
+		'amdgpu/amd_prime',
+	]
+	test_deps += libdrm_amdgpu
+endif
+
+if alsa.found()
+	test_progs += [
+		'audio',
+	]
+	test_deps += alsa
+endif
+
+foreach prog : test_progs
+	executable(prog, prog + '.c',
+			dependencies : test_deps)
+endforeach
+
+executable('testdisplay', ['testdisplay.c', 'testdisplay_hotplug.c'],
+		dependencies : test_deps)
+test_progs += 'testdisplay'
+
+run_command('generate_testlist.sh', test_progs)
+
+test_script = find_program('igt_command_line.sh')
+foreach prog : test_progs
+	test('testcase check: ' + prog, test_script,
+			args : prog)
+endforeach
+
+executable('gem_stress', 'gem_stress.c', dependencies : igt_deps)
+
+# IMPORTANT: These tests here are all disabled because the result in sometime
+# unrecoverable gpu hangs. Don't put real testcases here.
+hang_progs = [
+	'gem_bad_batch',
+	'gem_hang',
+	'gem_bad_blit',
+	'gem_bad_address',
+	'gem_non_secure_batch',
+]
+foreach prog : hang_progs
+	executable(prog, prog + '.c',
+			dependencies : igt_deps,
+			install : false)
+endforeach
diff --git a/tools/meson.build b/tools/meson.build
new file mode 100644
index 000000000000..d2d4410e2130
--- /dev/null
+++ b/tools/meson.build
@@ -0,0 +1,59 @@ 
+tools_progs_noisnt = [
+	'hsw_compute_wrpll',
+	'skl_compute_wrpll',
+	'skl_ddb_allocation',
+]
+
+foreach prog : tools_progs_noisnt
+	executable(prog, prog + '.c',
+			dependencies : igt_deps,
+			install : false)
+endforeach
+
+tools_progs = [
+	# FIXME we already have a libtestcase with this name as target
+	#'igt_stats',
+	'intel_audio_dump',
+	'intel_backlight',
+	'intel_bios_dumper',
+	'intel_display_crc',
+	'intel_display_poller',
+	'intel_forcewaked',
+	'intel_gpu_frequency',
+	'intel_firmware_decode',
+	'intel_gpu_time',
+	'intel_gpu_top',
+	'intel_gtt',
+	'intel_guc_logger',
+	'intel_infoframes',
+	'intel_lid',
+	'intel_opregion_decode',
+	'intel_panel_fitter',
+	'intel_reg_checker',
+	'intel_residency',
+	'intel_stepping',
+	'intel_vbt_decode',
+	'intel_watermark',
+	'intel_gem_info',
+	'intel_gvtg_test',
+]
+tool_deps = igt_deps
+
+if libdrm_intel.found()
+	tools_progs += [
+		'intel_dump_decode',
+		'intel_error_decode',
+		'intel_framebuffer_dump',
+		'intel_perf_counters',
+	]
+	tool_deps += zlib
+endif
+
+foreach prog : tools_progs
+	executable(prog, prog + '.c',
+			dependencies : tool_deps)
+endforeach
+
+shared_library('intel_aubdump', 'aubdump.c', dependencies : [ igt_deps, dlsym ])
+
+subdir('null_state_gen')
diff --git a/tools/null_state_gen/meson.build b/tools/null_state_gen/meson.build
new file mode 100644
index 000000000000..96697dbf64f1
--- /dev/null
+++ b/tools/null_state_gen/meson.build
@@ -0,0 +1,15 @@ 
+intel_null_state_gen_src = [
+	'intel_batchbuffer.c',
+	'intel_renderstate_gen6.c',
+	'intel_renderstate_gen7.c',
+	'intel_renderstate_gen8.c',
+	'intel_renderstate_gen9.c',
+	'intel_null_state_gen.c',
+]
+
+intel_null_state_gen = executable('intel_null_state_gen',
+		intel_null_state_gen_src, dependencies : igt_deps,
+		install : false)
+
+# FIXME actual null_state generation. We probably want to push the the copyright
+# header generation into intel_null_state_gen for simplicity