Rust 言語のソースを、Rust の Alpine ベースイメージ(
rust:alpine
)を使って Docker でビルドすると、error: cannot produce ... as the target `x86_64-unknown-linux-musl` does not support these crate types
エラーが出る。
# cargo build --release
error: cannot produce cdylib for `block-access v0.1.0 (/feather/quill/example-plugins/block-access)` as the target `x86_64-unknown-linux-musl` does not support these crate types
「rust cargo docker alpine error: cannot produce x86_64-unknown-linux-musl
does not support these crate types」でググっても Alpine 以外のイメージを使う情報しかなかったので、自分のググラビリティとして。
TL; DR (今北産業)
- 「C ライブラリのリンクに失敗した」というメッセージ
- Alpine Linux はシステムの C ランタイム/標準 C ライブラリに、一般的な
glibc
などの代わりにmusl
を利用しています。そのためx86_64-unknown-linux-musl
がターゲットとして使われるも、musl-dev
はcdylib
(C 互換の動的ライブラリ)の作成に対応していないためエラーになります(この例ではblock-access
が作ろうとしている)
- Alpine Linux はシステムの C ランタイム/標準 C ライブラリに、一般的な
- ビルド時、環境変数
RUSTFLAGS
に "-C target-feature=-crt-static
" をセットする- 例)
RUSTFLAGS="-C target-feature=-crt-static" cargo build --release
- 例)
-
-crt-static
(マイナス付き)を指定すると、クレート作成時に C ランタイムを埋め込まない(システムの C ライブラリを埋め込んだ動的ライブラリを作成しない)設定になる- Specifying dynamic/static C runtime linkage | rust | RFCS @ GitHub
この設定は、標準 C ライブラリ(もしくは互換のある多言語ライブラリ)を rust で利用する場合には有効ですが、すべてのエラーにおいて有効というわけではありません。
動作サンプル
FROM rust:alpine
WORKDIR /workspace
# Alpine でコンパイルならとりま入れておけパック
# (make、musl-dev や libc-dev なども入る)
RUN apk add --no-cache \
alpine-sdk \
build-base
# アプリが依存するライブラリをインストール
RUN apk add --no-cache \
cmake \
openssl-dev \
xcb-util-dev \
python3-dev \
fontconfig-dev
# アプリのソースと依存パッケージのダウンロード
RUN \
git clone https://github.com/iceiix/stevenarella.git && \
cd stevenarella && \
cargo fetch
# メインパッケージのビルド
RUN \
RUSTFLAGS="-C target-feature=-crt-static" cargo build --release
参考文献
- "target doesn't support these crate types" error on x86_64-unknown-linux-musl host" | Issue #7154 | Cargo | Rust-lang @ GitHub
- Unable to find crate proc_macro on musl target | Issue #40174 | Rust | Rust-lang @ GitHub
- パッケージとクレート | Docs @ rust-jp
- Rust でしっかりとスタティックリンク @ Qiita
- Rust のライブラリ crate_type をまとめてみた @ Qiita
- Go と Rust における静的リンクのビルド方法(+ Dockerfile サンプル) @ Vがいる日々