openexr: Fix check for when to pass -std=c++98
authorNirbheek Chauhan <nirbheek@centricular.com>
Sun, 1 Dec 2019 11:34:05 +0000 (17:04 +0530)
committerTim-Philipp Müller <tim@centricular.com>
Mon, 2 Dec 2019 10:14:52 +0000 (10:14 +0000)
commit 6adfb120ab0e1bb0b3439ad725a362cfe4fbe733 added this flag to fix
builds with `-Werror`, and afterwards it was changed to use a version
check when newer versions of openexr moved over to C++11.

However, some distros have backported patches to older openexr
versions which make it require C++11, which makes the version check
incorrect and causes an error because we passed `-Werror -std=c++98`.

Instead, directly check when usage of the header requires `-std=c++98`
with `-Werror` and override the `cpp_std` setting on the target.

Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1117

ext/openexr/meson.build

index 8fac330..2bd5fb0 100644 (file)
@@ -1,19 +1,34 @@
 openexr_dep = dependency('OpenEXR', required: get_option('openexr'))
 if openexr_dep.found()
-  openexr_cppargs = []
-
+  openexr_override_options = []
+  # Older versions of openexr fail to build with -Werror when using GCC >= 9.2
+  # and Clang >= 6 because it uses deprecated C++98 syntax. Explicitly pass
+  # -std=c++98 in those cases. Just checking the openexr version is not enough
+  # because distros (such as Ubuntu 18.04) have backported patches due to which
+  # older openexr versions now require C++11.
   if openexr_dep.version().version_compare('< 2.4.0')
-    openexr_cppargs += cxx.get_supported_arguments(['-std=c++98'])
+    # Check whether using the openexr headers with -Werror causes an error
+    if cxx.has_argument('-Werror') and cxx.check_header('ImfRgbaFile.h', dependencies: openexr_dep)
+      if not cxx.check_header('ImfRgbaFile.h', dependencies: openexr_dep, args: '-Werror')
+        # If setting -std to c++98 fixes it, use that! Else, warn.
+        if cxx.check_header('ImfRgbaFile.h', dependencies: openexr_dep, args: ['-Werror', '-std=c++98'])
+          openexr_override_options = ['cpp_std=c++98']
+        else
+          warning('openexr headers can\'t be included with \'-Werror\', and no workaround found')
+        endif
+      endif
+    endif
   endif
 
   gstopenexr = library('gstopenexr',
     'gstopenexr.c',
     'gstopenexrdec.cpp',
     c_args: gst_plugins_bad_args,
-    cpp_args: gst_plugins_bad_args + openexr_cppargs,
+    cpp_args: gst_plugins_bad_args,
     link_args: noseh_link_args,
     include_directories: [configinc, libsinc],
     dependencies: [gstvideo_dep, openexr_dep],
+    override_options: openexr_override_options,
     install: true,
     install_dir: plugins_install_dir,
   )