- 
                Notifications
    You must be signed in to change notification settings 
- Fork 429
Recipes
This contains recipes for common logic use cases.
Table of Contents
You can either use the vendored or system packages for the openssl crate. See openssl-certs for a working project.
Use the vendored feature of the openssl crate by adding the following to your dependencies in Cargo.toml:
openssl = { version = "0.10", features = ["vendored"] }To install OpenSSL in an image with apt-get available add the following to your Cross configuration:
[target.x86_64-unknown-linux-gnu]
pre-build = [
    "dpkg --add-architecture $CROSS_DEB_ARCH",
    "apt-get update && apt-get install --assume-yes libssl-dev:$CROSS_DEB_ARCH"
]A sample Dockerfile for aarch64 with OpenSSL support is:
FROM ghcr.io/cross-rs/aarch64-unknown-linux-gnu:edge
RUN dpkg --add-architecture arm64
RUN apt-get update && apt-get install --assume-yes libssl-dev:arm64Build this image and use it, as is described extensively in Custom Images.
sccache support can be done either by sccache from source or using a pre-built binary. See sccache for a working project using pre-build hooks.
- Create a script to install sccache in the image, either from a pre-built binary or from source.
- Extend a Dockerfile to install sccache in the image.
- Passthrough the appropriate environment variables in Cross.toml when using sccache.
First, we need a script to copy into our image as sccache.sh (make sure the script is executable).
#!/bin/bash
set -x
set -euo pipefail
# shellcheck disable=SC1091
. lib.sh
main() {
    local triple
    local tag
    local td
    local url="https://github.com/mozilla/sccache"
    triple="${1}"
    install_packages unzip tar
    # Download our package, then install our binary.
    td="$(mktemp -d)"
    pushd "${td}"
    tag=$(git ls-remote --tags --refs --exit-code \
        "${url}" \
        | cut -d/ -f3 \
        | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' \
        | sort --version-sort \
        | tail -n1)
    curl -LSfs "${url}/releases/download/${tag}/sccache-${tag}-${triple}.tar.gz" \
        -o sccache.tar.gz
    tar -xvf sccache.tar.gz
    rm sccache.tar.gz
    cp "sccache-${tag}-${triple}/sccache" "/usr/bin/sccache"
    chmod +x "/usr/bin/sccache"
    # clean up our install
    purge_packages
    popd
    rm -rf "${td}"
    rm "${0}"
}
main "${@}"When installing from source, we can toggle various features, however it is highly recommended to use the vendored OpenSSL.
#!/bin/bash
set -x
set -euo pipefail
# shellcheck disable=SC1091
. lib.sh
main() {
    local triple
    local tag
    local td
    local url="https://github.com/mozilla/sccache"
    triple="${1}"
    install_packages ca-certificates curl unzip
    # install rust and cargo to build sccache
    export RUSTUP_HOME=/tmp/rustup
    export CARGO_HOME=/tmp/cargo
    curl --retry 3 -sSfL https://sh.rustup.rs -o rustup-init.sh
    sh rustup-init.sh -y --no-modify-path
    rm rustup-init.sh
    export PATH="${CARGO_HOME}/bin:${PATH}"
    rustup target add "${triple}"
    # download the source code from the latest sccache release
    td="$(mktemp -d)"
    pushd "${td}"
    tag=$(git ls-remote --tags --refs --exit-code \
        "${url}" \
        | cut -d/ -f3 \
        | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' \
        | sort --version-sort \
        | tail -n1)
    curl -LSfs "${url}/archive/refs/tags/${tag}.zip" \
        -o sccache.zip
    unzip sccache.zip
    mv "sccache-${tag//v/}" sccache
    rm sccache.zip
    # build from source for the desired architecture
    # you can also use additional features here
    cd sccache
    cargo build --release --target "${triple}" \
        --features=all,"openssl/vendored"
    cp "target/${triple}/release/sccache" "/usr/bin/sccache"
    # clean up our install
    rm -r "${RUSTUP_HOME}" "${CARGO_HOME}"
    purge_packages
    popd
    rm -rf "${td}"
    rm "${0}"
}
main "${@}"Next, extend our Dockerfile and build our image, saved as Dockerfile.${target}, where ${target} is replaced by our desired target (such as x86_64-unknown-linux-musl).
FROM ghcr.io/cross-rs/${target}:main
ARG DEBIAN_FRONTEND=noninteractive
COPY sccache.sh /
RUN /sccache.sh x86_64-unknown-linux-musl
ENV RUSTC_WRAPPER="/usr/bin/sccache"Build our Docker image with:
docker build --tag ${target}:sccache \
    --file Dockerfile.${target} .Now, we need to passthrough our environment variables and ensure they're exported when running cross. In Cross.toml, define:
[target.${target}]
image = "${target}:sccache"
[build.env]
passthrough = [
    "SCCACHE_ERROR_LOG",
    "SCCACHE_LOG",
    "SCCACHE_AZURE_CONNECTION_STRING",
    "SCCACHE_AZURE_BLOB_CONTAINER",
    "SCCACHE_DIR",
]Finally, we can run cross with our sccache environment variables defined using cross:
SCCACHE_LOG=trace SCCACHE_DIR=/path/to/sccache/cache \
    cross build --target "${target}" --verboseIn order to use Clang on CentOS 7, you must both install the SCL repository, the LLVM toolset, and set the necessary paths to clang and LLVM. A sample Dockerfile is as follows:
FROM ghcr.io/cross-rs/x86_64-unknown-linux-gnu:main-centos
RUN yum update -y && \
    yum install centos-release-scl -y && \
    yum install llvm-toolset-7 -y
ENV LIBCLANG_PATH=/opt/rh/llvm-toolset-7/root/usr/lib64/ \
    LIBCLANG_STATIC_PATH=/opt/rh/llvm-toolset-7/root/usr/lib64/ \
    CLANG_PATH=/opt/rh/llvm-toolset-7/root/usr/bin/clangBuild this image and use it, as is described extensively in Custom Images.