meson: Rework opencv plugin checks
authorNirbheek Chauhan <nirbheek@centricular.com>
Mon, 28 Nov 2016 20:11:28 +0000 (01:41 +0530)
committerNirbheek Chauhan <nirbheek@centricular.com>
Mon, 28 Nov 2016 20:30:52 +0000 (02:00 +0530)
a) Use get_pkgconfig_variable() to get the opencv prefix
b) Place an upper limit on the opencv version
c) Ensure that headers are available

(b) and (c) just copy what the configure.ac checks do.

ext/opencv/meson.build
meson.build

index ac96a90..db95b8e 100644 (file)
@@ -1,4 +1,4 @@
-opencv_sources = [
+gstopencv_sources = [
   'gstcvdilate.cpp',
   'gstcvdilateerode.cpp',
   'gstcvequalizehist.cpp',
@@ -23,27 +23,61 @@ opencv_sources = [
   'motioncells_wrapper.cpp'
 ]
 
-opencv_cargs = ['-DGST_HAAR_CASCADES_DIR="@0@"']
-runcmd = run_command('pkg-config', '--variable=prefix', 'opencv')
-if runcmd.returncode() == 0
-  opencv_cargs += '-DOPENCV_PREFIX="' + runcmd.stdout().strip() + '"'
-endif
+libopencv2_headers = [
+  'opencv2/core/core_c.h',
+  'opencv2/core/version.hpp',
+  'opencv2/highgui/highgui_c.h',
+  'opencv2/imgproc/imgproc.hpp',
+  'opencv2/imgproc/imgproc_c.h',
+  'opencv2/objdetect/objdetect.hpp',
+  'opencv2/video/background_segm.hpp',
+]
+
+gstopencv_cargs = ['-DGST_HAAR_CASCADES_DIR="@0@"']
 
-r = run_command('test', '-d', '/usr/share/opencv')
-if r.returncode() == 0
-  opencv_cargs += '-DOPENCV_PATH_NAME="opencv"'
-else
-  opencv_cargs += '-DOPENCV_PATH_NAME="OpenCv"'
+# First, check for the upper version limit and ensure it isn't found
+# FIXME: When 0.37.0 is released, change this to use many-version-conditions
+opencv3_dep = dependency('opencv', version : '>3.1.0', required : false)
+# Then, check if the lower version limit is found
+opencv2_dep = dependency('opencv', version : '>=2.3.0', required : false)
+
+opencv2_found = false
+if opencv3_dep.found()
+  message('OpenCV version is too new: \'' + opencv3_dep.version() + '\' (need <= 3.1.0)')
+elif opencv2_dep.found()
+  message('OpenCV found, version is \'' + opencv2_dep.version() + '\'')
+  opencv2_found = true
+  foreach h : libopencv2_headers
+    if not cxx.has_header(h)
+      message('Needed header "' + h + '" not found')
+      opencv2_found = false
+    endif
+  endforeach
 endif
 
-opencv_dep = dependency('opencv', version : '>= 2.3.0', required : false)
-if opencv_dep.found()
+if opencv2_found
+  opencv2_prefix = opencv2_dep.get_pkgconfig_variable('prefix')
+  gstopencv_cargs += ['-DOPENCV_PREFIX="' + opencv2_prefix + '"']
+
+  # Check the data dir used by opencv for its xml data files
+  # Use prefix from pkg-config to be compatible with cross-compilation
+  r = run_command('test', '-d', opencv2_prefix + '/share/opencv')
+  if r.returncode() == 0
+    gstopencv_cargs += '-DOPENCV_PATH_NAME="opencv"'
+  else
+    r = run_command('test', '-d', opencv2_prefix + '/share/OpenCV')
+    if r.returncode() == 0
+      gstopencv_cargs += '-DOPENCV_PATH_NAME="OpenCv"'
+    else
+      error('Unable to detect OpenCV data directory')
+    endif
+  endif
   gstopencv = library('gstopencv',
-    opencv_sources,
-    cpp_args : gst_plugins_bad_args + opencv_cargs + [ '-DGST_USE_UNSTABLE_API' ],
+    gstopencv_sources,
+    cpp_args : gst_plugins_bad_args + gstopencv_cargs + [ '-DGST_USE_UNSTABLE_API' ],
     link_args : noseh_link_args,
     include_directories : [configinc],
-    dependencies : [gstbase_dep, gstvideo_dep, opencv_dep, gstopencv_dep],
+    dependencies : [gstbase_dep, gstvideo_dep, opencv2_dep, gstopencv_dep],
     install : true,
     install_dir : plugins_install_dir,
   )
index eecd37c..1788267 100644 (file)
@@ -27,6 +27,7 @@ libversion = '@0@.@1@.0'.format(soversion, gst_version_minor.to_int() * 100 + gs
 plugins_install_dir = '@0@/gstreamer-1.0'.format(get_option('libdir'))
 
 cc = meson.get_compiler('c')
+cxx = meson.get_compiler('cpp')
 
 if cc.get_id() == 'msvc'
   # Ignore several spurious warnings for things gstreamer does very commonly