2024-02-07 13:59:38 -05:00
|
|
|
{ config, lib, pkgs, nix-matlab, ... }: let
|
|
|
|
# The matlab installation is held in the MATLAB_INSTALL_DIR MATLAB
|
|
|
|
# updates and toolboxes can primarily be handled with the matlab_mpm
|
|
|
|
# tool defined below. This file, alongside the matlab_install.txt
|
|
|
|
# describe the current version of MATLAB available on the
|
|
|
|
# system. Nix *can* fetch MATLAB and all its toolboxes, however not
|
|
|
|
# all MATLAB toolboxes can be installed via commands, some *must* be
|
|
|
|
# installed graphically, and otherwise are unsupported. So, for now,
|
|
|
|
# we try to make installation as documented and reproducible as
|
|
|
|
# possible.
|
|
|
|
|
|
|
|
MATLAB_INSTALL_DIR = "/opt/MATLAB";
|
|
|
|
|
|
|
|
# MATLAB Package Manager: MPM
|
|
|
|
#
|
|
|
|
# This tool is used to guarantee (nearly)
|
|
|
|
# reproducible installations of MATLAB, and to easily allow for
|
|
|
|
# controlling what version of MATLAB is currently installed
|
|
|
|
|
|
|
|
matlab-mpm = pkgs.stdenv.mkDerivation rec {
|
|
|
|
pname = "matlab-package-manager";
|
|
|
|
version = "2023.12.1";
|
|
|
|
|
|
|
|
src = pkgs.fetchurl {
|
|
|
|
url = "https://ssd.mathworks.com/supportfiles/downloads/mpm/${version}/glnxa64/mpm";
|
|
|
|
hash = "sha256-NlfPLDnpRIaKLLuIZAudnFHBKL04gzmypzp98QOa6+g=";
|
|
|
|
};
|
|
|
|
|
|
|
|
nativeBuildInputs = with pkgs; [
|
|
|
|
autoPatchelfHook
|
|
|
|
];
|
|
|
|
|
|
|
|
buildInputs = with pkgs; [
|
|
|
|
gawk
|
|
|
|
gnugrep
|
|
|
|
unzip
|
|
|
|
|
|
|
|
linux-pam
|
|
|
|
libz
|
|
|
|
];
|
|
|
|
|
|
|
|
unpackPhase = "cp $src ./mpm";
|
|
|
|
|
|
|
|
buildPhase = ''
|
|
|
|
tail -n +$(head -n20 ./mpm | grep "tail -n" | awk '{print $3}' | grep -o -E "[0-9]+") ./mpm > ./mpm.zip
|
|
|
|
'';
|
|
|
|
|
|
|
|
installPhase = ''
|
|
|
|
unzip -d $out ./mpm.zip
|
|
|
|
'';
|
|
|
|
|
|
|
|
passthru = {
|
|
|
|
executable = "bin/glnxa64/mpm";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
# Environment with the dependencies needed to run matlab (and
|
|
|
|
# matlab's installers)
|
|
|
|
matlab-env = pkgs.buildFHSUserEnv {
|
|
|
|
name = "matlab-env";
|
2024-07-18 19:07:48 -04:00
|
|
|
targetPkgs = (ps: (nix-matlab.targetPkgs ps) ++ (with ps; [
|
|
|
|
linux-pam
|
|
|
|
]));
|
2024-02-07 13:59:38 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
# Script used to get the most up to date version of the desired MATLAB
|
|
|
|
matlab-update-script = pkgs.writeScriptBin "matlab_update_installation.sh" ''
|
|
|
|
#!${pkgs.bash}/bin/bash
|
|
|
|
|
|
|
|
if [ "''${EUID:-$(id -u)}" -ne 0 ]; then
|
|
|
|
echo "Please make sure to run this script as root"
|
|
|
|
exit -1
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ ! -d "${MATLAB_INSTALL_DIR}" ]; then
|
|
|
|
echo "Make sure that '${MATLAB_INSTALL_DIR}' exists"
|
|
|
|
exit -1
|
|
|
|
fi
|
|
|
|
|
|
|
|
cd ${MATLAB_INSTALL_DIR}
|
|
|
|
cp ${./matlab/install_file.txt} ./install_file.txt
|
|
|
|
sed -e "s#@MATLAB_INSTALL_DIR@#${MATLAB_INSTALL_DIR}#" -i ./install_file.txt
|
|
|
|
|
|
|
|
${matlab-env}/bin/${matlab-env.name} -c '${matlab-mpm}/${matlab-mpm.executable} install --inputfile ./install_file.txt'
|
|
|
|
'';
|
|
|
|
|
|
|
|
desktopItem = pkgs.makeDesktopItem {
|
|
|
|
desktopName = "Matlab";
|
|
|
|
name = "matlab";
|
|
|
|
# We use substituteInPlace after we run `install`
|
|
|
|
# -desktop is needed, see:
|
|
|
|
# https://www.mathworks.com/matlabcentral/answers/20-how-do-i-make-a-desktop-launcher-for-matlab-in-linux#answer_25
|
|
|
|
exec = "@out@/bin/matlab -desktop %F";
|
|
|
|
icon = "matlab";
|
|
|
|
# Most of the following are copied from octave's desktop launcher
|
|
|
|
categories = [
|
|
|
|
"Utility"
|
|
|
|
"TextEditor"
|
|
|
|
"Development"
|
|
|
|
"IDE"
|
|
|
|
];
|
|
|
|
mimeTypes = [
|
|
|
|
"text/x-octave"
|
|
|
|
"text/x-matlab"
|
|
|
|
];
|
|
|
|
keywords = [
|
|
|
|
"science"
|
|
|
|
"math"
|
|
|
|
"matrix"
|
|
|
|
"numerical computation"
|
|
|
|
"plotting"
|
|
|
|
];
|
|
|
|
};
|
|
|
|
|
|
|
|
# Produce acessible executables to "f", e.g. "matlab" or "mex"
|
|
|
|
matlab-run = f: pkgs.buildFHSUserEnv {
|
|
|
|
name = f;
|
|
|
|
targetPkgs = nix-matlab.targetPkgs;
|
|
|
|
# If making MATLAB available, create Application Icon etc.
|
|
|
|
extraInstallCommands = pkgs.lib.strings.optionalString (f == "matlab") ''
|
|
|
|
install -Dm644 ${desktopItem}/share/applications/matlab.desktop $out/share/applications/matlab.desktop
|
|
|
|
substituteInPlace $out/share/applications/matlab.desktop \
|
|
|
|
--replace "@out@" ${placeholder "out"}
|
|
|
|
install -Dm644 ${nix-matlab}/icons/hicolor/256x256/matlab.png $out/share/icons/hicolor/256x256/matlab.png
|
|
|
|
install -Dm644 ${nix-matlab}/icons/hicolor/512x512/matlab.png $out/share/icons/hicolor/512x512/matlab.png
|
|
|
|
install -Dm644 ${nix-matlab}/icons/hicolor/64x64/matlab.png $out/share/icons/hicolor/64x64/matlab.png
|
|
|
|
'';
|
|
|
|
runScript = pkgs.writeScript "matlab-run-${f}-script" ''
|
|
|
|
export QT_QPA_PLATFORM=xcb
|
2024-07-18 19:07:48 -04:00
|
|
|
"$MATLAB_INSTALL_DIR/bin/${f}" "$@"
|
2024-02-07 13:59:38 -05:00
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
in {
|
|
|
|
environment.sessionVariables = {
|
|
|
|
inherit MATLAB_INSTALL_DIR;
|
|
|
|
};
|
2024-02-07 17:20:01 -05:00
|
|
|
nixpkgs.overlays = [
|
|
|
|
(final: prev: {
|
|
|
|
inherit matlab-update-script;
|
|
|
|
matlab = (matlab-run "matlab");
|
|
|
|
matlab-mex = (matlab-run "mex");
|
|
|
|
})
|
|
|
|
];
|
|
|
|
environment.systemPackages =(with pkgs; [
|
2024-02-07 13:59:38 -05:00
|
|
|
matlab-update-script
|
2024-02-07 17:20:01 -05:00
|
|
|
matlab
|
2024-07-18 19:07:48 -04:00
|
|
|
matlab-env
|
2024-02-07 17:20:01 -05:00
|
|
|
matlab-mex
|
2023-09-26 11:44:11 -04:00
|
|
|
octaveFull
|
|
|
|
]);
|
2023-07-28 10:02:26 -04:00
|
|
|
}
|