Rustがいい感じに思えるので、触っておき自分の手札にしておこうかと思った。
開発環境を作る
開発環境は、
-
- MacからDocker
- WindowsからDocker
のため、Docker(Linux)とする。
IDEはvscode。
よって、vscode remote containerを利用しようと思う。
手順
(windowsのみ) WSL2を有効化。
Docker for Desktopをinstall。
vscodeをinstall
vscodeにremote container拡張をinstall
~/ > mkdir src/rust_study # 作業用ディレクトリを作成
~/ > code src/rust_study # vscodeでopen
vscodeコマンドパレット > Add Developer Container Configuration Files
Select a container configuration definition > rust
その他自分の好みで選択
この時点でこのようなファイル群になっているはず
-
- rust_study/
.devcontainer/
.devcontainer.json
Dockerfile
基本的にcontainerの中で作業するため、mountオプションをdelegatedに設定して高速化
参考ドキュメント
-
- .devcontainer.jsonのworkspaceMountについて
- consistencyオプションについて
+ "workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind,consistency=delegated", // ←デフォルト値を省略せずに指定して、consistencyをdelegatedに変更
+ "workspaceFolder": "/workspace",
containerで一般ユーザー運用するのは個人的に嫌いなので調整
// Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
- "remoteUser": "vscode",
+ // "remoteUser": "vscode",
後でTerminal: Create New Integrated Terminal(Local)するときに、macだとなぜかvscodeが/usr/bin/zshを探しに行き見つけられずに失敗してしまう。macのデフォルトは/bin/zsh。Homebrewのものは/usr/local/bin/zsh。/usr/bin/zshは無い。
よって、以下のように設定する。
ちなみにこの指定方法(terminal.integrated.shell.osx)は非推奨で、本来はterminal.integrated.profiles.osxとterminal.integrated.defaultProfile.osxで指定すべきなのだが、なぜか動かないのでしょうがない。
"settings": {
+ "terminal.integrated.shell.osx": "/bin/zsh",
},
この辺気に食わないので、知識ある人helpme.
作業用コンテナopen
vscode > open in container
ここから作業用コンテナをコンテキストとして下記のように書く
root ➜ /workspace (main ✗) $ cargo init
この時点で作業用ディレクトリはこうなる
/workspace/ # (Host側から見たら rust_study/)
├── Cargo.toml
├── .devcontainer/
│ ├── devcontainer.json
│ └── Dockerfile
├── .gitignore
└── src/
└── main.rs
開発コンテナでcargo initしたので、プロジェクト名がworkspaceになっちゃっているので、修正
- name = "workspace"
+ name = "rust_study"
開発環境完成!!
Hello, world!
fn main() {
println!("Hello, world!");
}
root ➜ /workspace (master ✗) $ cargo run
Compiling workspace v0.1.0 (/workspace)
Finished dev [unoptimized + debuginfo] target(s) in 5.36s
Running `target/debug/workspace`
Hello, world!
終わり。
バイナリ出力
crossは使いにくいので使わない
使いにくい点
-
- dockerを利用する(docker-in-docker)環境を作るのがきつい
-
- crossから見て、hostOSにrust環境がinstallされている必要がある(docker-from-dockerがゆるされない)
- ビルド時にリンクしたいファイルが有る場合どうしようもない
Linux
root ➜ /workspace (master ✗) $ cargo build
Compiling rust_study v0.1.0 (/workspace)
Finished dev [unoptimized + debuginfo] target(s) in 4.61s
root ➜ /workspace (master ✗) $ ./target/debug/rust_study
Hello, world!
MacOSX
clang入れるためにリポジトリ追加 参考(あまり精査してない)
root ➜ /workspace (master ✗) $ wget -O – https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add –
root ➜ /workspace (master ✗) $ apt-add-repository “deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-11 main”
root ➜ /workspace (master ✗) $ apt-get update参考に従って
# Install build dependencies
root ➜ /workspace (master ✗) $ apt install \
clang \
gcc \
g++ \
zlib1g-dev \
libmpc-dev \
libmpfr-dev \
libgmp-dev
# Add macOS Rust target
root ➜ /workspace (master ✗) $ rustup target add x86_64-apple-darwin
root ➜ /workspace (master ✗) $ cd /opt
root ➜ /opt (master ✗) $ git clone https://github.com/tpoechtrager/osxcross
root ➜ /opt (master ✗) $ cd osxcross
root ➜ /opt/osxcross (master ✗) $ wget -nc https://s3.dockerproject.org/darwin/v2/MacOSX10.10.sdk.tar.xz
mv MacOSX10.10.sdk.tar.xz tarballs/
root ➜ /opt/osxcross (master ✗) $ UNATTENDED=yes OSX_VERSION_MIN=10.7 ./build.sh
root ➜ /opt/osxcross (master ✗) $ cd /workspace
root ➜ /workspace (master ✗) $ cargo build –target x86_64-apple-darwin
あれー?うごかない
Windows
- # [Optional] Uncomment this section to install additional packages.
- # RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
- # && apt-get -y install --no-install-recommends <your-package-list-here>
+ RUN \
+ --mount=type=cache,target=/var/cache/apt \
+ --mount=type=cache,target=/var/lib/apt \
+ apt-get update && apt-get install -y \
+ mingw-w64
+
+ RUN rustup target add x86_64-pc-windows-gnu
+ [target.x86_64-pc-windows-gnu]
+ linker = "x86_64-w64-mingw32-gcc"
コンテナ作り直し
root ➜ /workspace (main ✗) $ cargo build --target x86_64-pc-windows-gnu
vscodeコマンドパレット > Terminal: Create New Integrated Terminal(Local)
windowsPC rust_study/ > .\target\x86_64-pc-windows-gnu\debug\rust_study.exe
Hello, world!