nix による Common Lisp パッケージインストール

Common Lisp開発環境をnixによって整えたい

Common Lisp本体のインストールは当然のこととして、 パッケージインストールは quicklisp で管理するよりもnixで管理するほうが後の手間が少くなり、楽になる。nixは管理が楽できるので、みんな使っている。

nix-shellのセットアップ

  • nixosはインストールしてあるものとする。
  • Common Lispはsbclを例として挙げる。
  • quicklispはインストールする必要なし。

空のdirectoryに次の shell.nix を作成

let
  nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-24.05";
  pkgs = import nixpkgs { config = {}; overlays = []; };
  sbcl' = pkgs.sbcl.withPackages (ps: [ ps.alexandria]);
in
pkgs.mkShell {
  packages = [
    sbcl'
  ];
}

コマンドラインで nix-shell を実行する。

$ nix-shell
this derivation will be built:
  /nix/store/7g83mnnznf395z1sx8gsphr8y0apwzb1-sbcl-sbcl-with-packages.drv
building '/nix/store/7g83mnnznf395z1sx8gsphr8y0apwzb1-sbcl-sbcl-with-packages.drv'...
Running phase: patchPhase
Running phase: updateAutotoolsGnuConfigScriptsPhase
Running phase: configurePhase
no configure script, doing nothing
Running phase: buildPhase
no Makefile or custom buildPhase, doing nothing
Running phase: installPhase
mkdir: created directory '/nix/store/2z9xfm1zbivrpmbnkh98c8dxakcdnk70-sbcl-sbcl-with-packages'
mkdir: created directory '/nix/store/2z9xfm1zbivrpmbnkh98c8dxakcdnk70-sbcl-sbcl-with-packages/bin'
Running phase: fixupPhase
shrinking RPATHs of ELF executables and libraries in /nix/store/2z9xfm1zbivrpmbnkh98c8dxakcdnk70-sbcl-sbcl-with-packages
shrinking /nix/store/2z9xfm1zbivrpmbnkh98c8dxakcdnk70-sbcl-sbcl-with-packages/bin/sbcl
checking for references to /build/ in /nix/store/2z9xfm1zbivrpmbnkh98c8dxakcdnk70-sbcl-sbcl-with-packages...

上記が終れば、sbclのreplで以下のようにloadする。

* (load (sb-ext:posix-getenv "ASDF"))
* (asdf:load-system 'alexandria)

ライブラリに依存するパッケージの設定

ライブラリに依存するパッケージをインストールする場合は shell.nix を以下のように設定する。環境変数 LD_LIBRARY_PATH をきちんと設定するとうまいくいく。

let
  nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-24.05";
  pkgs = import nixpkgs { config = {}; overlays = []; };
  sbcl' = pkgs.sbcl.withPackages (ps: [ ps.clog ps.clack ]);
in
pkgs.mkShell {
  packages = [
    sbcl'
    pkgs.openssl
    pkgs.sqlite
  ];

  shellHook = ''
    export LD_LIBRARY_PATH=${pkgs.lib.makeLibraryPath([ pkgs.openssl pkgs.sqlite ])}
  '';
}

テスト機材

Raspberry Pi 4にnixosをインストールしたものでテストしている。

Linux rpi4 6.1.21 #1-NixOS SMP Tue Jan  1 00:00:00 UTC 1980 aarch64 GNU/Linux