Skip to content
Artwork for 八百万のOSS
八百万のOSS · Yesterday · 1 hr 4 min

#28 macOSでのビルドの難しさをHomebrewはどう吸収しているか

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などによって安全性を高めています。一方で、これらの仕組みだけでソフトウェア自体の安全性まで保証できるわけではありません。特に第三者のtapや、ソースからのビルドで実行されるコードには注意が必要です。Homebrewが提供する安全対策と、それでも利用者が判断しなければならない部分について考えます。Homebrewが裏側で何をしているのかを知り、macOSでの開発環境をもう一歩理解したい人に聞いてほしい回です。 - Homebrew — https://brew.sh/ - Homebrew/brew — https://github.com/homebrew/brew - kekkai(catatsuy) — https://github.com/catatsuy/kekkai - LibreSSLへのPR #800 — https://github.com/libressl/portable/pull/800 - kekkaiのHomebrew Formula — https://formulae.brew.sh/formula/kekkai - Homebrew Documentation — https://docs.brew.sh/ - Formula Cookbook — https://docs.brew.sh/Formula-Cookbook - Taps (Third-Party Repositories) — https://docs.brew.sh/Taps - Bottles (Binary Packages) — https://docs.brew.sh/Bottles - Package Acceptance Policy — https://docs.brew.sh/Package-Acceptance-Policy - Homebrew FAQ — https://docs.brew.sh/FAQ - Homebrew Installation — https://docs.brew.sh/Installation - Homebrew Portable Ruby — https://github.com/Homebrew/homebrew-portable-ruby/blob/main/README.md - Homebrew Security and Supply Chain — https://docs.brew.sh/Homebrew-Security-and-Supply-Chain - Tap Trust — https://docs.brew.sh/Tap-Trust ───────────── YouTube: https://youtu.be/WAGiuM_5-CM Web: https://yaoyorozu-oss.henteko07.com/ X: https://x.com/yaoyorozu_oss

0:00-1:04:41

transcript

No transcript — this publisher did not publish one.

show notes

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などによって安全性を高めています。一方で、これらの仕組みだけでソフトウェア自体の安全性まで保証できるわけではありません。特に第三者のtapや、ソースからのビルドで実行されるコードには注意が必要です。Homebrewが提供する安全対策と、それでも利用者が判断しなければならない部分について考えます。Homebrewが裏側で何をしているのかを知り、macOSでの開発環境をもう一歩理解したい人に聞いてほしい回です。


- Homebrew — https://brew.sh/

- Homebrew/brew — https://github.com/homebrew/brew

- kekkai(catatsuy) — https://github.com/catatsuy/kekkai

- LibreSSLへのPR #800 — https://github.com/libressl/portable/pull/800

- kekkaiのHomebrew Formula — https://formulae.brew.sh/formula/kekkai

- Homebrew Documentation — https://docs.brew.sh/

- Formula Cookbook — https://docs.brew.sh/Formula-Cookbook

- Taps (Third-Party Repositories) — https://docs.brew.sh/Taps

- Bottles (Binary Packages) — https://docs.brew.sh/Bottles

- Package Acceptance Policy — https://docs.brew.sh/Package-Acceptance-Policy

- Homebrew FAQ — https://docs.brew.sh/FAQ

- Homebrew Installation — https://docs.brew.sh/Installation

- Homebrew Portable Ruby — https://github.com/Homebrew/homebrew-portable-ruby/blob/main/README.md

- Homebrew Security and Supply Chain — https://docs.brew.sh/Homebrew-Security-and-Supply-Chain

- Tap Trust — https://docs.brew.sh/Tap-Trust


─────────────

YouTube: https://youtu.be/WAGiuM_5-CM

Web: https://yaoyorozu-oss.henteko07.com/

X: https://x.com/yaoyorozu_oss

links15