Contents

  1. Things needed
  2. Work to do
  3. A Short Cut
  4. Footwork
  5. Other patches
  6. arch.sh
  7. MEX
  8. Sound
  9. Linux pthread libs
  10. LD_LIBRARY_PATH
  11. OpenGL
  12. Issues left

Things needed

the latest stable NetBSD/i386 installation. The archivers/{zip,unzip} packages. The linux emulation packages suse_base and suse_compat.

If you want to run binary modules (MEX), you also need the suse_devel-7.3 package; that is not (yet?) available as suse9.x version. Matlab 14.3 ships with a JDK 1.5 which runs nicely on netbsd-3, so no additional JRE needed. The three Matlab 7 / R14 Unix installation CDROMs. The patches listed below. A few GBytes of diskspace.

Work to do

A Short Cut

While the following steps are kept for documentation and your own experiments, there is a tar-ball available with the patches and a shell script to apply them.

Unpack, change to the patch_matlabcd directory, call sh patch-matlab.sh -m /path/to/cdcontent, optionally add '-v' for verbose output.

Footwork

    
--- /u/software/payware/unix/matlab-r14/CD1/install     2004-09-13 14:56:28.000000000 +0200
+++ install     2004-09-14 11:04:26.000000000 +0200
@@ -516,6 +516,19 @@
                Darwin)                                 # Mac OS X
                     ARCH="mac"
                     ;;
+               NetBSD)                                 # NetBSD (Linux emul)
+                   case "`/usr/bin/uname -m`" in
+                   i*86)
+                       ARCH="glnx86"
+                       ;;
+                   ia64)
+                       ARCH="glnxi64"
+                       ;;
+                   x86_64)
+                       ARCH="glnxa64"
+                       ;;
+                   esac
+                   ;;
             esac
         fi
        return 0
@@ -730,6 +743,19 @@
            Darwin)                                     # Mac OS X
                 ver=`/usr/bin/uname -r | awk '{print $1}'`
                 ;;
+           NetBSD)                                     # NetBSD (Linux emul)
+               case $Arch in
+                   glnx86)
+                       ver=`/emul/linux/lib/libc.so.6 | head -1 | sed -e "s/^[^0-9]*//" -e "s/[ ,].*$//"`
+                       ;;
+                   glnxi64)
+                       ver=2.2.4
+                       ;;
+                   glnxa64)
+                       ver=`/emul/linux/lib64/libc.so.6 | head -1 | sed -e "s/^[^0-9]*//" -e "s/[ ,].*$//"`
+                       ;;
+               esac
+               ;;
         esac
     fi
 #
    

to the ./install script (assuming /emul/linux is a symlink to the root of the linux emulation setup). Apply equally to CD2 and CD3. Apply the patch

--- /u/software/payware/unix/matlab-r14/CD1/update/install/arch.sh      2004-09-13 14:54:55.000000000 +0200
+++ update/install/arch.sh      2004-09-14 11:38:19.000000000 +0200
@@ -185,6 +185,19 @@
                Darwin)                                 # Mac OS X
                     ARCH="mac"
                     ;;
+               NetBSD)                                 # NetBSD (Linux emul)
+                   case "`/usr/bin/uname -m`" in
+                   i*86)
+                       ARCH="glnx86"
+                       ;;
+                   ia64)
+                       ARCH="glnxi64"
+                       ;;
+                   x86_64)
+                       ARCH="glnxa64"
+                       ;;
+                   esac
+                   ;;
             esac
         fi
        return 0

to ./update/install/arch.sh. Apply equally to CD2 and CD3. Pick the ./update/pd/install/tar.cmp zip archive from CD1, and unpack it.

