version_cfg = configuration_data()
version_cfg.set('VA_API_MAJOR_VERSION', va_api_major_version)
version_cfg.set('VA_API_MINOR_VERSION', va_api_minor_version)
version_cfg.set('VA_API_MICRO_VERSION', va_api_micro_version)
version_cfg.set('VA_API_VERSION', va_api_version)

version_file = configure_file(
  input : 'va_version.h.in',
  output : 'va_version.h',
  configuration : version_cfg)

libva_sources = [
  'va.c',
  'va_compat.c',
  'va_str.c',
  'va_trace.c',
]

libva_headers = [
  'va.h',
  'va_backend.h',
  'va_backend_prot.h',
  'va_backend_vpp.h',
  'va_compat.h',
  'va_dec_hevc.h',
  'va_dec_jpeg.h',
  'va_dec_vp8.h',
  'va_dec_vp9.h',
  'va_dec_av1.h',
  'va_drmcommon.h',
  'va_egl.h',
  'va_enc_hevc.h',
  'va_enc_h264.h',
  'va_enc_jpeg.h',
  'va_enc_vp8.h',
  'va_fei.h',
  'va_fei_h264.h',
  'va_fei_hevc.h',
  'va_enc_mpeg2.h',
  'va_enc_vp9.h',
  'va_enc_av1.h',
  'va_str.h',
  'va_tpi.h',
  'va_prot.h',
  'va_vpp.h',
  version_file,
]

# headers that have be copied for subprojects
libva_headers_subproject = []

libva_headers_priv = [
  'sysdeps.h',
  'va_internal.h',
  'va_trace.h',
]

libva_sym = 'libva.syms'
libva_sym_arg = '-Wl,-version-script,' + '@0@/@1@'.format(meson.current_source_dir(), libva_sym)

libva_link_args = []
libva_link_depends = []
if cc.links('', name: '-Wl,--version-script', args: ['-shared', libva_sym_arg])
  libva_link_args = libva_sym_arg
  libva_link_depends = libva_sym
endif

install_headers(libva_headers, subdir : 'va')

libva = shared_library(
  'va',
  sources : libva_sources +
            libva_headers +
            libva_headers_priv,
  vs_module_defs : 'libva.def',
  soversion : host_machine.system() == 'windows' ? '' : libva_lt_current,
  version : libva_lt_version,
  c_args : [ '-DSYSCONFDIR="' + sysconfdir + '"'] + ['-DVA_DRIVERS_PATH="' + driverdir + '"'],
  include_directories : configinc,
  link_args : libva_link_args,
  link_depends : libva_link_depends,
  install : true,
  dependencies : [ dl_dep ])

libva_dep = declare_dependency(
  link_with : libva,
  include_directories : configinc,
  dependencies : [ dl_dep ])

if WITH_DRM
  libva_drm_sources = [
    'drm/va_drm.c',
    'drm/va_drm_auth.c',
    'drm/va_drm_utils.c',
  ]

  libva_drm_headers = [
    'drm/va_drm.h',
  ]

  libva_headers_subproject += libva_drm_headers

  libva_drm_headers_priv = [
    'drm/va_drm_auth.h',
    'drm/va_drm_auth_x11.h',
    'drm/va_drm_utils.h',
  ]

  deps = [ libdrm_dep ]

  libva_drm_args = []
  if WITH_X11
    libva_drm_sources += [ 'drm/va_drm_auth_x11.c' ]
    libva_drm_args += [
      '-DHAVE_VA_X11',
      '-DLIBVA_MAJOR_VERSION=@0@'.format(libva_major_version)
    ]
    deps += [ x11_dep ]
  endif

  install_headers(libva_drm_headers, subdir : 'va')

  libva_drm = shared_library(
    'va-drm',
    sources : libva_drm_sources +
              libva_drm_headers +
              libva_drm_headers_priv,
    soversion : libva_lt_current,
    version : libva_lt_version,
    install : true,
    c_args : libva_drm_args,
    dependencies : deps + [ libva_dep ])

  libva_drm_dep = declare_dependency(
    link_with : libva_drm,
    include_directories : configinc,
    dependencies : deps)
endif

if WITH_X11
  libva_x11_sources = [
    'x11/dri2_util.c',
    'x11/va_dri2.c',
    'x11/va_dri3.c',
    'drm/va_drm_utils.c',
    'x11/va_dricommon.c',
    'x11/va_fglrx.c',
    'x11/va_nvctrl.c',
    'x11/va_x11.c',
  ]

  libva_dri_headers = [
    'x11/va_dri2.h',
    'x11/va_dri3.h',
    'x11/va_dricommon.h',
  ]

  libva_x11_headers = ['va_x11.h'] + libva_dri_headers + ['va_trace.h']

  libva_headers_subproject += libva_dri_headers

  libva_x11_headers_priv = [
    'x11/va_dri2str.h',
    'x11/va_dri2tokens.h',
    'x11/va_dri3.h',
    'x11/va_fglrx.h',
    'x11/va_nvctrl.h',
  ]

  install_headers(libva_x11_headers, subdir : 'va')

  deps = [ libdrm_dep, x11_dep, xext_dep, xfixes_dep, x11_xcb_dep, xcb_dep, xcb_dri3_dep, libva_dep ]

  libva_x11 = shared_library(
    'va-x11',
    sources : libva_x11_sources +
              libva_x11_headers +
              libva_x11_headers_priv,
    soversion : libva_lt_current,
    version : libva_lt_version,
    install : true,
    dependencies : deps)

  libva_x11_dep = declare_dependency(
    link_with : libva_x11,
    include_directories : configinc,
    dependencies : deps)
