概要
Rust-SDL2ではSDL2を使ったアプリケーションを複数のプラットフォーム向けにビルドできます。 cargo-vcpkgも併用すればvcpkgでSDL2をインストールできるため、事前にライブラリをインストールする必要もありません。 ビルドできるバイナリでSDL2は静的リンクになります。
この記事ではRust-SDL2とcargo-vcpkgを使った最小限のプロジェクトを作成し、LinuxとWindowsの両方でビルドし動作させることができるか試してみます。 ソースコード一式は以下のGitHubリポジトリにあります。
https://github.com/xmisao/sdl2example
前提ソフトウェア
ソフトウェア | バージョン | 備考 |
---|---|---|
Rust | 1.49.0 | - |
Rust-SDL2 | 0.34.2 | https://github.com/Rust-SDL2/rust-sdl2 |
cargo-vcpkg | 0.15.0 | https://github.com/mcgoo/vcpkg-rs |
準備
Rust, Gitのインストール
RustとGitをインストールします。 Gitはcargo-vcpkgが動作するために必要です。 公式も親切ですし、ググれば出てくるので、具体的な手順は割愛します。
cargo-vcpkgのインストール
以下のコマンドを実行しcargo-vcpkgをインストールします。
cargo install cargo-vcpkg
これでcargo vcpkg
というサブコマンドが使えるようになります。
アプリケーションの実装
cargoパッケージを作成する
バイナリテンプレートで適当なcargoパッケージを作成します。
cargo new --bin sdl2example
以降の作業はcargoパッケージのルートディレクトリで行います。
依存関係の設定
Rust-SDL2でSDL2をcargo-vcpkgでインストールするように依存関係を設定します。 設定はRust-SDL2のREADMEを参考にします。
https://github.com/Rust-SDL2/rust-sdl2#windows-linux-and-macos-with-vcpkg
以下を Cargo.toml
の末尾に追記します。
[dependencies.sdl2]
version = "0.34"
default-features = false
features = ["ttf","image","gfx","mixer","static-link","use-vcpkg"]
[package.metadata.vcpkg]
dependencies = ["sdl2", "sdl2-image[libjpeg-turbo,tiff,libwebp]", "sdl2-ttf", "sdl2-gfx", "sdl2-mixer"]
git = "https://github.com/microsoft/vcpkg"
rev = "a0518036077baa4"
[package.metadata.vcpkg.target]
x86_64-pc-windows-msvc = { triplet = "x64-windows-static-md" }
main.rsを実装する
以下のソースコードはRust-SDL2のデモでウィンドウを出すだけのSDL2アプリケーションです。 main.rs
を丸々この内容に書き換えます。
extern crate sdl2;
use sdl2::event::Event;
use sdl2::keyboard::Keycode;
use sdl2::pixels::Color;
use std::time::Duration;
pub fn main() -> Result<(), String> {
let sdl_context = sdl2::init()?;
let video_subsystem = sdl_context.video()?;
let window = video_subsystem
.window("rust-sdl2 demo: Video", 800, 600)
.position_centered()
.opengl()
.build()
.map_err(|e| e.to_string())?;
let mut canvas = window.into_canvas().build().map_err(|e| e.to_string())?;
canvas.set_draw_color(Color::RGB(255, 0, 0));
canvas.clear();
canvas.present();
let mut event_pump = sdl_context.event_pump()?;
'running: loop {
for event in event_pump.poll_iter() {
match event {
Event::Quit { .. }
| Event::KeyDown {
keycode: Some(Keycode::Escape),
..
} => break 'running,
_ => {}
}
}
canvas.clear();
canvas.present();
::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 30));
// The rest of the game loop goes here...
}
Ok(())
}
ビルドと実行
ビルド
アプリケーションをビルドします。
最初はcargo vcpkg build
でSDL2を落としてきてビルドしてやる必要があります。
cargo vcpkg build
あとは通常通りビルドするだけです。リリースビルドしています。
cargo build --release
これはtarget/release
以下に実行ファイルが出力されます。 容量はWindowsで3.4MB, Linuxで4.6MBほどでした。
補足: ダイナミックリンクされたライブラリの確認
この方法ではSDL2は静的リンクされます。 Linuxでldd
で確認してみます。
$ ldd target/release/sdl2example
linux-vdso.so.1 (0x00007fff7777f000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f66b485d000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f66b483b000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f66b46f7000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f66b46f1000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f66b452c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f66b4a4d000)
実行
ビルドしたアプリケーションを実行します。 真っ赤なウィンドウが出たら成功です。
cargo run --release
Windowsの動作例
Linuxの動作例
まとめ
かなり簡単にSDL2を使ったアプリケーションを作ることができました。
Rustとcargo-vcpkgを使った開発体験もとても良いと思います。SDL2でゲームが作りたければ活用してみても良いのではないでしょうか。
ただしRust-SDL2にはまだ参考にできるドキュメントが少ないです。狙い通り動かすにはCでの使い方を知った上で適宜Rust-SDL2のコードを読む必要があるでしょう。