Archive:  tar.cmp
  Length     Date   Time    Name
 --------    ----   ----    ----
    41864  09-14-04 13:10   install_matlab
        0  09-14-04 13:08   update/
        0  09-14-04 13:08   update/install/
        0  09-14-04 13:08   update/install/scripts/
      676  07-10-97 05:11   update/install/scripts/abort.sh
     2575  01-11-99 20:24   update/install/scripts/actualp.sh
     6230  09-14-04 13:11   update/install/scripts/arch.sh
     7329  07-27-00 21:42   update/install/scripts/batch1.sh
     2597  01-11-99 20:24   update/install/scripts/batch4.sh
     6985  01-29-03 21:28   update/install/scripts/bld_lbin.sh
     9466  12-11-03 19:21   update/install/scripts/bld_sbin.sh
      789  10-23-95 19:07   update/install/scripts/center.sh
      530  12-11-03 19:21   update/install/scripts/cleanup.sh
      486  01-11-99 20:24   update/install/scripts/clearsc.sh
      848  01-11-99 20:24   update/install/scripts/cont.sh
      449  01-11-99 20:24   update/install/scripts/echon.sh
     2167  11-01-02 03:33   update/install/scripts/fin.sh
     4590  03-22-04 06:07   update/install/scripts/genpathdef.sh
     3256  12-11-03 19:21   update/install/scripts/intro_l.sh
     5376  12-11-03 19:21   update/install/scripts/intro_s.sh
    20832  01-09-04 18:30   update/install/scripts/lm.sh
     6718  12-11-03 19:21   update/install/scripts/local.sh
     3590  12-11-03 19:21   update/install/scripts/main.sh
     1115  12-11-03 19:21   update/install/scripts/mapname.sh
     1502  01-11-99 20:24   update/install/scripts/netruser.sh
     1754  10-23-98 20:50   update/install/scripts/oldname.sh
     5267  11-01-02 03:33   update/install/scripts/options.sh
     6853  08-31-00 18:09   update/install/scripts/perm.sh
     6585  06-12-02 22:21   update/install/scripts/ruser.sh
      784  01-11-99 20:24   update/install/scripts/searchp.sh
     3303  12-11-03 19:21   update/install/scripts/ucleanpe.sh
     3295  12-11-03 19:21   update/install/scripts/update.sh
     5395  12-11-03 19:21   update/install/scripts/util.sh
     8565  12-11-03 19:21   update/install/scripts/verifyp.sh
 --------                   -------
   171771                   34 files

Apply the patch

--- install_matlab.orig 2005-08-12 10:23:52.000000000 +0200
+++ install_matlab  2005-09-30 14:27:23.000000000 +0200
@@ -552,6 +552,19 @@
            Darwin)                 # Mac OS X
                     ARCH="mac"
                     ;;
+       NetBSD)                 # NetBSD (Linux emul)
+           case "`/usr/bin/uname -m`" in
+           i*86)
+           ARCH="glnx86"
+           ;;
+           ia64)
+           ARCH="glnxi64"
+           ;;
+           x86_64)
+           ARCH="glnxa64"
+           ;;
+           esac
+           ;;
             esac
         fi
    return 0
@@ -795,6 +808,19 @@
        Darwin)                 # Mac OS X
                 ver=`/usr/bin/uname -r | awk '{print $1}'`
                 ;;
+       NetBSD)                 # NetBSD (Linux emul)
+       case $Arch in
+           glnx86)
+           ver=`/emul/linux/lib/libc.so.6 | head -1 | sed -e "s/^[^0-9]*//" -e "s/[ ,].*$//"`
+           ;;
+           glnxi64)
+           ver=2.2.4
+           ;;
+           glnxa64)
+           ver=`/emul/linux/lib64/libc.so.6 | head -1 | sed -e "s/^[^0-9]*//" -e "s/[ ,].*$//"`
+           ;;
+       esac
+       ;;
         esac
     fi
 #

to install_matlab, and the patch

--- orig/update/install/scripts/arch.sh 2004-04-04 10:20:31.000000000 +0200
+++ update/install/scripts/arch.sh      2004-09-14 13:11:17.000000000 +0200
@@ -185,6 +185,19 @@
                Darwin)                                 # Mac OS X
                     ARCH="mac"
                     ;;
