syspkg開発メモ

2023年2月10日 初稿

  1. パッケージをビルドする
  2. パッケージインストール時にルートディレクトリを変更する
  3. 一度ビルドしたあとでもregpkgなどへの変更をビルドに反映させる

パッケージをビルドする

はじめにbuild.shdistributionまでビルドしておきます。

例:

./build.sh -u -m amd64 \
-D /opt/builds/trunk/amd64/102-dest \
-M /opt/builds/trunk/amd64/102-obj \
-R /opt/builds/trunk/amd64/102-release \
-T /opt/builds/trunk/amd64/102-tools \
-X /usr/xsrc -x -N0 -j6 syspkgs

デフォルトではNetBSDのベースシステムのセット(baseやcomp、etcなど)すべてのパッケージがビルドされます。開発中の場合だとこの設定は時間がかかり煩わしいだけです。そこでビルドするパッケージのセットをSYSPKGSETS変数から指定することで時間短縮が可能です。

たとえばbaseセットのパッケージのみをビルドする場合、build.sh-Vオプションを使ってコマンドラインから変数定義します。

./build.sh -u -m amd64 \
...
-V SYSPKGSETS=base syspkgs

パッケージインストール時にルートディレクトリを変更する

pkg_addコマンドでパッケージをインストールするとき、なにもオプションを付けずにこのコマンドを実行してしまうと/以下のファイルやディレクトリが上書きされたり削除される可能性があります。

インストール先のルートディレクトリを/から変更するにはpkg_add

-p

オプションを使います。またシステムデフォルトのパッケージデータベースを汚さないために-Kオプションでsyspkg用のデータベースを別途渡すといいでしょう。

pkg_add -p ./pkgtest -K ./pkgtest/usr/pkg/pkgdb base-sys-root-9.99.96.0.20220429.tgz

一度ビルドしたあとでもregpkgなどへの変更をビルドに反映させる

現在build.sh syspkgsを実行したあとdistrib/sets以下のsyspkgビルド用スクリプトを更新し再度パッケージビルドをしてもその変更はパッケージの中身には反映されません。おそらく古いキャッシュかなにかを参照したままなのだと思われます。

build.sh syspkgsの処理では、Makefileから最終的にdistrib/sets/regpkgsetというスクリプトが実行されパッケージが作成されます。ここで、このスクリプトの引数に-fを渡してあげるとビルドスクリプトへの変更が反映されるようになります。

distrib/sets/Makefileでは変数REGPKG.forceを参照してこの-fオプションをつけるか否かを処理しているようです。ただしbuild.sh -V REGPKG.force=-fのようにしてもエラーになるだけですのでMakefileを直接編集して変えてしまったほうがいっそ楽です。

ここではregpkgset-fオプションを渡すようにし、キャッシュを使わないよう-cオプションを削除しています。

--- a/distrib/sets/Makefile     Tue Feb 07 14:27:59 2023 +0000
+++ b/distrib/sets/Makefile     Fri Feb 10 22:28:44 2023 +0900
@@ -286,8 +286,8 @@
 .else  # MAKEVERBOSE >= 2
 REGPKG.verbose?= -v
 .endif
-REGPKG.force?=         # -f, or empty
-REGPKG.cache?= -c      # -c, or empty
+REGPKG.force?= -f              # -f, or empty
+REGPKG.cache?= # -c, or empty
 REGPKG.update:= ${MKUPDATE:tl:Nno:C/..*/-u/}
 SYSPKGSETS?= all
 makesyspkgs: .PHONY check_DESTDIR check_RELEASEDIR \