Install Matlab using Nix imperatively
Find a file
2023-08-06 15:01:05 +00:00
icons/hicolor Add icons and a desktop item 2021-05-15 11:30:34 +03:00
.gitignore Introduce a flake, modern setup 2021-05-14 17:27:40 +03:00
.gitlab-ci.yml First trial in a nix flake update CI 2021-09-07 21:47:28 +03:00
common.nix Add libcrypt.so.1 2023-02-20 10:12:00 +02:00
default.nix Introduce a flake, modern setup 2021-05-14 17:27:40 +03:00
flake.lock [skip ci] Automatic nix flake update by CI 2023-08-06 15:01:05 +00:00
flake.nix Add support to add packages to targetPkgs in dependent flakes 2023-07-25 11:43:00 +03:00
install.adoc Small changes to how the matlab shell prints the banner 2021-05-15 16:45:33 +03:00
python-no_arch.txt-file.patch Add python matlab engine support 2022-03-07 14:18:58 +02:00
README.adoc Add support to add packages to targetPkgs in dependent flakes 2023-07-25 11:43:00 +03:00
shell.nix Add shell.nix I forgot to commit 2021-05-15 16:37:19 +03:00

= Matlab for Nix users
:source-highlighter: rouge

This repo is a collection of files that should help Nix and NixOS users install Matlab imperatively.

== Install

Like any other Matlab user, you should first go to your Matlab account on
Mathworks' website, at: https://www.mathworks.com/mwaccount/ and download the
installation zip file. Extract the zip file and note the `install` executable
you just extracted. To run that file, you'll need to get into a FHS environment
that a nix-shell will provide.

=== Run `matlab-shell` with an unstable Nix

....
nix run gitlab:doronbehar/nix-matlab#matlab-shell
....

=== Run `matlab-shell` with +++<s>stable</s>+++ legacy Nix

....
git clone https://gitlab.com/doronbehar/nix-matlab
cd nix-matlab
nix-shell
....

=== Installation of Matlab itself

From inside the FHS shell, follow the following steps:

include::./install.adoc[]

IMPORTANT: Due to a not fully understood issue in Matlab, you might experience
difficulty openning text files in Matlab's editor. The symptoms are described
https://www.mathworks.com/matlabcentral/answers/1815470-matlab-live-editor-unable-to-open-this-file-in-the-current-system-configuration[here],
along with the
https://www.mathworks.com/matlabcentral/answers/1815470-matlab-live-editor-unable-to-open-this-file-in-the-current-system-configuration#answer_1079558[solution].

=== Adding `matlab` executables to your system

With what was done now, you run Matlab from the command line with:

....
# Legacy nix users (inside a clone of this repo)
$(nix-build)/bin/matlab
# Flake nix users (without cloning)
nix run gitlab:doronbehar/nix-matlab
....

But it's likely you'd like to make Matlab's FHS environment survive garbage
collections and add a desktop launcher to your system. To do that you can
follow one of the following paths according to your setup.

==== For NixOS users with a flakes setup

[source,nix]
----
inputs = {
  # ...
  nix-matlab = {
    # Recommended if you also override the default nixpkgs flake, common among
    # nixos-unstable users:
    #inputs.nixpkgs.follows = "nixpkgs";
    url = "gitlab:doronbehar/nix-matlab";
  };
  # ...
  outputs = { self, nixpkgs, nix-matlab }:
  let
    flake-overlays = [
      nix-matlab.overlay
    ];
  in {
    nixosConfigurations = (
      HOSTNAME = nixpkgs.lib.nixosSystem {
        modules = [ (import ./configuration.nix flake-overlays) ]
      };
    };
  };
};
----

And in `./configuration.nix`:


[source,nix]
----

# All overlays given by flakes
flake-overlays:

{ config, pkgs, options, lib, ... }:
{
  nixpkgs.overlays = [
    (
      final: prev: {
        # Your own overlays...
      }
    )
  ] ++ flake-overlays;
}
----

Example evaluated
https://gitlab.com/doronbehar/nixos-configs/-/blob/e28b5aaf86f21202a2b7daa05b098ee5ed85de6f/flake.nix#L5-16[here]
and
https://gitlab.com/doronbehar/nixos-configs/-/blob/e28b5aaf86f21202a2b7daa05b098ee5ed85de6f/configuration.nix#L74[here].

==== For NixOS users without a flakes setup

The following setup should also fit flake NixOS users.

Add to your `configration.nix` (untested, but should work):

[source,nix]
----
  nixpkgs.overlays = let
    nix-matlab = import (builtins.fetchTarball "https://gitlab.com/doronbehar/nix-matlab/-/archive/master/nix-matlab-master.tar.gz");
  in [
    nix-matlab.overlay
    (
      final: prev: {
        # Your own overlays...
      }
    )
  ];
----

==== Home Manager setup

TODO

