#28 macOSでのビルドの難しさをHomebrewはどう吸収しているか
1 hr 4 min
Homebrewは、macOSでUnix系ソフトウェアのビルドとインストールを管理するパッケージマネージャーです。今回はcatatsuyが、macOSでソフトウェアをコンパイルするときの難しさと、Homebrewがそれをどう吸収しているかを紹介します。macOSは標準のCコンパイラがClangで、ヘッダーやライブラリの配置もLinuxとは異なります。そのため、`./configure`、`make`、`make install`がそのまま通らないことがあります。Homebrewは、ソフトウェアのビルド手順や依存関係をRubyのFormulaで定義し、必要に応じてソースからビルドできる仕組みです。上流がビルド済みバイナリを配布している場合との違いも紹介します。catatsuyの実体験として、M1 MacでLibreSSLをnginxと一緒にビルドできなかった件を紹介します。原因は、LibreSSLに含まれる`config.guess`と`config.sub`が古く、Apple Siliconを判定できなかったことでした。大元のプロジェクトから新しい版を取り込むPRを送り、マージされています。Homebrewは2009年に登場し、現在はLinuxでも動作します。RubyのDSLを使う理由や、Homebrew自身が利用するPortable Rubyについて話します。System Integrity Protection(SIP)などmacOS特有の事情にも触れます。Apple Siliconでは`/opt/homebrew`、Intel Macでは`/usr/local`を標準のプレフィックスとすることで、Rosetta 2環境との共存を可能にしています。Cellarのディレクトリ構造や、シンボリックリンクを管理する`brew link`も紹介します。Formulaでは`depends_on`で依存関係を指定できます。また、`brew tap`を使うことで、公式以外のリポジトリからもFormulaを導入できます。Formulaは単なる設定ファイルではなくRubyのコードであるため、信頼できるリポジトリを選ぶことが重要です。catatsuyはHTTP/3に対応させて独自にビルドしているcurlを、自分のtapで管理しています。後半では、Homebrewがビルド済みバイナリを配布するBottlesの仕組みを紹介します。続いて、catatsuyが開発しているkekkaiが、本人の知らないうちに第三者によって公式のhomebrew-coreに登録されていた話をします。その流れで、作者本人と第三者とで異なる登録基準や、GitHubのstars、forks、watchersの閾値についても話します。最後はセキュリティの話です。Homebrewは、公式リポジトリのレビューやチェックサムの検証、Bottlesなどによって安全性を高めています。一方で、これらの仕組...