1FROM ubuntu:20.04 as dev 2 3ARG TARGETARCH 4ARG RUST_TOOLCHAIN="1.52.1" 5ARG CLH_SRC_DIR="/cloud-hypervisor" 6ARG CLH_BUILD_DIR="$CLH_SRC_DIR/build" 7ARG CARGO_REGISTRY_DIR="$CLH_BUILD_DIR/cargo_registry" 8ARG CARGO_GIT_REGISTRY_DIR="$CLH_BUILD_DIR/cargo_git_registry" 9 10ENV CARGO_HOME=/usr/local/rust 11ENV RUSTUP_HOME=$CARGO_HOME 12ENV PATH="$PATH:$CARGO_HOME/bin" 13 14# Install all CI dependencies 15RUN apt-get update \ 16 && apt-get -yq upgrade \ 17 && DEBIAN_FRONTEND=noninteractive apt-get install -yq \ 18 build-essential \ 19 bc \ 20 docker.io \ 21 curl \ 22 wget \ 23 sudo \ 24 mtools \ 25 musl-tools \ 26 libssl-dev \ 27 pkg-config \ 28 flex \ 29 bison \ 30 libelf-dev \ 31 qemu-utils \ 32 qemu-system \ 33 libglib2.0-dev \ 34 libpixman-1-dev \ 35 libseccomp-dev \ 36 libcap-ng-dev \ 37 socat \ 38 dosfstools \ 39 cpio \ 40 python \ 41 python3 \ 42 python3-setuptools \ 43 ntfs-3g \ 44 openvswitch-switch-dpdk \ 45 python3-distutils \ 46 uuid-dev \ 47 && apt-get clean \ 48 && rm -rf /var/lib/apt/lists/* 49 50RUN update-alternatives --set ovs-vswitchd /usr/lib/openvswitch-switch-dpdk/ovs-vswitchd-dpdk 51 52RUN if [ "$TARGETARCH" = "amd64" ]; then \ 53 apt-get update \ 54 && apt-get -yq upgrade \ 55 && DEBIAN_FRONTEND=noninteractive apt-get install -yq gcc-multilib \ 56 && apt-get clean \ 57 && rm -rf /var/lib/apt/lists/*; fi 58 59RUN if [ "$TARGETARCH" = "arm64" ]; then \ 60 # On AArch64, `setcap` binary should be installed via `libcap2-bin`. 61 # The `setcap` binary is used in integration tests. 62 apt-get update \ 63 && apt-get -yq upgrade \ 64 && DEBIAN_FRONTEND=noninteractive apt-get install -yq libcap2-bin \ 65 && apt-get clean \ 66 && rm -rf /var/lib/apt/lists/*; fi 67 68# Fix the libssl-dev install 69RUN export ARCH="$(uname -m)" \ 70 && cp /usr/include/$ARCH-linux-gnu/openssl/opensslconf.h /usr/include/openssl/ 71ENV X86_64_UNKNOWN_LINUX_GNU_OPENSSL_LIB_DIR=/usr/lib/x86_64-linux-gnu/ 72ENV X86_64_UNKNOWN_LINUX_MUSL_OPENSSL_LIB_DIR=/usr/lib/x86_64-linux-gnu/ 73ENV AARCH64_UNKNOWN_LINUX_GNU_OPENSSL_LIB_DIR=/usr/lib/aarch64-linux-gnu/ 74ENV AARCH64_UNKNOWN_LINUX_MUSL_OPENSSL_LIB_DIR=/usr/lib/aarch64-linux-gnu/ 75ENV OPENSSL_INCLUDE_DIR=/usr/include/ 76 77# Install the rust toolchain 78RUN export ARCH="$(uname -m)" \ 79 && nohup curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain "$RUST_TOOLCHAIN" \ 80 && rustup target add $ARCH-unknown-linux-musl --toolchain "$RUST_TOOLCHAIN" \ 81 && if [ "$TARGETARCH" = "amd64" ]; then rustup toolchain add $RUST_TOOLCHAIN-x86_64-unknown-linux-musl; fi \ 82 && if [ "$TARGETARCH" = "amd64" ]; then rustup component add rustfmt; fi \ 83 && if [ "$TARGETARCH" = "amd64" ]; then rustup component add clippy; fi \ 84 && cargo install cargo-audit \ 85 && rm -rf "$CARGO_HOME/registry" \ 86 && ln -s "$CARGO_REGISTRY_DIR" "$CARGO_HOME/registry" \ 87 && rm -rf "$CARGO_HOME/git" \ 88 && ln -s "$CARGO_GIT_REGISTRY_DIR" "$CARGO_HOME/git" 89 90# Set the rust environment 91RUN echo 'source $CARGO_HOME/env' >> $HOME/.bashrc \ 92 && mkdir $HOME/.cargo \ 93 && ln -s $CARGO_HOME/env $HOME/.cargo/env 94