2023年3月28日火曜日

FreeBSD で Python のデフォルトバージョンを変えたら py-gobject3 がうまくアップデートできなかった話

 久々に書き込んでいる気がする…。
 今回は FreeBSD で Python のデフォルトバージョンを変えた時のトラブルの話を書こう。

 何をしたかと言うと,FreeBSD 上のアプリケーションとしていろいろあるのだが,Python もインストールされている。 Python は Python 自体を使いたいというよりは,他のアプリケーションとの依存関係で勝手にインストールされる。 ついこの間まで,なぜかうちの FreeBSD の python の default version は 3.8 に指定してあった。 もう 3.11 が出てるのにね。でも,まぁ,現時点では 3.9 がまだ FreeBSD 上でのデフォルトとなってるから,そこまでひどくはないと思うけど…。 ちなみに default version が 3.8 から 3.9 になったのは 2022/6/26 なんだけどね (現在は 2023/3 末)。

 なぜ急に default version をあげようと思ったかというと,ふと /usr/ports/UPDATING で python で検索したら,2022/6/26 に python の default version を 3.8 から 3.9 にした,と書いてあったから。 そこで,その 2022/6/26 の記載に従って処理をしてみた。
概略は,

(1) /etc/make.conf で python のデフォルトを指定してあったのをコメントアウトした。
(2) root 権限で以下を実行した。
  # portmaster -o lang/python39 python38
  # REINSTALL="$(pkg info -o "*py38*" | awk '{printf "%s ", $2}')"
  # pkg delete -f "*py38*"
  # portmaster $REINSTALL
  # REBUILD=$(pkg query -g "%n:%dn" '*' | grep py3 | grep -v py39 | cut -d : -f 1 | sort -u)
  # portmaster $REBUILD
  # REBUILD2=$(pkg list | grep python-38 | xargs pkg which | awk '{print $6}' | sort -u)
  # portmaster $REBUILD2
(3) 最後に "pkg remove python38" を実行して,/usr/local/lib/python3.8/ ディレクトリになにか残ってたら手動で消す。
というもの。

 で,エラーが起こったのは(まぁ,当然といえば当然だが)(2) の実行時。その中でも「portmaster $REINSTALL」ってのを実行中にエラーがでた。 これは,直前で python 3.8 で作られたアプリケーションを消し,それらを python 3.9 で(デフォルトで)作り直す,というコマンド。 それが最後まで実行されなかった。見ると途中に「ERROR」という文字が見える。 portmaster というコマンドは,複数のアプリケーションのアップデートを順にやってくれるが,どれかのアップデートでエラーが起こると,その先は実行してくれない。 今回見ていると,どうも「/usr/ports/devel/py-gobject3/」というアプリケーションのアップデート時にエラーを吐いていた。 エラーメッセージ(一部)はこんなんやった。
ERROR: Unhandled python OSError. This is probably not a Meson bug, but an issue with your build environment.
WARNING: Running the setup command as `meson [options]` instead of `meson setup [options]` is ambiguous and deprecated.
===>  Script "configure" failed unexpectedly.
Please report the problem to desktop@FreeBSD.org [maintainer] and attach the
"/var/ports/usr/ports/devel/py-gobject3/work-py39/pygobject-3.42.2/_build/meson-logs/meson-log.txt"
including the output of the failure of your make command. Also, it might be
a good idea to provide an overview of all packages installed on your system
(e.g. a /usr/local/sbin/pkg-static info -g -Ea).
*** Error code 1

 見ると,「/usr/ports/devel/py-gobject3/」という文字列が目に入った。つまり「py-gobject3」のアップデートに失敗している。 そこで,とりあえず環境変数「$REINSTALL」の中身を「echo $REINSTALL」として表示させ,py-gobject3 以外を portmaster でアップデートするとうまくいった。 しかし,その後のプロセスで py-gobject3 を使うみたいで再びエラーがでた。

 仕方ないのでネットワークのお世話になり,検索をかけると,https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=238254 というページにたどり着いた。読んでみると,どうも「/usr/ports/devel/gobject-introspection/」をインストールしなおせ,と書いてある。 「pkg info -aI」として調べると,確かに「gobject-introspection-1.76.1,1」がインストールされていた。

 そこで「/usr/ports/devel/gobject-introspection/」(gobject-introspection-1.76.1,1)をインストールし直してから (make install として,重複してるとエラーがでたら make deinstall install clean とした),「py-gobject3」を portmaster でアップデートしたらうまくいった。 何がおかしいのかよくわからないが,時々起こる似たような現象がおこる。何かのサブルーチンが最新になってなかった,ということみたいやけど,それ以上はいいことにしてしまった…。