+               NetBSD)                                 # NetBSD (Linux emul)
+                   case "`/usr/bin/uname -m`" in
+                   i*86)
+                       ARCH="glnx86"
+                       ;;
+                   ia64)
+                       ARCH="glnxi64"
+                       ;;
+                   x86_64)
+                       ARCH="glnxa64"
+                       ;;
+                   esac
+                   ;;
             esac
         fi
        return 0

(same as above) to update/install/scripts/arch.sh. Re-zip the contents of the archive

[hf@venediger] /var/tmp # zip -r tar.cmp install_matlab update
  adding: install_matlab (deflated 77%)
  adding: update/ (stored 0%)
  adding: update/install/ (stored 0%)
  adding: update/install/scripts/ (stored 0%)
  adding: update/install/scripts/abort.sh (deflated 53%)
  adding: update/install/scripts/actualp.sh (deflated 63%)
  adding: update/install/scripts/arch.sh (deflated 69%)
  adding: update/install/scripts/batch1.sh (deflated 70%)
  adding: update/install/scripts/batch4.sh (deflated 60%)
  adding: update/install/scripts/bld_lbin.sh (deflated 75%)
  adding: update/install/scripts/bld_sbin.sh (deflated 80%)
  adding: update/install/scripts/center.sh (deflated 55%)
  adding: update/install/scripts/cleanup.sh (deflated 42%)
  adding: update/install/scripts/clearsc.sh (deflated 41%)
  adding: update/install/scripts/cont.sh (deflated 53%)
  adding: update/install/scripts/echon.sh (deflated 39%)
  adding: update/install/scripts/fin.sh (deflated 78%)
  adding: update/install/scripts/genpathdef.sh (deflated 66%)
  adding: update/install/scripts/intro_l.sh (deflated 80%)
  adding: update/install/scripts/intro_s.sh (deflated 85%)
  adding: update/install/scripts/lm.sh (deflated 81%)
  adding: update/install/scripts/local.sh (deflated 78%)
  adding: update/install/scripts/main.sh (deflated 68%)
  adding: update/install/scripts/mapname.sh (deflated 54%)
  adding: update/install/scripts/netruser.sh (deflated 62%)
  adding: update/install/scripts/oldname.sh (deflated 53%)
  adding: update/install/scripts/options.sh (deflated 72%)
  adding: update/install/scripts/perm.sh (deflated 74%)
  adding: update/install/scripts/ruser.sh (deflated 82%)
  adding: update/install/scripts/searchp.sh (deflated 47%)
  adding: update/install/scripts/ucleanpe.sh (deflated 63%)
  adding: update/install/scripts/update.sh (deflated 70%)
  adding: update/install/scripts/util.sh (deflated 70%)
  adding: update/install/scripts/verifyp.sh (deflated 78%)

to the same name. Copy to CD1, CD2 and CD3. Rinse and repeat.

At the end of the installation, there is a spurious rm -f with empty argument that can safely be ignored. If you find out where it hides, please tell me.

FlexLM comes with a byzantine set of shell script tools. Of course, there is one more arch.sh to patch, this time under {MATLABHOME}/etc/util/arch.sh. Then create /usr/tmp, preferably as a symlink to /var/tmp, because FlexLM and the MLM backend have that hard-coded for logs, locks, preferences. Make sure you have got a proper license file in place - the procedure is well-documented. After that, you can either start the flexlm daemon from /etc/rc.local by using {MATLABHOME}/etc/rc.lm.glnx86 start|stop, or with the following rc.d script :

#!/bin/sh
#
# $Id: how_to_run_matlab_r14.3_on_netbsd__92__i386.mdwn,v 1.2 2012/02/05 07:14:36 schmonz Exp $
#
# PROVIDE: flexlm
# REQUIRE: DAEMON

. /etc/rc.subr

name="flexlm"
rcvar=$name
flexlm_user="flexlm"
matlabroot="/path/to/matlabr14"
lm_license="${matlabroot}/etc/license.dat"
required_files="${lm_license}"
command="${matlabroot}/etc/glnx86/lmgrd"
command_args="-c ${lm_license} -2 -p -l +/var/log/flexlmlog"

