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