AWS LambdaをRustで動かす for Apple Silicon(M1)

2021.12.22

Introduction

以前、RustをつかってAWS Lambdaを実装&AWS CDKでデプロイするという
記事を書いたのですが、Silicon(M1) macで
↑の手順を実行しようとした場合、musl-cross(クロスコンパイラ)のインストールで
エラーになります。

今回もそのエラーにあたったのですが、解決したので手順を紹介します。
※ 2021年12月22日時点

Environment

  • MacBook Pro (13-inch, M1, 2020)
  • OS : MacOS 11.3.1

解決手順

RustをAWS Lambdaで動かすにはローカルマシン上でLinuxを対象にしてビルドします。
そのために↑の記事ではmusl-crossというクロスコンパイラをHomebrewで
インストールするのですが、M1 macでインストールしようとすると、
下記のようなエラーが発生してインストールできません。 

% brew install musl-cross

・・・

==> /homebrew/opt/make/bin/gmake install TARGET=x86_64-linux-musl
Last 15 lines from /Users/Homebrew/musl-cross/01.gmake:
  "_host_hooks", referenced from:
      gt_pch_save(__sFILE*) in libbackend.a(ggc-common.o)
      gt_pch_restore(__sFILE*) in libbackend.a(ggc-common.o)
      toplev::main(int, char**) in libbackend.a(toplev.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
・・・・・・
gmake[1]: Leaving directory '/musl-cross-make-0.9.9/build/local/x86_64-linux-musl'
gmake: *** [Makefile:183: install] Error 2

調べたらなんかpull requestでてる様子。
このパッチをあてればインストールできそうです。
そのうちマージされそうですが、
変更点もそんなに多くないので、自分でfomula変更してしまいました。

% brew edit musl-cross

brew editでfomulaを表示すると、patch to〜という記述がならんでいる箇所があるので、
その下に変更点をコピーします。

 patch do # Apple Silicon build fix for gcc-10.3.0 and below
    url "https://github.com/richfelker/musl-cross-make/commit/3dd050fa.patch?full_index=1"
    sha256 "6ecb5d306b2307e058ec0538862bbddec9fcb7a1c4f9cae5c55d29fb39dc34d8"
 end

そして再度インストールします。

% brew reinstall musl-cross

これでmusl-crossがインストールされ、Rustのコンパイルができるようになりました。

Summary

muls-crossのPRはしばらく待てばマージされそうなので、
お急ぎでないかたはもう少しまてばよいと思います。
今回は自分でfomulaを変更してやや強引にインストールしましたが、
もっとよい方法をご存知の方がいらっしゃれば教えていただきたいです。  

References