LoginSignup
4
1

More than 3 years have passed since last update.

GNU Guixのパッケージモジュール作成について

Last updated at Posted at 2020-03-02

GNU Guixのパッケージモジュール作成について

はじめに

の続きです。
チャネル作成時、前回の投稿ではGITリポジトリにpushしないと動作を確認できませんでした。前回の投稿+αの情報を付け加えつつ、ローカルでチャネルの登録・動作確認を行う方法をまとめます。パッケージ定義自体の作成方法、チャネル登録方法は前回の投稿を参照してください。

Guixのパッケージモジュールの定義

GNU Guixのデフォルトチャネルでは、gnu packages xxxxxというパッケージモジュール(名前空間)で各種パッケージが定義されています。この実体は、Guixパッケージのリポジトリ (https://git.savannah.gnu.org/git/guix.git) をCloneしてくることで実際に確認できます。例えば、Common Lisp関連のパッケージは、Cloneしてきたリポジトリのデータ内の、gnu/packages/lisp-xyz.scmというファイルで定義されています。

lisp-xyz.scmの一番最初のコードを見ると、次のようにdefine-moduleというオペレーターが使用されています。

lisp-xyz.scm
(define-module (gnu packages lisp-xyz)
;; 省略
)

ディレクトリとモジュール名は対応しており、例えばhoge/piyo/fuga.scmという位置にファイルがある場合は、(define-module (hoge piyo fuga) ...)という形で記述します。

Guixは、デフォルトでgnu packages以下の全てのモジュールを読み込むようになっています。そのため、もし自分独自のパッケージモジュールを読み込む場合は、前回の投稿のようにchannels.scmに登録するか、それ以外にもいくつかの方法が用意されています。

channels.scmでローカルにあるパッケージ定義ファイルを参照

次のようにfile://を使い、リポジトリURLを参照したときと同じような形で(ブランチの指定は省きますが)パスを指定できます。

~/.config/guix/channels.scm
(cons (channel
       (name 'cl-guix)
       (url "file:///home/username/guix-packages"))
      %default-channels)

このようにパスを指定した場合で例えば、(noeu packages common-lisp)というパッケージモジュールを独自に定義する際は、~/guix-packages/noeu/packages/common-lisp.scmというファイルを作成しておく形になります。

channels.scmを記述したら、通常どおりguix pullでチャネル登録情報を更新します。しかし、guix pullはあまり高速ではありません。すぐにパッケージモジュールを登録できる方法がふたつあります。

環境変数GUIX_PACKAGE_PATHによる登録

GUIX_PACKAGE_PATHという環境変数にパッケージモジュールのあるディレクトリまでのパスを指定することで登録できます。noeuからはじまるディレクトリがパッケージモジュールの本体なので、$HOME/guix-packagesまでを指定することに注意します(scmまでのディレクトリパスは指定しない)。

$ export GUIX_PACKAGE_PATH=$HOME/guix-packages

guix package -L による登録

次のように、guix package -Lに登録したいパスを指定することでも対応できます。

$ guix package -L $HOME/guix-packages

登録後のパッケージ検索

次のようにパッケージ定義ファイル内にパッケージを定義しておき、guix package -s package-nameで自分の定義したパッケージが検索結果にきちんと出てくるかを確認します。

環境変数、コマンドによるパッケージモジュールの登録は、guix pullを行わなくても、common-lisp.scmファイルの変更を即座に検出するため、動作確認がしやすくなります。

guix build でパッケージの動作確認

実際に正常にパッケージをインストールできるかどうかを確認する場合は、guix build [package-name]で確認できます。例えばGITリポジトリURLに間違ったものを指定しており取得できない場合、guix buildコマンドを使うと次のようにリポジトリのfetchエラーが発生することを手元で確認できます。

$ guix build my-cl-sdl2
...
Initialized empty Git repository in /gnu/store/9yh6pr445m70lgls9ql3zrnyfgvl37i3-cl-guix-sdl3-1.1.0-1.1588954-checkout/.git/
fatal: could not read Username for 'https://github.com': No such device or address
Failed to do a shallow fetch; retrying a full fetch...
fatal: could not read Username for 'https://github.com': No such device or address
git-fetch: '/gnu/store/zm51w1zv9zchx3n3xjw81zrjnlaswawa-git-minimal-2.25.1/bin/git fetch origin' failed with exit code 128
...

そのパッケージ定義が正常に動作する場合は、次のようなメッセージが最後に表示されます。

successfully built /gnu/store/arkzb2j9mc6qfzvxn12vpp7snb0p9zz5-cl-guix-sdl3-1.1.0-1.1588954.drv
/gnu/store/7036dy6bj6jg1z48pwam1ya61yvv36a8-cl-guix-sdl3-1.1.0-1.1588954

参考

Guix Manual - Defining Packages

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1