load_rc_config $name
run_rc_command "$1"

-- you need to create a user to run flexlm as, and own the logfile to him.

Other patches

arch.sh

For whatever reason there may be, a Matlab 14 installation has three instances of the arch.sh script that works out what platform Matlab is running on:

> find . -name arch.sh -print
./bin/util/arch.sh
./etc/util/arch.sh
./update/install/scripts/arch.sh

And (of course) the one that is sourced by {MATLABROOT}/bin/matlab is the original version which you should replace by e.g. {MATLABROOT}/etc/util/arch.sh once you get tired of adding -glnx86 to every matlab invocation.

MEX

If you want to build binary modules with mex you need to make sure those modules (libraries) are linux libraries since you cannot use native NetBSD libraries with a program running in emulation. Make sure you install the suse_devel package as listed above, and apply this patch to {MATLABROOT}/toolbox/matlab/general/mex.m. It makes sure the mex shell-script (which calls the compiler) is executed by the linux shell.

Sound

Add a symlink to the native /dev/sound like

[hf@dreispitz] /<1>linux/dev > pwd
/usr/pkg/emul/linux/dev
[hf@dreispitz] /<1>linux/dev > ll audio 
0 lrwx------  1 root  wheel  13 Sep 10 03:25 audio -> /../dev/sound

Linux pthread libs

Matlab 13, at least, expects the pthread shared library under /usr/lib whereas NetBSD's suse*_base package installs it under /lib. You need to manually add

[hf@dreispitz] /<2>usr/lib > ll libpthread.so*
0 lrwxr-xr-x  1 root  wheel  25 Jul 22 17:35 libpthread.so -> ../../lib/libpthread.so.0
0 lrwxr-xr-x  1 root  wheel  25 Jul 22 17:35 libpthread.so.0 -> ../../lib/libpthread.so.0

LD_LIBRARY_PATH

As a Linux binary, Matlab makes heavy use of the LD_LIBRARY_PATH environment variable to access shared libraries. For a shell exit, it populates LD_LIBRARY_PATH like

>> !echo $LD_LIBRARY_PATH
/opt/matlabr14/sys/os/glnx86:/opt/matlabr14/bin/glnx86:/opt/matlabr14/extern/lib/glnx86:/opt/matlabr14/sys/java/jre/glnx86/jre1.5.0/lib/i386/native_threads:/opt/matlabr14/sys/java/jre/glnx86/jre1.5.0/lib/i386/client:/opt/matlabr14/sys/java/jre/glnx86/jre1.5.0/lib/i386
>>

NetBSD ELF binaries do not normally use LD_LIBRARY_PATH; instead, NetBSD compiles fixed library paths into shared libraries and applications. Nevertheless, non-setuid NetBSD binaries still look at LD_LIBRARY_PATH. The above path apparently confuses complex NetBSD binaries like NEdit, XEmacs, Mozilla, which try to pick up Linux libraries instead of the native ones. As a workaround, unset LD_LIBRARY_PATH before calling the application, either with per-application wrapper scripts, or a generic wrapper script like

#!/bin/sh
unset LD_LIBRARY_PATH
exec "$@"

OpenGL

Commands like bench that use OpenGL result in a kernel panic . Christos Zoulas has provided a kernel patch. It is against 2005-10-10 NetBSD-current source and applies with offsets to the netbsd-3 branch; apply from within sys/arch/i386/.

The patch avoids the panic; what functionality exactly is missing remains to be seen.

Workaround: The Matlab command opengl software enforces software rendering which is slower than using hardware support - but appears to work, unlike the latter. You still need the kernel patch, though, as any OpenGL operation will panic otherwise.

Issues left

Why Mathworks duplicate their set of install scripts everywhere and still keep a zipped copy around to drop on top of the installation is beyond me. The diffs above are clean and minimal - it's just that you have to have five instances of each.

--Hauke Fath