From 4a396a608aefc3282baea76bc4e1965faa99b4f8 Mon Sep 17 00:00:00 2001
From: Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl>
Date: Fri, 16 Aug 2019 12:34:44 +0200
Subject: Check for the mex -R2017b option in configure

Since we use mex for linking, but CXX for compiling, we also need to
set a preprocessor macro to emulate the -R2017b option. Currently we
use -DMATLAB_MEXCMD_RELEASE=700, but it is unclear if this is the
recommended way.

This is required to build with Matlab R2018a and newer.
---
 build/linux/Makefile.in  |  4 ++--
 build/linux/acinclude.m4 | 20 ++++++++++++++++++--
 build/linux/configure.ac | 17 +++++++++++++++++
 3 files changed, 37 insertions(+), 4 deletions(-)

(limited to 'build')

diff --git a/build/linux/Makefile.in b/build/linux/Makefile.in
index 078a1a2..209206e 100644
--- a/build/linux/Makefile.in
+++ b/build/linux/Makefile.in
@@ -67,7 +67,7 @@ endif
 
 ifeq ($(matlab),yes)
 # TODO: Do we also want -fopenmp for octave?
-CPPFLAGS+=-I$(MATLAB_ROOT)/extern/include -DMATLAB_MEX_FILE
+CPPFLAGS+=-I$(MATLAB_ROOT)/extern/include -DMATLAB_MEX_FILE @CPPFLAGS_MATLAB@
 ifeq ($(macos),no)
 CXXFLAGS+=-fopenmp
 LDFLAGS+=-fopenmp
@@ -101,7 +101,7 @@ endif
 CPPFLAGS+=-I$(srcdir)/../../include -I$(srcdir)/../../lib/include
 
 ifeq ($(matlab),yes)
-MEXFLAGS  = -cxx
+MEXFLAGS  = @MEXFLAGS@ -cxx
 MEXLDFLAGS=\$$LDFLAGS $(MODLDFLAGS)
 MEXLIBS   = -lut
 MEXSUFFIX = @MEXSUFFIX@
diff --git a/build/linux/acinclude.m4 b/build/linux/acinclude.m4
index d6866c3..135c1c6 100644
--- a/build/linux/acinclude.m4
+++ b/build/linux/acinclude.m4
@@ -38,8 +38,7 @@ extern "C" void mexFunction() {
 }
 _ACEOF
 $CXX -fPIC -c -o conftest.o conftest.cc
-$MEX -cxx -output conftest conftest.o
-$2=""
+$MEX -cxx -output conftest conftest.o >/dev/null 2>&1
 for suffix in $1; do
   if test -f "conftest.$suffix"; then
     $2="$suffix"
@@ -49,6 +48,23 @@ done
 rm -f conftest.cc conftest.o
 ])
 
+dnl ASTRA_CHECK_MEX_OPTION(option, mex-suffix, action-if-supported, action-if-not-supported)
+dnl Check if an option is supported by mex.
+dnl We test if mex works by testing if it produces a mex file as output;
+dnl this is required since 'mex' is also a commonly installed LaTeX format
+AC_DEFUN([ASTRA_CHECK_MEX_OPTION],[
+cat >conftest.cc <<_ACEOF
+extern "C" void mexFunction() {
+}
+_ACEOF
+$CXX -fPIC -c -o conftest.o conftest.cc
+$MEX $1 -cxx -output conftest conftest.o >/dev/null 2>&1
+AS_IF([test -f "conftest.$2"],[
+  rm -f "conftest.$2"
+  $3],[$4])
+rm -f conftest.cc conftest.o
+])
+
 
 dnl ASTRA_RUN_STOREOUTPUT(command, output)
 AC_DEFUN([ASTRA_RUN_STOREOUTPUT],[{
diff --git a/build/linux/configure.ac b/build/linux/configure.ac
index ffb525a..0a9024e 100644
--- a/build/linux/configure.ac
+++ b/build/linux/configure.ac
@@ -174,7 +174,24 @@ if test x"$with_matlab" != x; then
   fi
 fi
 
+AC_MSG_CHECKING([if mex requires the -R2017b option])
+if test x"$HAVEMATLAB" = xyes; then
+  ASTRA_CHECK_MEX_OPTION([-R2017b],[$MEXSUFFIX],[
+    MEXFLAGS="-R2017b"
+    # TODO: check if this is the best way of emulating -R2017b when using
+    # CXX directly to compile mex files.
+    CPPFLAGS_MATLAB="-DMATLAB_MEXCMD_RELEASE=700"
+    AC_MSG_RESULT([yes])
+  ],[
+    MEXFLAGS=
+    CPPFLAGS_MATLAB=
+    AC_MSG_RESULT([no])
+  ])
+fi
+
 AC_SUBST(HAVEMATLAB)
+AC_SUBST(MEXFLAGS)
+AC_SUBST(CPPFLAGS_MATLAB)
 
 # octave
 
-- 
cgit v1.2.3