# Copyright © 2017-2018 Intel Corporation

# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:

# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

libdrm_intel = library(
  'drm_intel',
  [
    files(
      'intel_bufmgr.c', 'intel_bufmgr_fake.c', 'intel_bufmgr_gem.c',
      'intel_decode.c', 'mm.c', 'intel_chipset.c',
    ),
    config_file,
  ],
  include_directories : [inc_root, inc_drm],
  link_with : libdrm,
  dependencies : [dep_pciaccess, dep_pthread_stubs, dep_rt, dep_valgrind, dep_atomic_ops],
  c_args : libdrm_c_args,
  version : '1.0.0',
  install : true,
)

ext_libdrm_intel = declare_dependency(
  link_with : [libdrm, libdrm_intel],
  include_directories : [inc_drm, include_directories('.')],
)

install_headers(
  'intel_bufmgr.h', 'intel_aub.h', 'intel_debug.h',
  subdir : 'libdrm',
)

pkg.generate(
  name : 'libdrm_intel',
  libraries : libdrm_intel,
  subdirs : ['.', 'libdrm'],
  version : meson.project_version(),
  requires : 'libdrm',
  description : 'Userspace interface to intel kernel DRM services',
)

test_decode = executable(
  'test_decode',
  files('test_decode.c'),
  include_directories : [inc_root, inc_drm],
  link_with : [libdrm, libdrm_intel],
  c_args : libdrm_c_args,
)

test(
  'gen4-3d.batch',
  find_program('tests/gen4-3d.batch.sh'),
  workdir : meson.current_build_dir(),
)
test(
  'gen45-3d.batch',
  find_program('tests/gm45-3d.batch.sh'),
  workdir : meson.current_build_dir(),
)
test(
  'gen5-3d.batch',
  find_program('tests/gen5-3d.batch.sh'),
  workdir : meson.current_build_dir(),
)
test(
  'gen6-3d.batch',
  find_program('tests/gen6-3d.batch.sh'),
  workdir : meson.current_build_dir(),
)
test(
  'gen7-3d.batch',
  find_program('tests/gen7-3d.batch.sh'),
  workdir : meson.current_build_dir(),
)
test(
  'gen7-2d-copy.batch',
  find_program('tests/gen7-2d-copy.batch.sh'),
  workdir : meson.current_build_dir(),
)

test(
  'intel-symbols-check',
  symbols_check,
  args : [
    '--lib', libdrm_intel,
    '--symbols-file', files('intel-symbols.txt'),
    '--nm', prog_nm.path(),
  ],
)