endif

if WITH_GLX
  libva_glx_sources = [
    'glx/va_glx.c',
    'glx/va_glx_impl.c',
  ]

  libva_glx_headers = [
    'glx/va_backend_glx.h',
    'glx/va_glx.h',
  ]

  libva_headers_subproject += libva_glx_headers

  libva_glx_headers_priv = [
    'glx/va_glx_impl.h',
    'glx/va_glx_private.h',
  ]

  install_headers(libva_glx_headers, subdir : 'va')

  deps = [ gl_dep, libva_x11_dep ]

  libva_glx = shared_library(
    'va-glx',
    sources : libva_glx_sources +
              libva_glx_headers +
              libva_glx_headers_priv,
    soversion : libva_lt_current,
    version : libva_lt_version,
    install : true,
    dependencies : deps)

  libva_glx_dep = declare_dependency(
    link_with : libva_glx,
    include_directories : configinc,
    dependencies : deps)
endif

if WITH_WAYLAND
  libva_wayland_sources = [
    'wayland/va_wayland.c',
    'wayland/va_wayland_linux_dmabuf.c',
    'wayland/va_wayland_drm.c',
    'wayland/va_wayland_emgd.c',
    'drm/va_drm_utils.c',
  ]

  libva_wayland_headers = [
    'wayland/va_backend_wayland.h',
    'wayland/va_wayland.h',
  ]

  libva_headers_subproject += libva_wayland_headers

  libva_wayland_headers_priv = [
    'wayland/va_wayland_linux_dmabuf.h',
    'wayland/va_wayland_drm.h',
    'wayland/va_wayland_emgd.h',
    'wayland/va_wayland_private.h',
  ]

  # XXX: grab linux-dmabuf-v1.xml from wayland-protocols
  protocols = {
    'wayland-drm': 'wayland/wayland-drm.xml',
    'linux-dmabuf-v1': 'wayland/linux-dmabuf-v1.xml',
  }

  protocol_files = []
  foreach name, xml : protocols
    protocol_files += custom_target(
      name + '-client-protocol.c',
      output : name + '-client-protocol.c',
      input : xml,
      command : [wl_scanner, 'private-code', '@INPUT@', '@OUTPUT@'])
    protocol_files += custom_target(
      name + '-client-protocol.h',
      output : name + '-client-protocol.h',
      input : xml,
      command : [wl_scanner, 'client-header', '@INPUT@', '@OUTPUT@'])
  endforeach

  install_headers(libva_wayland_headers, subdir : 'va')

  deps = [ libdrm_dep, wayland_dep, libva_dep ]

  libva_wayland = shared_library(
    'va-wayland',
    sources : libva_wayland_sources +
              libva_wayland_headers +
              libva_wayland_headers_priv +
              protocol_files,
    soversion : libva_lt_current,
    version : libva_lt_version,
    install : true,
    dependencies : deps)

  libva_wayland_dep = declare_dependency(
    link_with : libva_wayland,
    include_directories : configinc,
    dependencies : deps)
endif

fs = import('fs')
if WITH_WIN32
  libva_win32_sources = [
    'win32/va_win32.c',
  ]

  libva_win32_headers = [
    'win32/va_win32.h',
  ]

  libva_headers_subproject += libva_win32_headers

  deps = [ libwin32_dep, libva_dep ]

  libva_win32_args = [
    '-DLIBVA_MAJOR_VERSION=@0@'.format(libva_major_version)
  ]

  install_headers(libva_win32_headers, subdir : 'va')

  libva_win32 = shared_library(
    'va_win32',
    sources : libva_win32_sources +
              libva_win32_headers,
    soversion : host_machine.system() == 'windows' ? '' : libva_lt_current,
    version : libva_lt_version,
    install : true,
    c_args : libva_win32_args,
    vs_module_defs : 'libva_win32.def',
    dependencies : deps)

  libva_win32_dep = declare_dependency(
    link_with : libva_win32,
    include_directories : configinc,
    dependencies : deps)
endif

foreach header : libva_headers_subproject
  if meson.version().version_compare('>= 0.64')
    fs.copyfile(header)
  else
    configure_file(output: fs.name(header), input: header, copy: true)
  endif
endforeach
