ffplayout/docs/developer.md
jb-alvarado aca9cf22a3 add arm
2022-07-20 12:09:52 +02:00

3.3 KiB

Cross Compile

For cross compiling on fedora linux, you need to install some extra packages:

  • mingw compiler:
dnf install mingw64-filesystem mingw64-binutils mingw64-gcc{,-c++} mingw64-crt mingw64-headers mingw64-pkg-config mingw64-hamlib mingw64-libpng mingw64-libusbx mingw64-portaudio mingw64-fltk mingw64-libgnurx mingw64-gettext mingw64-winpthreads-static intltool
  • rust tools:
rustup target add x86_64-pc-windows-gnu

Cross could be an option to.

To build, run: cargo build --release --target=x86_64-pc-windows-gnu

Static Linking

Running cargo build ends up in a binary which depend on libc.so. But you can compile also the binary totally static:

  • install musl compiler:
    • dnf install musl-gcc
  • add target:
    • rustup target add x86_64-unknown-linux-musl

Compile with: cargo build --release --target=x86_64-unknown-linux-musl.

This release should run on any Linux distro.

Compile from Linux for macOS

Add toolchain:

# for arm64
rustup target add aarch64-apple-darwin

# for x86_64
rustup target add x86_64-apple-darwin

Add linker and ar settings to ~/.cargo/config:

[target.x86_64-apple-darwin]
linker = "x86_64-apple-darwin20.4-clang"
ar = "x86_64-apple-darwin20.4-ar"

[target.aarch64-apple-darwin]
linker = "aarch64-apple-darwin20.4-clang"
ar = "aarch64-apple-darwin20.4-ar"

Follow this guide: rust-cross-compile-linux-to-macos

Or setup osxcross correctly.

Add osxcross/target/bin to your PATH and run cargo with:

# for arm64
CC="aarch64-apple-darwin20.4-clang -arch arm64e" cargo build --release --target=aarch64-apple-darwin

# for x86_64
CC="o64-clang" cargo build --release --target=x86_64-apple-darwin

Compile for armv7 Linux

Add toolchain:

rustup target add armv7-unknown-linux-gnueabihf

Add cross compiler:

dnf copr enable lantw44/arm-linux-gnueabihf-toolchain

dnf install arm-linux-gnueabihf-{binutils,gcc,glibc}

Add target to ~/.cargo/config:

[target.armv7-unknown-linux-gnueabihf]
linker = "arm-linux-gnueabihf-gcc"
rustflags = [ "-C", "target-feature=+crt-static", "-C", "link-arg=-lgcc" ]

Compile for aarch64 Linux

Add toolchain:

rustup target add aarch64-unknown-linux-gnu

Add cross compiler:

dnf copr enable lantw44/aarch64-linux-gnu-toolchain

dnf install aarch64-linux-gnu-{binutils,gcc,glibc}

Add target to ~/.cargo/config:

[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc"
rustflags = [ "-C", "target-feature=+crt-static", "-C", "link-arg=-lgcc" ]

Create debian DEB and RHEL RPM packages

install:

  • cargo install cargo-deb
  • cargo install cargo-generate-rpm

And run with:

# for debian based systems:
cargo deb --target=x86_64-unknown-linux-musl

# for armhf
cargo deb --target=armv7-unknown-linux-gnueabihf --variant=armhf -p ffplayout --manifest-path=ffplayout-engine/Cargo.toml

# for arm64
cargo deb --target=aarch64-unknown-linux-gnu --variant=arm64 -p ffplayout --manifest-path=ffplayout-engine/Cargo.toml

# for rhel based systems:
cargo generate-rpm --target=x86_64-unknown-linux-musl