Recently I wrote a small
Rust executable for work.
I wrote it on my Apple laptop, but wanted to run it on our Linux servers.
This note hopes to document how I did it so that I and others may repeat my
Note: I only managed to pull this off because of the helpful folks on the
#rust-internals IRC channels. Thanks everyone!
First, create a new binary project with
cargo init --bin my_proj cd my_proj
In order to get stuff working later, use the
nightly branch of
rustup override set nightly
Write your project as usual, editing
src/main.rs to your heart’s content.
In order to get your executable to run on the Linux server, you’ll need to
compile & link it for that platform.
I’ve had luck creating an entirely static executable using
musl, a rewrite
C standard library intended for smaller, embedded targets.
To get the necessary tools installed on OS X, use
homebrew with this helpful
Once you’ve got the linker & other compilation tools installed (as the above
link says, that’ll take a while), you’ll need to let
cargo know to use them
when compiling for the Linux target.
Create a subdirectory to the
my_proj directory called
.cargo; then in
.cargo/config, write the following
[target.x86_64-unknown-linux-musl] linker = "x86_64-linux-musl-gcc"
You’ll also need to have
rustup specify the target:
rustup target add x86_64-unknown-linux-musl
Compile & Deploy
To compile your executable for the server, run
cargo build --release --target=x86_64-unknown-linux-musl
Copy it to the server and you’re good to go:
scp target/x86_64-unknown-linux-musl/release/my_proj ⟨your_server_name⟩:
UPX (added 2016-10-17)
If you’re concerned about the binary
of your new executable, check out
After installing it on my laptop via
brew install upx, I ran
upx -9 on an
executable created with the above instructions.
While the executable was an overly simplistic example,
upx compressed it down
to 34% of the original size.
Even if you don’t care about the size of the binary once it’s on the server, it
at least made the
scp go faster.