diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..eb5a316c --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +target diff --git a/Cargo.toml b/Cargo.toml index 2f12b0bb..32ff0ba7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -88,5 +88,5 @@ section = "sound" priority = "optional" assets = [ ["target/release/librespot", "usr/bin/", "755"], - ["assets/librespot.service", "lib/systemd/system/", "644"] + ["contrib/librespot.service", "lib/systemd/system/", "644"] ] diff --git a/README.md b/README.md index 95331fbf..eb92b115 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,28 @@ The following backends are currently available : - PortAudio - PulseAudio +## Cross-compiling +A cross compilation environment is provided as a docker image. +Build the image from the root of the project with the following command : + +``` +$ docker build -t librespot-cross -f contrib/Dockerfile . +``` + +The resulting image can be used to build librespot for linux x86_64, armhf and armel. +The compiled binaries will be located in /tmp/librespot-build + +``` +docker run -v /tmp/librespot-build:/build librespot-cross +``` + +If only one architecture is desired, cargo can be invoked directly with the appropriate options : +```shell +docker run -v /tmp/librespot-build:/build librespot-cross cargo build --release --no-default-features --features "with-syntex alsa-backend" +docker run -v /tmp/librespot-build:/build librespot-cross cargo build --release --target arm-unknown-linux-gnueabihf --no-default-features --features "with-syntex alsa-backend" +docker run -v /tmp/librespot-build:/build librespot-cross cargo build --release --target arm-unknown-linux-gnueabi --no-default-features --features "with-syntex alsa-backend" +``` + ## Development When developing *librespot*, it is preferable to use Rust nightly, and build it using the following : ```shell diff --git a/contrib/Dockerfile b/contrib/Dockerfile new file mode 100644 index 00000000..44d4988f --- /dev/null +++ b/contrib/Dockerfile @@ -0,0 +1,38 @@ +# Cross compilation environment for librespot +# Build the docker image from the root of the project with the following command : +# $ docker build -t librespot-cross -f contrib/Dockerfile . +# +# The resulting image can be used to build librespot for linux x86_64, armhf and armel. +# $ docker run -v /tmp/librespot-build:/build librespot-cross +# +# The compiled binaries will be located in /tmp/librespot-build +# +# If only one architecture is desired, cargo can be invoked directly with the appropriate options : +# $ docker run -v /tmp/librespot-build:/build librespot-cross cargo build --release --no-default-features --features "with-syntex alsa-backend" +# $ docker run -v /tmp/librespot-build:/build librespot-cross cargo build --release --target arm-unknown-linux-gnueabihf --no-default-features --features "with-syntex alsa-backend" +# $ docker run -v /tmp/librespot-build:/build librespot-cross cargo build --release --target arm-unknown-linux-gnueabi --no-default-features --features "with-syntex alsa-backend" +# + +FROM debian:stretch + +RUN dpkg --add-architecture armhf +RUN dpkg --add-architecture armel +RUN apt-get update + +RUN apt-get install -y curl build-essential crossbuild-essential-armhf crossbuild-essential-armel +RUN apt-get install -y libasound2-dev libasound2-dev:armhf libasound2-dev:armel + +RUN curl https://sh.rustup.rs -sSf | sh -s -- -y +ENV PATH="/root/.cargo/bin/:${PATH}" +RUN rustup target add arm-unknown-linux-gnueabi +RUN rustup target add arm-unknown-linux-gnueabihf + +RUN echo '[target.arm-unknown-linux-gnueabihf]\nlinker = "arm-linux-gnueabihf-gcc"' > ~/.cargo/config +RUN echo '[target.arm-unknown-linux-gnueabi]\nlinker = "arm-linux-gnueabi-gcc"' > ~/.cargo/config + +RUN mkdir /build +ENV CARGO_TARGET_DIR /build + +ADD . /src +WORKDIR /src +CMD ["/src/contrib/docker-build.sh"] diff --git a/contrib/docker-build.sh b/contrib/docker-build.sh new file mode 100755 index 00000000..984e1293 --- /dev/null +++ b/contrib/docker-build.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +set -eux + +cargo build --release --no-default-features --features "with-syntex alsa-backend" +cargo build --release --target arm-unknown-linux-gnueabihf --no-default-features --features "with-syntex alsa-backend" +cargo build --release --target arm-unknown-linux-gnueabi --no-default-features --features "with-syntex alsa-backend" diff --git a/assets/librespot.service b/contrib/librespot.service similarity index 100% rename from assets/librespot.service rename to contrib/librespot.service