ffplayout/docs/developer.md
2022-12-04 11:12:01 +01:00

3.4 KiB

Build ffplayout

For compiling use always the news Rust version, the best is to install it from rustup.

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