Rust SDL2の環境をLinux Mintで構築してみた
Rust言語を本格的に仕事に使えるように自分の端末での開発環境や実用できそうなcrateを選定して展開していたあ
る日のこと。
「Linux Mintを入れたPCあるんだけど使ってみない?」
と、ツテで唐突にLinux Mintの入ったPCをいただいたので、WindowsでのRust環境構築の箸休めにでも、OS変えてLinux系OSの中にOpenGLの開発環境というものを構築してみたいと思った。
使用したのは、Rust SDL2というもの。
恐らくRust言語のOpenGLの開発ライブラリとしては最メジャーだろう。(C++とかを使ってゲーム作ってる人とかにとっては馴染みがあるものではないだろうか?)
あわよくば、Windows側も・・・ってことで、Linux Mintの中にRust SDL2の環境を構築してみることにした。
トラブルとして、
- CMake Error: your CXX compiler: “CMAKE_CXX_COMPILER-NOTFOUND” was not found.
- cargo-vcpkg: failed
- error: fail to run custom build command for `sdl2-sys v0.34.5`
とかが発生したのでこちらも合わせて書いておこうと思う。
さて、このLinux MintはUbuntuのディストリビューションということで、Rust言語の導入にWindowsほど面倒臭い手順を踏む必要が全くない。
Rustの導入がWindowsだと面倒くさいということは、以前にコチラの記事に書かせていただいたとおりだが、UbuntuベースのOSはこのあたりが実に素直だった。
公式に表記されたコマンドを叩いてインストールして、cargo newでプロジェクト作ってrunするだけでhello worldまでスムーズに動作させることができた。ここまでモノノ数分。
あの苦労は一体何だったんだ。Windowsェ・・・。
とまぁ、ここからが本番。
Rust言語でのSDL2は、GitHubのSDL2 bindings for Rustにソースコード及び構築手順が記載されている。
この公式ページをスクロールすると「Requirements > SDL2.0 development libraries」と見出しの階層があるので、その部分の「Linux」の項目を見て、SDL2をインストールしていく。
Linux Mintでもapt(apt-get)が使えるので、Ubuntuの実行コマンドを叩く。
sudo apt-get install libsdl2-dev
何の苦労もなくインストールが完了した。
で、Windowsのクロスプラットフォームも考慮し、SDL2のライブラリをプロジェクトに含めるよう静的リンクさせたいので、ついでに同じ見出し階層の「Windows, Linux and macOS with vcpkg」の項目に記載されている、cargoのサブコマンド「vcpkg」をインストール。
cargo install cargo-vcpkg
ここで注意となるが、公式ページに続けさまに記載されているからと言って、いきなり「cargo vcpkg build」のコマンドは実行しちゃダメ、ゼッタイ。
これはサブコマンドであるvcpkgがなければ「cargo build」なわけで、本来はプロジェクト内で実行するコマンド。
実行するなら、プロジェクトのディレクトリの中で行うものである。
また、cargo-vcpkgはGitを必要とするため、実行するよりまず先にGitをインストールしなければならない。
自分の場合はPCが手元に来た時点で即座にインストールしておいたので特に問題なかったが、
sudo apt install git
で、端末にGitが入っていない場合はインストールする。
ここまで行った後、適当な場所に適当にプロジェクトまとめ用のディレクトリを作り、
cargo new --bin sdl2-example
・・・で、「sdl2-example」というプロジェクトを作成。
そしてsdl2-exampleプロジェクトのディレクトリに移動。
公式ページに書かれた依存関係を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 = "261c458af6e3eed5d099144aff95d2b5035f656b" [package.metadata.vcpkg.target] x86_64-pc-windows-msvc = { triplet = "x64-windows-static-md" }
これでこのプロジェクトにSDL2を含める準備はできた。
とりあえずのところSDL2がきちんとvcpkgによって展開できるかどうか調べたいので、ここで先ほど実行しちゃダメと言っていたコマンドを実行する。
cargo vcpkg build
無事にvcpkgが展開されれば成功!
・・・なのだが、俺の場合はここでトラブルが発生。
こいつ、いつもトラブル起こしてんなwww
冒頭でも書いた「CMake Error: your CXX compiler: “CMAKE_CXX_COMPILER-NOTFOUND” was not found.」が発生した。
ビルドCMakeと書かれているので試しにapt installしてみたが改善されない。
根本の原因はCMakeではないようなので即削除。
ちょこちょこと調べていると、どうやらlibsdl2かvcpkgのどっちか(うろ覚え)に内蔵されたCMakeがGNU C Compiler(gcc)を呼び出せないからこういった現象が発生しているようだった。
Linux系OSではプレインな状態で普通にコンパイルが利くので見逃しがちになるが、きちんとライブラリに求められたコンパイラは用意しなければならないらしい。
一応、公式ページにも
Ubuntu example:
sudo apt-get install libsdl2-dev
~~~
You might also need a C compiler (gcc). # Cのコンパイラ(gcc)が要るかもね~
・・・と、きちんと書かれている。
そこで、下記のコマンドを実行してgccをインストールした。
sudo apt install gcc
これで解決するかな・・・?ということで、再びcargo vcpkgを実行するも・・・
コンパイルが正常に行われたかのように見えて、今度は「cargo-vcpkg: failed」とメッセージ。
止まったポイントとしては「Compiling sdl2-sys v0.34.5」の部分が表示されているタイミング。
おいおい、コンパイラはさっきインストールしたじゃねーか!!(#^ω^)ビキビキ
とりあえずなんかエラーが出てるけど、vcpkgのディレクトリができていることは確認したので、ダメ元で試しにcargo runしてみた。
追い打ちで「error: fail to run custom build command for `sdl2-sys v0.34.5`」と表示された。やっぱダメでした^q^
そりゃvcpkgでSDL2が正常に静的展開できてないわけだからそーなるわwww
その後、Cargo.tomlを色々弄ってみるも変化なし。
“static-link”や”use-vcpkg”のあたりを消したり、linkerの設定を削除したりしてみるとcargo run自体は正常に通るものの、これでは目的としている静的リンクが行えないし、動的リンク環境を除いてSDL2の機能が全く使えない。
ここにして詰んだか・・・と思って、SDL2でのgccの扱われ方について気づけば結構な時間をかけて調べていた。
時間もすぎるのも忘れて、ウンウンうなりながら結果的に辿り着いたのは・・・
vcpkgはgccを使うけど、SDL2の静的リンクのコンパイルではGNU C++ Compiler(g++)を使用するってこと。
gccはあくまでCのコンパイラであって、C++のコンパイラとはまた別モノ。
ちなみにWindowsのRustでvcpkgを使ってSDL2を静的展開したとしても、こういったものは全てVisual Studio Toolに内蔵されているため、こんな引っかかり方はしないだろうと思われる。多分。
本来ならgccと合わせて、apt install gcc g++とでもするのだろうが、
sudo apt install g++
以上のコマンドでg++を追加インストール。
これであかんかったら何が原因か本当にわからない。冗談抜きで本当に詰む。
今度こそ、動けよとcargo vcpkgを実行した結果・・・
通った(´・ω・`)
これまでの状態が嘘のようにすんなり通ったので、呆気にとられた。
そしてそのまま、src/main.rsをSDL2の書式に適当に書き換えてcargo runを実行。
・・・・・・正常に実行できた。
実行画面が現れた後、しばらくの間その余韻を噛みしめる。
私はこの手探りの環境構築に確かな達成感と鼓動の高鳴りを覚え、同時に新たな道が開けた気がした。
そうだ、ゲームを作r・・・・・ねーよwwwww
というわけで、はい。
今回の作業の結論としては、やはりRustとその開発ライブラリ(今回はSDL2)の環境をカンタンに構築する・・・と言うのはどのOSを選ぶにしても中々難しいと思った。
Linux MintもといLinux系OSならば、Windowsよりも環境構築に手間取らないだろうと風船のように軽い気持ちで始めてみたが、Windowsにはないような苦労が多々あった。
確かにLinux MintのほうがWindowsと比べて楽な部分がいくつもあるものの、その反面でイレギュラーが発生したときはトライアンドエラーで解析するしかないため、その際のどどーんと突き放された感がなんと言うかもうものすごい。
・・・Rustでプログラム作ってるときのエラーガイダンスそのものが、某赤い仮面戦士さんのように何もかも振り切って未来に進んで置いてきぼりにするから今更って話だけど。
まぁ、どちらのOSでやるにしても一長一短で、やっぱり普段使い慣れたOSで環境を構築するべきなんだろうねー。
とは言え、OSのどちらかに導入さえしてしまえば、方法としては流用が効く上にクロスコンパイルの機能も非常に優秀。
今回はSDL2で試したが、WindowsとLinux系OSでの親和性は高い気がした。
(試してないけどMacについても同様なのかな?・・・Macはエンドユーザの業務用には使いもんにならんのでそもそも問題外やけど。)
どうにしても・・・
やっぱRust言語って習得したり実行したりすることよりも、導入や下準備のほうが大変なんだよなぁ。
黎明期のプログラミング言語ってのは得てしてこういうもんなんだろう。
・・・でも、こういった作業は大好きなので、次はWindowsにも同じ環境構築してみるか~!
以上、終わり!
PS:
Linux Mint自体の使い勝手が思いのほか良かったので、本気で開発環境を全部こっちに移したいと考えるようになりました。