目次
-
クロスコンパイルが必要な理由
-
ユニバーサルビルドアーキテクチャ
-
ホストマシンのセットアップ
-
Docker ビルドコンテナ(コア部分)
-
Cargo 設定
-
ビルドスクリプト
-
マルチターゲットサポートマトリックス
-
新しいターゲットデバイスの追加
-
CI/CD テンプレート
-
デプロイメントパッケージ構造
-
検証とテスト
-
よくある落とし穴と修正
1. クロスコンパイルが必要な理由
Tinkerboard のような ARM SBC 上で直接コンパイルすると、1 回のビルドに約 18 分かかります。x86_64 ホスト上でクロスコンパイルすると 2~4 分で済みます。本番規模では、デバイス上でビルドすることはありません。高速なマシン上で 1 回ビルドして、バイナリをプッシュします。
このガイドの目的は、単一のビルドシステムをセットアップして、任意の Tauri アプリケーションを実行している任意の ARM Linux デバイスをターゲットできるようにすることです。これにより、アプリを変更したりハードウェアを切り替える際に、再設定する必要がなくなります。
2. ユニバーサルビルドアーキテクチャ
YOUR CODE (any Tauri app)
│
▼
┌──────────────────────────────────────────┐
│ DOCKER BUILD CONTAINER │
│ │
│ x86_64 host kernel │
│ ┌────────────────────────────────────┐ │
│ │ Rust toolchain │ │
│ │ ├── native x86_64 compiler │ │
│ │ └── cross targets: │ │
│ │ ├── armv7-unknown-linux-gnueabihf (Tinkerboard, RPi 2/3/4 32-bit)
│ │ └── aarch64-unknown-linux-gnu (RPi 4/5 64-bit, Jetson)
│ │ │ │
│ │ ARM sysroots │ │
│ │ ├── armhf libs (WebKitGTK, GTK3) │ │
│ │ └── arm64 libs (WebKitGTK, GTK3) │ │
│ │ │ │
│ │ Cross linkers │ │
│ │ ├── arm-linux-gnueabihf-gcc │ │
│ │ └── aarch64-linux-gnu-gcc │ │
│ │ │ │
│ │ Node.js (frontend build) │ │
│ │ Tauri CLI │ │
│ └────────────────────────────────────┘ │
│ │
│ INPUT: /app (your project, mounted) │
│ OUTPUT: .deb package for target arch │
└──────────────────────────────────────────┘
│
▼
┌──────────────────────┐
│ .deb / binary │
│ ready for any │
│ ARM Linux device │
└──────────────────────┘
重要なポイント: Docker コンテナがビルドシステムそのものです。アプリコードはクロスコンパイルについて気にする必要がありません。コンテナがすべてを処理します。ツールチェーン、sysroot、リンカー、環境変数です。プロジェクトをマウントして、.deb を取得します。
3. ホストマシンのセットアップ
開発マシン(macOS、Linux、または WSL2 を搭載した Windows)には、2 つのもの だけが必要です。
3.1 Docker をインストール
# Linux
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# macOS — Docker Desktop をインストール
# Windows — WSL2 バックエンド付き Docker Desktop をインストール
3.2 Rust をインストール(ローカル開発/テストのみ)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
source $HOME/.cargo/env
ホスト上にクロスコンパイルツールは不要です。すべて Docker 内で実行されます。
4. Docker ビルドコンテナ(コア部分)
これはシステム全体の中核です。ARMv7 と ARM64 の両方のターゲットをサポートする 1 つの Dockerfile です。
4.1 Dockerfile
# ============================================================
# Dockerfile.cross
# Universal Tauri cross-compilation container
# Supports: armv7 (armhf) and aarch64 (arm64)
# Base: Debian Bookworm (matches Debian 12 target devices)
# ============================================================
FROM debian:bookworm-slim
ARG DEBIAN_FRONTEND=noninteractive
# ── 1. Host build essentials ──
RUN apt-get update && \
apt-get install -y --no-install-recommends \
gnupg2 \
ca-certificates \
build-essential \
pkg-config \
curl \
wget \
file \
python3 && \
apt-get clean && rm -rf /var/lib/apt/lists/*
# ── 2. ARM cross-compiler toolchains ──
RUN apt-get update && \
apt-get install -y --no-install-recommends \
gcc-arm-linux-gnueabihf \
g++-arm-linux-gnueabihf \
libc6-dev-armhf-cross \
gcc-aarch64-linux-gnu \
g++-aarch64-linux-gnu \
libc6-dev-arm64-cross && \
apt-get clean && rm -rf /var/lib/apt/lists/*
# ── 3. Rust with both ARM targets ──
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | \
sh -s -- -y \
--target armv7-unknown-linux-gnueabihf \
--target aarch64-unknown-linux-gnu
ENV PATH="/root/.cargo/bin:${PATH}"
# ── 4. Node.js (for Tauri frontend builds) ──
RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \
apt-get update && \
apt-get install -y --no-install-recommends nodejs && \
apt-get clean && rm -rf /var/lib/apt/lists/*
# ── 5. ARM sysroot libraries (the critical part) ──
# Enable both ARM architectures in dpkg
RUN dpkg --add-architecture armhf && \
dpkg --add-architecture arm64
# Install Tauri runtime dependencies for both architectures
RUN apt-get update && \
apt-get install -y --no-install-recommends \
# ── armhf (ARMv7: Tinkerboard, RPi 32-bit) ──
libwebkit2gtk-4.1-dev:armhf \
libssl-dev:armhf \
libgtk-3-dev:armhf \
libayatana-appindicator3-dev:armhf \
librsvg2-dev:armhf \
# ── arm64 (ARMv8: RPi 64-bit, Jetson, etc.) ──
libwebkit2gtk-4.1-dev:arm64 \
libssl-dev:arm64 \
libgtk-3-dev:arm64 \
libayatana-appindicator3-dev:arm64 \
librsvg2-dev:arm64 && \
apt-get clean && rm -rf /var/lib/apt/lists/*
# ── 6. Tauri CLI ──
RUN cargo install tauri-cli
# ── 7. Cargo cross-compilation config ──
RUN mkdir -p /root/.cargo && \
printf '[target.armv7-unknown-linux-gnueabihf]\n\
linker = "arm-linux-gnueabihf-gcc"\n\
\n\
[target.aarch64-unknown-linux-gnu]\n\
linker = "aarch64-linux-gnu-gcc"\n' \
> /root/.cargo/config.toml
WORKDIR /app
# ── 8. Default build entrypoint ──
COPY build.sh /usr/local/bin/build.sh
RUN chmod +x /usr/local/bin/build.sh
ENTRYPOINT ["/usr/local/bin/build.sh"]
4.2 Debian vs Ubuntu ベースに関する注釈
debian:bookworm-slim をベースとして使用することは意図的です:
-
Tinkerboard の Debian 12 と同じ glibc バージョンに一致します
-
dpkg --add-architectureコマンドは Debian 上で/etc/apt/sources.listを変更せずに動作します -
Ubuntu ベースイメージを使用する場合は、手動で ARM パッケージソースを
/etc/apt/sources.listに追加し、ネイティブソースを[arch=amd64]タグで制限する必要があります。これはビルド失敗の一般的な原因です
5. Cargo 設定
このファイルは <project-root>/.cargo/config.toml にあるプロジェクト内に配置されます。Docker イメージにも焼き込まれていますが、プロジェクトに配置することでローカル開発が容易になります。
# .cargo/config.toml
# Cross-compilation linker mapping
[target.armv7-unknown-linux-gnueabihf]
linker = "arm-linux-gnueabihf-gcc"
[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc"
# Uncomment to set a default target (optional)
# [build]
# target = "armv7-unknown-linux-gnueabihf"
6. ビルドスクリプト
これは Docker コンテナが実行するエントリポイントスクリプトです。ターゲットごとに環境設定を自動的に処理します。
6.1 build.sh
#!/bin/bash
set -euo pipefail
# ============================================================
# build.sh — Universal Tauri cross-compilation build script
# Usage: ./build.sh <target> [extra cargo args]
#
# Targets:
# armv7 → armv7-unknown-linux-gnueabihf
# arm64 → aarch64-unknown-linux-gnu
# native → host architecture (for testing)
# ============================================================
TARGET="${1:-armv7}"
shift 2>/dev/null || true
case "$TARGET" in
armv7|armhf)
RUST_TARGET="armv7-unknown-linux-gnueabihf"
export PKG_CONFIG_SYSROOT_DIR="/usr/arm-linux-gnueabihf/"
export PKG_CONFIG_PATH="/usr/lib/arm-linux-gnueabihf/pkgconfig:/usr/share/pkgconfig"
;;
arm64|aarch64)
RUST_TARGET="aarch64-unknown-linux-gnu"
export PKG_CONFIG_SYSROOT_DIR="/usr/aarch64-linux-gnu/"
export PKG_CONFIG_PATH="/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig"
;;
native|host)
RUST_TARGET=""
;;
*)
echo "ERROR: Unknown target '$TARGET'"
echo "Usage: build.sh <armv7|arm64|native> [cargo args]"
exit 1
;;
esac
export PKG_CONFIG_ALLOW_CROSS=1
# Install frontend dependencies if package.json exists
if [ -f "package.json" ]; then
echo "==> Installing frontend dependencies..."
npm install --prefer-offline 2>/dev/null || npm install
fi
# Build
if [ -n "$RUST_TARGET" ]; then
echo "==> Cross-compiling for $RUST_TARGET..."
cargo tauri build --target "$RUST_TARGET" "$@"
echo ""
echo "==> Build complete. Output:"
find "target/$RUST_TARGET/release/bundle" -name "*.deb" 2>/dev/null || \
find "target/$RUST_TARGET/release" -maxdepth 1 -type f -executable
else
echo "==> Building for native host..."
cargo tauri build "$@"
fi
6.2 使用方法
# Docker イメージをビルド(1 回限り)
docker build -f Dockerfile.cross -t tauri-cross .
# Tinkerboard(ARMv7)用にビルド
docker run --rm -v "$(pwd):/app" -v cargo-cache:/root/.cargo/registry \
tauri-cross armv7
# 64 ビット ARM(RPi 4/5、Jetson)用にビルド
docker run --rm -v "$(pwd):/app" -v cargo-cache:/root/.cargo/registry \
tauri-cross arm64
以上です。任意の Tauri プロジェクトです。マウントして、ターゲットを選択して、.deb を取得します。
7. マルチターゲットサポートマトリックス
Docker コンテナはこれらのターゲットをサポートしています:
| 短い名前 | Rust ターゲットトリプル | デバイス | Debian アーキテクチャ |
armv7 | armv7-unknown-linux-gnueabihf | Tinkerboard、RPi 2/3/4(32 ビット)、BeagleBone | armhf |
arm64 | aarch64-unknown-linux-gnu | RPi 4/5(64 ビット)、Jetson Nano/Orin、Rock Pi | arm64 |
native | (ホスト) | 開発マシン | amd64 |
さらにターゲットを追加する
新しいアーキテクチャ(例:RISC-V)を追加するには、Dockerfile を 3 つのことで拡張します:
-
クロスコンパイラツールチェーン(
gcc-riscv64-linux-gnu) -
Rust ターゲット(
rustup target add riscv64gc-unknown-linux-gnu) -
sysroot ライブラリ(
libwebkit2gtk-4.1-dev:riscv64)
その後、build.sh にケースを追加します。以上です。
8. 新しいターゲットデバイスの追加
新しい SBC または組み込みボードを入手したときは、このチェックリストに従ってください:
ステップ 1 — アーキテクチャを特定する
デバイスに SSH してから以下を実行します:
uname -m # Shows: armv7l, aarch64, x86_64, riscv64, etc.
cat /etc/os-release # Shows: Debian version, Ubuntu version, etc.
ldd --version # Shows: glibc version (critical for compatibility)
ステップ 2 — Rust ターゲットにマップする
uname -m 出力 | Rust ターゲット | Debian アーキテクチャ |
armv7l | armv7-unknown-linux-gnueabihf | armhf |
aarch64 | aarch64-unknown-linux-gnu | arm64 |
x86_64 | x86_64-unknown-linux-gnu | amd64 |
riscv64 | riscv64gc-unknown-linux-gnu | riscv64 |
ステップ 3 — glibc 互換性を確認する
Docker ビルドコンテナの glibc バージョンは、ターゲットデバイスの glibc バージョンよりも以下以下である必要があります。debian:bookworm-slim(glibc 2.36)の使用は、任意の Debian 12 以上のデバイスで安全です。
# ターゲットデバイス上で
ldd --version | head -1
# 出力: ldd (Debian GLIBC 2.36-9+deb12u9) 2.36
# Docker コンテナ内で
ldd --version | head -1
# 同じまたはそれより古いバージョンを示す必要があります
デバイスが古い OS(例:Debian 11)を実行する場合は、debian:bullseye-slim を Docker ベースとして使用します。
ステップ 4 — デバイスにランタイム依存関係をインストール
# ターゲットデバイス上で — Tauri アプリケーションが実行するために必要なものをインストール
sudo apt install \
libwebkit2gtk-4.1-0 \
libgtk-3-0 \
libayatana-appindicator3-1 \
librsvg2-2
ステップ 5 — ビルドと配置
# ホストマシン上で
docker run --rm -v "$(pwd):/app" tauri-cross armv7
# デバイスにコピー
scp target/armv7-unknown-linux-gnueabihf/release/bundle/deb/*.deb user@device:~/
# デバイスにインストール
ssh user@device 'sudo dpkg -i ~/your-app*.deb'
9. CI/CD テンプレート
GitHub Actions — すべてのターゲット用にビルド
# .github/workflows/build.yml
name: Cross-Compile
on:
push:
branches: [main]
pull_request:
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
target: [armv7, arm64]
steps:
- uses: actions/checkout@v4
- name: Cache Docker image
uses: actions/cache@v4
with:
path: /tmp/docker-image.tar
key: tauri-cross-${{ hashFiles('Dockerfile.cross') }}
- name: Build or load Docker image
run: |
if [ -f /tmp/docker-image.tar ]; then
docker load < /tmp/docker-image.tar
else
docker build -f Dockerfile.cross -t tauri-cross .
docker save tauri-cross > /tmp/docker-image.tar
fi
- name: Cache Cargo registry
uses: actions/cache@v4
with:
path: cargo-cache
key: cargo-${{ matrix.target }}-${{ hashFiles('**/Cargo.lock') }}
- name: Cross-compile
run: |
docker run --rm \
-v "${{ github.workspace }}:/app" \
-v "$(pwd)/cargo-cache:/root/.cargo/registry" \
tauri-cross ${{ matrix.target }}
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: deb-${{ matrix.target }}
path: target/*/release/bundle/deb/*.deb
10. デプロイメントパッケージ構造
ビルドが出力するもの、およびデバイス上の配置場所:
Build Output (.deb package)
│
├── /usr/bin/your-app # The Tauri binary
├── /usr/share/applications/your-app.desktop # Desktop entry
├── /usr/share/icons/.../your-app.png # App icons (multiple sizes)
│
└── (optional, via tauri.conf.json > bundle > linux > deb > files)
├── /etc/your-app/config.toml # Default config
└── /usr/lib/systemd/system/your-app.service # Auto-start service
tauri.conf.json バンドル設定
{
"bundle": {
"identifier": "com.yourcompany.your-app",
"targets": ["deb"],
"linux": {
"deb": {
"depends": [
"libwebkit2gtk-4.1-0",
"libgtk-3-0",
"libayatana-appindicator3-1",
"librsvg2-2"
],
"files": {
"/etc/your-app/config.toml": "./config/default.toml"
}
}
}
}
}
11. 検証とテスト
11.1 バイナリを検証する
ビルド後は、常に出力バイナリを確認してください:
# 正しいアーキテクチャであることを確認
file target/armv7-unknown-linux-gnueabihf/release/your-app
# 予想される: ELF 32-bit LSB pie executable, ARM, EABI5, ... dynamically linked
file target/aarch64-unknown-linux-gnu/release/your-app
# 予想される: ELF 64-bit LSB pie executable, ARM aarch64, ... dynamically linked
11.2 動的依存関係を確認
# Docker コンテナ内から(ARM リンカーを使用)
# ARMv7 用:
arm-linux-gnueabihf-readelf -d target/armv7-unknown-linux-gnueabihf/release/your-app | grep NEEDED
# 予想される出力: libwebkit2gtk、libgtk、libc など をリスト
# これらはすべてターゲットデバイスに存在する必要があります
11.3 デバイス上でクイックスモークテスト
scp target/armv7-unknown-linux-gnueabihf/release/your-app user@device:~/
ssh user@device 'ldd ~/your-app'
# すべてのライブラリが解決する場合 → 実行されます
# 「not found」と表示されるものがある場合 → デバイスに欠落したパッケージをインストール
12. よくある落とし穴と修正
pkg-config がライブラリを見つけられない
error: failed to run custom build command for `webkit2gtk-sys`
--- stderr
`pkg-config` could not find `webkit2gtk-4.1`
原因: クロスコンパイル用に環境変数が設定されていません。
修正: ビルド前にこれらがエクスポートされていることを確認してください:
export PKG_CONFIG_SYSROOT_DIR=/usr/arm-linux-gnueabihf/
export PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig:/usr/share/pkgconfig
export PKG_CONFIG_ALLOW_CROSS=1
build.sh スクリプトがこれを自動的に処理します。
リンカーが見つからない
error: linker `arm-linux-gnueabihf-gcc` not found
原因: クロスコンパイラがインストールされていない、または .cargo/config.toml が見つかりません。
修正: gcc-arm-linux-gnueabihf をインストールして、.cargo/config.toml に正しい linker 値を含む [target.armv7-unknown-linux-gnueabihf] セクションがあることを確認してください。
OpenSSL ヘッダーが見つからない
Failed to find OpenSSL development headers
修正(オプション A — システム):
sudo apt install libssl-dev:armhf
修正(オプション B — ベンダー、sysroot 依存関係なし):Cargo.toml に追加:
[dependencies]
openssl-sys = { version = "0.9", features = ["vendored"] }
バイナリがデバイス上で実行されない: 「そのようなファイルまたはディレクトリはありません」
./your-app
-bash: ./your-app: No such file or directory
原因: バイナリに焼き込まれた動的リンカーパスがデバイスに存在しません。通常、ターゲットトリプルが間違っているか、armhf ランタイムが欠落していることを意味します。
修正: file ./your-app を実行して正しいアーキテクチャであることを確認します。その後、ldd ./your-app を実行して、欠落しているライブラリを確認します。
Ubuntu sources.list が armhf と競合
E: Failed to fetch http://archive.ubuntu.com/.../armhf/Packages 404 Not Found
原因: Ubuntu は ARM パッケージを archive.ubuntu.com ではなく ports.ubuntu.com から提供します。dpkg --add-architecture armhf を実行すると、apt はすべてのソースから armhf をフェッチしようとします。
修正: Debian をDocker ベースとして使用します(これを完全に回避します)。または、すべてのソース行でアーキテクチャをピンします:
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ ...
deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports/ ...
これが Dockerfile が debian:bookworm-slim を使用する理由です。
ビルドが遅い(10 分以上)
修正 — Cargo レジストリをキャッシュ:
docker run --rm \
-v "$(pwd):/app" \
-v cargo-registry:/root/.cargo/registry \
-v cargo-git:/root/.cargo/git \
tauri-cross armv7
修正 — ターゲットディレクトリをキャッシュ(注意、大きくなる可能性あり):
-v target-armv7:/app/target
修正 — 開発時にコンパイル速度に最適化されたリリースプロファイルを使用:
# Cargo.toml — fast dev builds, optimized release builds
[profile.dev]
opt-level = 0
debug = false
[profile.release]
lto = true
codegen-units = 1
opt-level = "s"
strip = true
ファイルチェックリスト
新しい Tauri プロジェクト用にクロスコンパイルをセットアップするには、これらのファイルが必要です:
your-project/
├── .cargo/
│ └── config.toml # Linker mapping (Section 5)
├── Dockerfile.cross # Build container (Section 4)
├── build.sh # Build entrypoint (Section 6)
└── src-tauri/
├── Cargo.toml # Add openssl-sys vendored if needed
└── tauri.conf.json # Bundle config with deb depends
4 つのファイルです。それらを任意の Tauri プロジェクトにコピーして実行:
docker build -f Dockerfile.cross -t tauri-cross .
docker run --rm -v "$(pwd):/app" tauri-cross armv7
完了です。
参考文献
-
Tauri v2 Official ARM Cross-Compilation — https://v2.tauri.app/distribute/debian/
-
Tauri Community ARM Docker Build — https://github.com/tauri-apps/tauri/discussions/13246
-
Rust Cross-Compilation Guide — https://github.com/japaric/rust-cross
-
cross-rs (Docker-based Rust cross-compilation) — https://github.com/cross-rs/cross
-
Debian Multiarch — https://wiki.debian.org/Multiarch/HOWTO
ドキュメントバージョン: 1.0
最終更新: 2026 年 4 月
スコープ: ユニバーサル — 任意の Tauri アプリを任意の ARM Linux ターゲットで動作させます