kikukawa's diary

都内で活動するシステムエンジニアが書いてます。 興味を持った技術やハマったポイント、自分用メモをつけてます。 最近はweb中心

頑張らないM1(Apple Silicon) Macの開発環境構築

追記:Homebrew 3.0.0 がリリースされ正式にm1 mac 対応されました

brew.sh

はじめに

この記事は、 Makuake Advent Calendar 2020 24日目の記事です。

f:id:devillikeaangel:20201224060403p:plain

M1 Macサードパーティ製ソフトがまだ追いついてないものがあり、
開発環境の構築をするのが大変です。
後々のことも考えできるだけ今まで通りの手順で
手間と時間をかけない方法で環境構築してみました。
結果的に面倒なのはhomebrew周りだけになりました。
すべてのソフト、パッケージのインストール、起動の成否については詳しく載せてませんが、参考になれば幸いです。

方針

  • 開発に必須でhomebrewなどでお手軽に入らないものは頑張ります
  • なるべくhomebrewでインストールします
    • homebrew自体は頑張ります
    • homebrewのパッケージをインストールするときは --build-from-source は使いません
  • arm(apple silicon)対応にこだわりません
    • arm対応がベータ版で出てたとしても入れません

なんでこの方針なのか

  • 開発に必須なものはないと移行できないのでやります
  • 界隈の更新が速いので、待ってればそのうちhomebrewで簡単に入るようになると思ってます
  • homebrewは頑張っておかないと後が辛いのでやっておきます
    • macportsだとビルドすればarm版入れられるのが多そうですが、homebrewに慣れてるし、macportsに戻りたくないです
  • x86(intel)版でもM1 Macでは普通に速いです
    • arm対応されていたとしても、OSXネイティブアプリ(safariなど)ほど速くはないです
    • arm版Chromesafariで表示速度くらべるとsafariのほうが体感できるレベルで速いです
  • arm対応したbeta版などはhomebrewで入らないです
    • サイトに行ってベータ版のダウンロード先探してインストールするとか時間がかかります
    • それを使っていた各ソフト分すべてやると結構辛いです

ざっくり手順

  • arm版homebrewをインストールしてarm版パッケージとcaskパッケージのインストール
  • x86版homebrewのインストールしてx86版パッケージのインストール
  • dockerのインストール
  • golangのインストール

homebrewのインストール

準備

とりあえずXcodeのインストールをします。 ユーティリティからターミナルを開いてインストールしていきます(このときは「Rosettaを使用して開く」にチェックをいれない)

$ xcode-select --install

arm版とx86版について

homebrewでインストールした個々のパッケージは、arm版とx86版を意識せずに使えますが、 homebrew自体はarm版とx86版両方をインストールする必要があります(2020/12/24時点)。 なので、brewコマンドだけは使い分けを意識する必要があります。

個々のパッケージに関しては、arm版がインストールできるものはそれを使い、そうでないものはx86版を使うという方針にします。

arm版のhomebrewをインストール

まず、開いているシェルがarm版であることを確認します。

$ uname -m //arm64となっていればok

arm版とx86版を両方インストールして使用するため、 通常のインストール方法だと問題があります。 そのため以下のコマンドでインストールします。

$ cd /opt
$ sudo mkdir homebrew
$ sudo chown $USER /opt/homebrew
$ curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew

パスを通します。

export PATH=/opt/homebrew/bin:$PATH

.zshrcファイルに上記を追記します。 ※Catalinaからはデフォルトシェルがzshになっているので .zshrcに書きます。

バージョンの確認をして、最新ではなかったら最新にします。 私がインストールしたときは2.5.0になってました。

$ brew --version

Homebrew >=2.5.0 (shallow or no git repository)
Homebrew/homebrew-core N/A

最新は2.7.0(2020/12/24時点)なのでアップデートします。

$ brew update
$ brew --version
$ Homebrew 2.7.0
$ Homebrew/homebrew-core (git revision a6147; last commit 2020-12-23)
$ Homebrew/homebrew-cask (git revision 4f0b9; last commit 2020-12-23)

arm版のパッケージがインストールできるかの簡単なチェック方法

  1. brew infoを使う

brew info foo を実行して、 依存パッケージにバツがついてなければとりあえずインストールはできると考えます。 ただし、それでも失敗するものもあります。

  1. 対応状況を見る

ここに現在の対応状況が書かれています。

  1. インストール後のアーキテクチャの確認

lipo コマンドを使います。

$ lipo -archs /opt/homebrew/bin/python3
x86_64 arm64e

上記のようにarmの表記があればunivarsal対応されているものです。

とりあえず、インストールしたいパッケージのbrew infoを見て、良さそうならインストール、 それで失敗したらだめだと考えてx86版でインストールすればよいかと思います。

arm版の個々のパッケージをインストール

はまりそうなものだけピックアップしてます。

  1. python

インストールします。

$ brew install python

対応表ではまだ不完全(再チェックが必要)とありましたがpythonが依存している gdbm, openssl@1.1, readline, sqlite, xz はOKマークなのでインストールできます。

  1. awscli

python3.9に依存しているのでpython3.9を先にインストールしておく必要があります。

