Open11

MojaveでもまだまだHomebrewしたい!

四ツ山伊吹四ツ山伊吹

ねらい

macOS Mojave(バージョン10.14)において、Homebrewで提供されるpackageを引き続き問題なく〝貯蔵〟し、このコンピュータの延命を図る。

四ツ山伊吹四ツ山伊吹

背景

$ brew doctor によれば、

Warning: You are using macOS 10.14.
We (and Apple) do not provide support for this old version.
It is expected behaviour that some formulae will fail to build in this old version.
It is expected behaviour that Homebrew will be buggy and slow.
Do not create any issues about this on Homebrew's GitHub repositories.
Do not create any issues even if you think this message is unrelated.
Any opened issues will be immediately closed without response.
Do not ask for help from Homebrew or its maintainers on social media.
You may ask for help in Homebrew's discussions but are unlikely to receive a response.
Try to figure out the problem yourself and submit a fix as a pull request.
We will review it but may or may not accept it.

[抄訳]
我々開発チーム(とApple)はこの古いバージョンのOSに関してサポートを提供しない。
formulaのいくつかがビルドに失敗することが予想されるし、Homebrewがバグったり遅くなったりすることもあるだろう。

ということである。実際に手元のHomebrewでは先に挙げた事例が起こっている。

一方でやむを得ない事情のため、今後ともmacOS Mojaveの動くコンピュータでソフトウェア開発を続けなければならないため、Homebrewの利用を止めるというのは現実的ではない。

そういうわけで、どうにかこうにか誤魔化しながらHomebrewと上手くやっていく必要がある。

四ツ山伊吹四ツ山伊吹

Homebrewにおける制約

brew install および brew upgrade の振る舞い

  • ほとんどのパッケージは、公式ではbottleが提供されない。
  • したがって、新規にインストール、または更新するときに、ソースコードからビルドする必要がある。
  • 暗黙的に --build-from-source オプションが適用されるとみていい。

新しいAPI

4.0.0 — Homebrew で取り上げられている新機能

Using JSON files downloaded from formulae.brew.sh for package installation rather than local homebrew/core and homebrew/cask taps.

これは利用できない。暗黙的に HOMEBREW_NO_INSTALL_FROM_API 環境変数が設定されているものとみていい。

CA-cert

システムにインストールされているCA-certが古いことが原因でパッケージのビルドに失敗することがある。これはビルドの過程でcURLが使われているときに起こる。

ビルドエラー

どうやってもビルドできないパッケージが存在する。

四ツ山伊吹四ツ山伊吹
四ツ山伊吹四ツ山伊吹

対策

このエラーは、MojaveのCLTに同梱されているclangコンパイラのバージョンが古いために起こるようである。

あらかじめ新しめのLLVMをインストールしておき、これに含まれているclangコンパイラを代わりに使わせることでこの問題を回避できる。

四ツ山伊吹四ツ山伊吹
$ brew install llvm@15
$ brew upgrade --debug --verbose z3
[...]
BuildError: Failed executing: cmake --build build
1. raise
2. ignore
3. backtrace
4. irb
5. shell
Choose an action: 5
When you exit this shell, you will return to the menu.
bash-3.2$ rm -rf build
bash-3.2$ export PATH="$HOMEBREW_PREFIX/opt/llvm@15/bin:$PATH"
bash-3.2$ CC=clang CXX=clang++ cmake -S . -B build -DZ3_LINK_TIME_OPTIMIZATION=ON -DZ3_INCLUDE_GIT_DESCRIBE=OFF -DZ3_INCLUDE_GIT_HASH=OFF -DZ3_INSTALL_PYTHON_BINDINGS=ON -DZ3_BUILD_EXECUTABLE=ON -DZ3_BUILD_TEST_EXECUTABLES=OFF -DZ3_BUILD_PYTHON_BINDINGS=ON -DZ3_BUILD_DOTNET_BINDINGS=OFF -DZ3_BUILD_JAVA_BINDINGS=OFF -DZ3_USE_LIB_GMP=OFF -DPYTHON_EXECUTABLE=/usr/local/opt/python@3.11/bin/python3.11 -DCMAKE_INSTALL_PYTHON_PKG_DIR=lib/python3.11/site-packages -DCMAKE_INSTALL_PREFIX=/usr/local/Cellar/z3/4.12.2 -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_BUILD_TYPE=Release -DCMAKE_FIND_FRAMEWORK=LAST -DCMAKE_VERBOSE_MAKEFILE=ON -Wno-dev -DBUILD_TESTING=OFF -DCMAKE_OSX_SYSROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk
[...]
bash-3.2$ CC=clang CXX=clang++ cmake --build build
[...]
bash-3.2$ exit
四ツ山伊吹四ツ山伊吹
四ツ山伊吹四ツ山伊吹

brew upgrade している時、

[...]
Error: Failure while executing; `/usr/bin/env tar --extract --no-same-owner --file $HOME/Library/Caches/Homebrew/downloads/592c007136b235b78c9fa8eafda449719cdea58e2a4afe18b9a445cd0050ba1b--doxygen-1.9.7.src.tar.gz --directory $HOMEBREW_TEMP/d20230524-37492-h4ujq9` exited with 1. Here's the output:
tar: Ignoring malformed pax extended attribute
tar: Ignoring malformed pax extended attribute
tar: Error exit delayed from previous errors.

となって失敗する。

四ツ山伊吹四ツ山伊吹

原因と対策

これは、macOS Mojaveに同梱されているTarユーティリティ (/usr/bin/tar) のバージョンが古いため発生する[1]。なおこの /usr/bin/tar/usr/bin/bsdtar へのシンボリックリンクとなっている。

$ /usr/bin/tar --version
bsdtar 2.8.3 - libarchive 2.8.3

$ ls -l /usr/bin/{bsd,}tar
-rwxr-xr-x  1 root  wheel  71040 May  4  2019 /usr/bin/bsdtar
lrwxr-xr-x  1 root  wheel      6 Jan  1  2019 /usr/bin/tar -> bsdtar

次の手順に従って解決できる:

  1. Homebrewから libarchive パッケージをインストール
  2. Homebrewリポジトリの Library/Homebrew/unpack_strategy/tar.rb を書き換える。
脚注
  1. cf. https://github.com/koekeishiya/yabai/issues/1216 ↩︎

四ツ山伊吹四ツ山伊吹
Library/Homebrew/unpack_strategy/tar.rb
diff --git a/Library/Homebrew/unpack_strategy/tar.rb b/Library/Homebrew/unpack_strategy/tar.rb
index 0290a02dd..1a968acfe 100644
--- a/Library/Homebrew/unpack_strategy/tar.rb
+++ b/Library/Homebrew/unpack_strategy/tar.rb
@@ -44,7 +44,7 @@ module UnpackStrategy
           path
         end
 
-        system_command! "tar",
+        system_command! "/usr/local/opt/libarchive/bin/tar",
                         args:    ["--extract", "--no-same-owner",
                                   "--file", tar_path,
                                   "--directory", unpack_dir],