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