処理系固有のツールを避けたい＆Guixインストール

# 処理系固有のツールを避けたい＆Guixインストール

## 処理系と密接に関わるツールについて

Common Lispを始めようとしたとき、ASDF、Quicklisp、Roswell、Qlotなどいくつかの便利なツールを確認しました。が、結局ASDFは使う形にし、Quicklispはパッケージのダウンロードにのみ利用する形で、RoswellとQlotは入れていません。

本来であればQuicklispもあまり使いたくはありません。言語固有の環境ではなく、OS標準のパッケージマネージャーで管理できればそれが最良の方法です。ツールのレイヤーが増えれば、それだけ何らかの問題が発生しやすくなります。最初は一見簡単に見えても、複雑さは後ほどより大きな代償を支払うことになると思っています。3年前に書いたgulpのスクリプトが動作しなくて書き直さないといけなくなったときには悲しくなりました。

ですが、Ubuntu、Debian等で使用されているDebianパッケージ管理システムは、言語毎に固有に用意されたツールと比較しそれほど柔軟性がありませんし、パッケージを作ってもとなりの人がCentOS大好きな人だと困ります。そこで、GNU/Linux上で動作するGuixと呼ばれる次世代パッケージ管理システムを試してみました。このパッケージ管理システムをネイティブで採用した同じ名前のディストリビューションもありますが、今回はパッケージ管理システムのみを既存のDebian上にインストールしました。

## Guixのインストール

ロールバック可能、同じパッケージのバージョン違いを同時に入れられるという説明のある[GNU Guix](https://guix.gnu.org/)を導入し、試しにECLのインストールなどを行ってみます。

GNU Guix Download (https://guix.gnu.org/download/)

### ダウンロードとファイルの設置

```bash
# cd /tmp
# wget https://ftp.gnu.org/gnu/guix/guix-binary-1.0.1.x86_64-linux.tar.xz
# tar -xf guix-binary-1.0.1.x86_64-linux.tar.xz
# mv var/guix /var/
# mv gnu /
# rm guix-binary-1.0.1.x86_64-linux.tar.xz
```

### ROOT用設定

```bash
# mkdir -p ~root/.config/guix
# ln -sf /var/guix/profiles/per-user/root/current-guix ~root/.config/guix/current
# GUIX_PROFILE="`echo ~root`/.config/guix/current"; source $GUIX_PROFILE/etc/profile
```

### GUIXビルド環境セットアップ

```bash
# groupadd --system guixbuild
# for i in `seq -w 1 10`; do useradd -g guixbuild -G guixbuild -d /var/empty -s `which nologin` -c "Guix build user $i" --system guixbuilder$i; done
```

### Daemon設定とブート時の自動起動

```bash
# cp ~root/.config/guix/current/lib/systemd/system/guix-daemon.service /etc/systemd/system/
# systemctl start guix-daemon && systemctl enable guix-daemon
```

### 一般ユーザーで実行可能にする

```bash
# mkdir -p /usr/local/bin
# cd /usr/local/bin
# ln -s /var/guix/profiles/per-user/root/current-guix/bin/guix
# mkdir -p /usr/local/share/info
# cd /usr/local/share/info/
# for i in /var/guix/profiles/per-user/root/current-guix/share/info/* ; do ln -s $i ; done
```

### ロケールパッケージの導入

このままだとGUIX実行時、以下のようにwarningが発生してしまいます。書かれている通りに、ロケールのパッケージを導入しパスを通します。

```bash
guile: warning: failed to install locale
hint: Consider installing the `glibc-utf8-locales' or `glibc-locales' package
and defining `GUIX_LOCPATH', along these lines:

     guix package -i glibc-utf8-locales
     export GUIX_LOCPATH="$HOME/.guix-profile/lib/locale"

See the "Application Setup" section in the manual, for more info.

guix (GNU Guix) 40bea7f9b26644f45c2832026b69ceaee033923f
Copyright (C) 2020 the Guix authors
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

```

```bash
$ guix package -i glibc-locales
...
The following environment variable definitions may be needed:
   export PATH="/home/username/.guix-profile/bin${PATH:+:}$PATH"
```

インストールが完了すると、PATHの追加を促されるので、先ほどのGUIX_LOCPATH環境変数も併せて次のように.bashrcに記述します。また、GUIX_PROFILE環境変数を設定しておきます。GUIX_LOCPATHについては、rootユーザーと一般ユーザー双方で設定が必要です。


```.bashrc:bash
export GUIX_LOCPATH="$HOME/.guix-profile/lib/locale"
export GUIX_PROFILE="/home/username/.guix-profile"
. $GUIX_PROFILE/etc/profile
export PATH="/home/username/.config/guix/current/bin${PATH:+:}$PATH"
```

最後に環境変数を現在のシェルで有効化します。

```bash
$ source ~/.bashrc
```

## 試しにパッケージのインストール(ECLなど)

ECLとECL周りを使うために以下のコマンドでパッケージを導入します。readlineはecl-readline用にとりあえず入れています。

```bash
$ guix install ecl gcc-toolchain make readline
```

```bash
$ which ecl
/home/username/.guix-profile/bin/ecl
```

## インストールしたECLの起動

問題なく起動することを確認。

```bash
$ ecl
ECL (Embeddable Common-Lisp) 16.1.3 (git:UNKNOWN)
Copyright (C) 1984 Taiichi Yuasa and Masami Hagiya
Copyright (C) 1993 Giuseppe Attardi
Copyright (C) 2000 Juan J. Garcia-Ripoll
Copyright (C) 2016 Daniel Kochmanski
ECL is free software, and you are welcome to redistribute it
under certain conditions; see file 'Copyright' for details.
Type :h for Help.  
Top level in: #<process TOP-LEVEL>.
> 
```