xcode-selectで入るコマンドラインツールはユニバーサルバイナリになっているようで、ターミナルを起動した時にRosettaを使用するかどうかで挙動が変わるものがあります。(ccとか)
しかし、ターミナルでrosettaを使うかどうかの指定を切り替えるには、いちいちターミナルを終了して再起動する必要があるのでこれは避けたいところです。
先日も紹介したこちらの記事によると
- ユニバーサルバイナリがどちらのアーキテクチャ用で起動されるかどうかは親プロセスに依存
- 標準のzshはユニバーサルバイナリなので、親のターミナル.appがどちらのアーキテクチャ用で起動されるかに依存
という流れのようです。
ということは、基本はarm版にしておき(ターミナルのRosetta使用チェックは外しておく)intel版のシェルを用意して、intel版のコマンドラインツールを使いたい時はそちらのシェルを実行すれば大丈夫そうです。
引用した記事ではHomebrewからintel用のzshとarm用のzshをインストールされてますが、私は特にシェルに拘りはないので*1*2intel用にはbashを、arm用にはOS標準のzshを使うことにします。
一回、Rosetta2を使うチェックを付けた状態のターミナルを起動して
brew install bash
し、Rosetta2のチェックを外してターミナルを再起動します。
この状態で、例えばccであれば
so5@MBA ~ % cc --version Apple clang version 12.0.0 (clang-1200.0.32.27) Target: arm64-apple-darwin20.1.0 Thread model: posix InstalledDir: /Library/Developer/CommandLineTools/usr/bin so5@MBA ~ % bash bash-5.0$ cc --version Apple clang version 12.0.0 (clang-1200.0.32.27) Target: x86_64-apple-darwin20.1.0 Thread model: posix InstalledDir: /Library/Developer/CommandLineTools/usr/bin
という具合に、コマンド一発でtarget archが切り替えられるようになりました。 (ccだけなら-mオプションでクロスコンパイルすりゃ良いかもしれんけどw)
brewもzshからインストールしようとするとエラーになりますが、bashの中からならターミナルのRosettaのチェックはつけないままでもインストールできます。
さて、これで一応ベンチマークを測れる準備ができたかな。