==== Usage in Other Flakes / `shell.nix`

Some people may wish to not install matlab globally, and only making it part of
the `buildInputs` of their project. Usually this paradigm follows along with
https://direnv.net/[`direnv`]
+ https://nixos.wiki/wiki/Development_environment_with_nix-shell#Using_Direnv[`shell.nix`]
/ https://nixos.wiki/wiki/Flakes#Direnv_integration[`flake.nix`] setup. For
example you can create in your project a `shell.nix`, or define `devShell` in
your `flake.nix` similarly to this: 

[source,nix]
----
{ pkgs, nix-matlab }:

pkgs.mkShell {
  buildInputs = (with nix-matlab.packages.x86_64-linux; [
    matlab
    matlab-mlint
    matlab-mex
  ]);
  # Define C include path env vars for c development
  shellHook = nix-matlab.shellHooksCommon;
}
----

Note that Matlab still needs to be installed in a user-writeable location for
this `shellHook` to work, as explained xref:#user-content-install[here].

==== Adding packages to matlab's environment

Another non-trivial example usage of this flake, somewhat similar to the above,
is to create a matlab development environment that includes external tools that
you want to run from within matlab. The following `flake.nix` uses nix-matlab
as an input flake and adds lammps package to the FHS environment. With this
flake, you can run `nix develop` and run `system('lmp')` from within matlab's
CLI:

[source,nix]
----
{
  description = "Matlab fhs environment with lammps included, uses gitlab:doronbehar/nix-matlab";

  inputs = {
    # https://gitlab.com/doronbehar/nix-matlab
    nix-matlab = {
      url = "gitlab:doronbehar/nix-matlab";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    nixpkgs = {
      url = "github:nixos/nixpkgs/nixos-unstable";
    };
  };

  outputs = { self
  , nixpkgs
  , nix-matlab
  }: let
    pkgs = import nixpkgs {
      system = "x86_64-linux";
    };
  in {
    packages.x86_64-linux = {
      matlab-lammps = pkgs.buildFHSUserEnv {
        name = "matlab-lammps";
        targetPkgs = ps: (nix-matlab.targetPkgs ps ++ [
          pkgs.lammps
        ]);
        runScript = pkgs.writeScript "matlab-lammps" (nix-matlab.shellHooksCommon + ''
          exec $MATLAB_INSTALL_DIR/bin/matlab "$@"
        '');
        meta = {
          description = "MATLAB with lammps included in FHS environment";
        };
      };
      matlab-lammps-shell = pkgs.buildFHSUserEnv {
        name = "matlab-lammps-shell";
        targetPkgs = ps: (nix-matlab.targetPkgs ps ++ [
          pkgs.lammps
        ]);
        runScript = pkgs.writeScript "matlab-lammps" (nix-matlab.shellHooksCommon + ''
          echo matlab is installed in $MATLAB_INSTALL_DIR/bin/matlab
          exec bash
        '');
        meta = {
          description = "MATLAB shell with lammps included in FHS environment";
        };
      };
    };
    devShell.x86_64-linux = pkgs.mkShell {
      buildInputs = [
        self.packages.x86_64-linux.matlab-lammps-shell
      ];
      # From some reason using the attribute matlab-shell directly as the
      # devShell doesn't make it run like that by default.
      shellHook = ''
        exec matlab-lammps-shell
      '';
    };
  };
}
----

== FAQ

=== Matlab says that my license was installed for a different Host ID, why does it happen?

I haven't had reports of this issue by users of this repo, but I experience it
myself sometimes, and I think it's a good thing to include in this README. I
use Gnome with NetworkManager on my laptop, and rarely I use USB tethering with
my Android. From some reason while I'm tethered, I get the following error when
I launch matlab from the command line:

----
The hostid of your computer ("000000000000 111111111111") does not match the hostid of the license
file (XXXXXXXXXXXX).
----

I get this error although I set in my `/etc/nixos/configuration.nix`:

[source,nix]
----
networking.hostId = "6b216943" # fake id
----

As explained in the https://www.mathworks.com/support/lme/R2021a/9[link in the
full error message], I can reactivate the license and not go again through the
whole installation procedure. But I will be required to reactivate the license
again afterwards when I switch again to WiFi internet connection. It's somewhat
annoying, and I haven't found a solution / explanation why does my host id
changes when I switch to a wired connection.

== Previous work / Credits

Core parts of this repo are based on
https://github.com/tviti/nix-cfg/tree/e6531426e86273e450c6133a0deae9008411fffd/pkgs/matlab[@tviti's
work]. My part was making it a bit more accessible for modern Nix flake setup,
and making the shell and steps a bit more approachable.

The idea for a `shellHooksCommon` was by
https://gitlab.com/DavidRConnell[@DavidRConnell], first discussed in
https://gitlab.com/doronbehar/nix-matlab/-/merge_requests/1#note_631741222[!1].