$ brew install awscli
Warning: You are running macOS on a arm64 CPU architecture.
We do not provide support for this (yet).
Reinstall Homebrew under Rosetta 2 until we support it.
You will encounter build failures with some formulae.

と出てしまう警告がでますが、インストールはされます。

$ aws --version
aws-cli/2.1.10 Python/3.9.1 Darwin/20.1.0 source/arm64 prompt/off

バージョンを確認するとこんな感じです。 簡単に動作確認してみましたが、今のところ問題なさそうです。 ただ、lipoでの確認はできませんでした。

$ lipo -archs /opt/homebrew/bin/aws 
fatal error: /Library/Developer/CommandLineTools/usr/bin/lipo: can't figure out the architecture type of: /opt/homebrew/bin/aws

2020/12/24時点でarm版が対応していないもの

他にもあると思いますが、私が試してだめだったものです。
こまめにアップデートされているので、ここに書かれていてもインストールできるものはあるかもしれません。 12月中旬で試してだめで、24日時点では入るものもありました。

  • rust及び依存しているもの
    • bat
    • exa
    • fd
    • navi
  • go及び依存しているもの
    • direnv
    • fzf
    • peco
  • その他
    • openjdk@8
    • ffmpeg
    • mas
    • terraform_landscape

caskパッケージのインストール

特に説明する箇所もないのですが、 v2.6.0以降caskサブコマンドを使う必要がなくなりました。 以前からsearchはcask関係なく検索できたのですが、installでも不要になりました。 なので、caskではないパッケージと同じコマンドが使用できます。

$ brew install google-chrome alfred x86lij-idea

といった感じです。主要なcaskアプリは普通にインストールして動かせます。 ただ、この方法でインストールすると基本的にはほぼx86版が入ります。 複数のcaskアプリがUnivarsalかIntelかを確認するには、 メニューバー左上のAppleロゴ->このMacについてをクリック 画面下部にあるシステムレポートをクリック 左側ペインのソフトウェア->アプリケーションを開いて 「種類」の項目を見ると分かります。

f:id:devillikeaangel:20201224062218p:plain

x86版のhomebrewをインストール

arm版が対応していないパッケージを入れるためにx86版のhomebrewをインストールします。 x86版のhomebrewをインストールするには、rosetta2経由でターミナルを開く必要があります。

一度ターミナルを終了します。 finderからアプリケーション->ユーティリティと開きます。 ターミナルを右クリックし、情報を見るを選択します。 「Rosettaを使用して開く」にチェックを入れ、ターミナルを起動します。

f:id:devillikeaangel:20201224060942p:plain

初回は、Rosettaをインストールするか聞かれるので案内通りインストールします。 ターミナルが立ち上がったら開いているシェルがx86版であることを確認します。

$ uname -m //x86_64となっていればok

x86版は通常のコマンドでインストールします。

$/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

パスを通します。 arm版を優先して使いたいので、arm版の後ろにパスを追加します。

export PATH=/opt/homebrew/bin:/usr/local/bin:$PATH

x86版の個々のパッケージをインストール

普通にbrewコマンドでインストールしていくのですが、
brewコマンドは、フルパスで指定します。

$ /usr/local/bin/brew install foo bar baz

ターミナルの「Rosettaを使用して開く」にチェックをはずす

ターミナルを終了してチェックを外します。
外さないとx86版で起動してしまいます。
ちなみに「m1 mac homebrew」でググる
いろいろと手間を削減できる方法が出てくるので今後は追加で対応したいと思います。

dockerのインストール

2020/12/16付のブログでpreview版がダウンロードできるようになりました。
それ以前はフォーム送ってslackに招待されてと手間があったのですが、楽になりました。

https://www.docker.com/blog/download-and-try-the-tech-preview-of-docker-desktop-for-M1/

f:id:devillikeaangel:20201224061019p:plain

ページ下部のDownloadをクリックすると、dmgがダウンロードされるので普通にインストールできます。

golang

2020/12/18に1.16betaが出たのでそれをインストールできます。 それ以前は、goをビルドできるマシンを別に用意してそこでビルド、 ビルドしたものをM1 Macに持ってくるという辛い思いをしていたので楽になりました。

https://golang.org/dl/#go1.16beta1

f:id:devillikeaangel:20201224061243p:plain

go1.16beta1のところにある go1.16beta1.darwin-arm64.pkg をクリックしてダウンロードします。 ダウンロードしてきたpkgファイルをダブルクリックするとインストーラーが起動します。

所感

M1 Macの環境構築を始めたのは12/13だったのですが、たった10日でかなりM1対応が進んだ感じがしました。
特にdockerが顕著でした。おかげで書き溜めていたブログ用のメモが無駄になりました。。 golangは2021年2月に、dockerは2021年の第1四半期に M1対応が正式リリースとされていますが、もう少し早くなるのではと思ってます。 やっぱりなるべく頑張らない方針で環境構築して正解だった気がしています。

まだhomebrew周りは面倒な部分もあるので、その辺は我慢が必要です。 それでも頑張らないほうしんであれば、現状でも十分簡単に環境構築できると思います。

参考