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が使われているときに起こる。
ビルドエラー
どうやってもビルドできないパッケージが存在する。
z3
パッケージ
事例1: ==> Upgrading 1 outdated package:
z3 4.12.1 -> 4.12.2
にて発生。
brew upgrade
している時、
[...]
==> cmake --build build
[...]
の過程でエラーが発生する
対策
このエラーは、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
doxygen
パッケージ
事例2: ==> Upgrading 1 outdated package:
doxygen 1.9.6 -> 1.9.7
にて発生。
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
次の手順に従って解決できる:
- Homebrewから
libarchive
パッケージをインストール - Homebrewリポジトリの
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],