decklink_sources = [
  'gstdecklink.cpp',
  'gstdecklinkaudiosink.cpp',
  'gstdecklinkvideosink.cpp',
  'gstdecklinkaudiosrc.cpp',
  'gstdecklinkvideosrc.cpp',
]

build_decklink = false
decklink_ldflags = []
decklink_libs = []

if host_machine.system() == 'windows'
  decklink_sources += ['win/DeckLinkAPIDispatch.cpp', 'win/DeckLinkAPI_i.c']
  if cxx.get_id() == 'msvc'
    # FIXME: Use commsuppwd.lib for debug builds?
    comutil_dep = cxx.find_library('comsuppw')
    if comutil_dep.found()
      build_decklink = true
      decklink_libs = [comutil_dep]
    endif
  else
    build_decklink = true
  endif
else
  libdl = cc.find_library('dl', required: false)
  have_pthread_h = cdata.has('HAVE_PTHREAD_H')
  if libdl.found() and have_pthread_h
    decklink_libs = [libm, libdl, dependency('threads')]
    if host_machine.system() == 'linux'
      decklink_sources += ['linux/DeckLinkAPIDispatch.cpp']
      build_decklink = true
    elif host_machine.system() == 'darwin'
      decklink_sources += ['osx/DeckLinkAPIDispatch.cpp']
      decklink_ldflags = ['-Wl,-framework,CoreFoundation']
      build_decklink = true
    endif
  endif
endif

if build_decklink
  message('Building decklink plugin')
  decklink = library('gstdecklink',
    decklink_sources,
    cpp_args : gst_plugins_bad_args + [ '-DGST_USE_UNSTABLE_API' ],
    link_args : decklink_ldflags + noseh_link_args,
    include_directories : [configinc],
    dependencies : [gstvideo_dep, gstaudio_dep, gstbase_dep, gst_dep] + decklink_libs,
    install : true,
    install_dir : plugins_install_dir,
  )
else
  message('Not building decklink plugin for "@0@'.format(host_machine.system()))
endif
