macOS でのビルド
前提条件、ビルドスクリプト、生成物、BUILD-INFO について。
前提条件
サポート対象は Apple silicon(arm64)上の macOS 27 以降だけです。アプリのデプロイメントターゲットは macOS 27.0 で、scripts/ は x86_64、Rosetta 経由、macOS 27 より古いホストではビルドを拒否します。universal2 や x86_64 の成果物はありません。
必要なものは次のとおりです。
macOS 27 以降が動作し、Xcode とそのコマンドラインツールが選択された Apple silicon の Mac。
arm64 用の CPython 3.12.14。
初回のビルドでは、バージョンを固定した依存関係をダウンロードします。ビルドしたアプリの実行には、Python、Homebrew、ターミナル、アカウント、ネットワーク接続、依存関係のインストールはいずれも不要です。
packaging/ は、ヘルパーとビルドで使う解決済みのすべてのディストリビューションを、macOS 用 wheel の SHA-256 とともに固定しています。固定バージョンには NumPy 2.5.4、SciPy 1.18.1、Shapely 2.2.0、Trimesh 4.12.2、PyInstaller 6.22.3 が含まれます。ビルドでは arm64 用の wheel だけをインストールし、それらが要求する macOS の最低バージョンはアプリの最低要件である macOS 27 より低くなっています。
Note
wheel をダウンロードできたことやソースのテストが通ったことは、ネイティブアプリが動作することの証明にはなりません。また、universal2 の PyInstaller wheel を使っても、最終的なアプリが universal2 になるわけではありません。
ビルドコマンド
リポジトリのルートで実行します。
python3.12 -m venv .venv
.venv/bin/python -m pip install -r engine/requirements.txt
make PYTHON=.venv/bin/python test-engine test-worker verify-fixtures
.venv/bin/python engine/worker.py --self-test
swift test --package-path app
PYTHON=python3.12 bash scripts/build-macos.shscripts/ は、1 回の実行ですべての作業を行います。
新しいビルド用仮想環境を作成し、固定された wheel のハッシュを検証します。
PyInstaller で実際のワーカーをフリーズします。
ZUDO_WORKER_PYTHONをビルド用 venv に向けて Swift のテストを実行し、実ワーカーテストを必ず実行して合格させます(通常のswift testではスキップされます)。その後、ネイティブ実行ファイルをビルドします。.appを作成し、サードパーティ通知とビルドの来歴情報を生成します。ネストされたアドホック署名を検証します。
再配置したヘルパーのスモークテストを実行します。
Makefile のターゲット build-helper、build-app、package-local はすべてこの同じスクリプトのエイリアスです。そのため、ヘルパーとネイティブアプリは常に一緒に検証されます。
生成物
すべてのステップが通った場合にのみ、スクリプトは一意な名前のディレクトリ build/ を書き出します。中身は次のとおりです。
zudo-stl-fix.appzudo-stl-fix-macos-<actual-architecture>-local.zipアーカイブの
.sha256ファイル
実行のたびに新しいディレクトリが作られるため、以前のビルドの古いライブラリがテスト対象のアプリに紛れ込むことはありません。
Warning
このアーカイブはローカル開発用の生成物です。アドホック署名のみで、公証(notarization)はされておらず、公開リリースでもありません。リリース用のアーカイブは別のスクリプトで作ります。継続的インテグレーションとリリース状況を参照してください。
BUILD-INFO
アプリ内の Contents/ には、ビルド環境が記録されます。macOS、Xcode、SDK のバージョンとパス、Swift、Python、インストール済みのディストリビューション、ソースのコミット、作業ツリーに未コミットの変更があったかどうか、実際のアーキテクチャ、設定されたターゲットです。証跡として生成物と一緒に保管してください。
組み込みヘルパーとスモークテスト
ネイティブ実行ファイルは Contents/ です。ヘルパーは Contents/ から見つけ、PATH やシステムの Python を経由することはありません。
既存のアプリに対してスモークテストを再実行するには、次のようにします。
.venv/bin/python scripts/smoke_bundle.py '/absolute/path/zudo-stl-fix.app'スモークテストは、スペースと日本語を含む一時パスにアプリをコピーし、ネストされた署名を検証し、Mach-O のアーキテクチャスライスを確認し、バンドルとシステムライブラリ以外にあるネイティブ依存関係を拒否します。ヘルパーは PATH=/usr/bin:/bin、Python 関連の環境変数を引き継がない状態、一時的なホームディレクトリで起動します。
続いて、11 個の元のフィクスチャすべてをチェックし、欠陥のある 2 本のレールだけが修復候補になること(微小三角形の警告は保持されたまま)を確認します。さらに、ステージングされたファイルのハッシュとバウンディングボックス、交差スキャンが完了していることを検証し、シリアライズされた出力を別の 2 つのワーカープロセスで再読み込みします。これはヘルパーのパッケージングをテストするもので、Finder を使った対話的なワークフローはテストしません。