FROM rust:1.46.0 AS mir_json

ADD dependencies/mir-json /mir-json
WORKDIR /mir-json
RUN rustup toolchain install nightly-2020-03-22 --force
RUN rustup component add --toolchain nightly-2020-03-22 rustc-dev
RUN rustup default nightly-2020-03-22
RUN cargo install --locked

FROM haskell:8.8.4 AS build

RUN apt-get update && apt-get install -y wget libncurses-dev unzip

COPY --from=mir_json /usr/local/cargo /usr/local/cargo
COPY --from=mir_json /usr/local/rustup /usr/local/rustup
WORKDIR /usr/local/bin
RUN curl -o solvers.zip -sL "https://github.com/GaloisInc/what4-solvers/releases/download/snapshot-20210917/ubuntu-18.04-bin.zip"
RUN unzip solvers.zip && rm solvers.zip && chmod +x *

ENV CARGO_HOME=/usr/local/cargo
ENV RUSTUP_HOME=/usr/local/rustup
ENV LD_LIBRARY_PATH=/usr/local/lib:/usr/local/rustup/lib
ENV LANG=C.UTF-8 \
    LC_ALL=C.UTF-8

RUN cabal v2-update

ARG DIR=/crux-mir
RUN mkdir -p ${DIR}/build
ADD crucible ${DIR}/build/crucible
ADD crucible-concurrency ${DIR}/build/crucible-concurrency
ADD crucible-syntax ${DIR}/build/crucible-syntax
ADD crux ${DIR}/build/crux
ADD crux-mir ${DIR}/build/crux-mir
ADD dependencies ${DIR}/build/dependencies
ADD .github/cabal.project.crux-mir ${DIR}/build/cabal.project
ADD cabal.GHC-8.8.4.config ${DIR}/build/cabal.project.freeze

WORKDIR ${DIR}/build
RUN cabal v2-build --only-dependencies crux-mir
RUN cabal v2-build crux-mir
RUN cp `cabal v2-exec which crux-mir` /usr/local/bin
RUN cp /usr/local/cargo/bin/* /usr/local/bin/
RUN rustup default nightly-2020-03-22
WORKDIR ${DIR}/build/crux-mir
RUN ./translate_libs.sh
WORKDIR ${DIR}/build
RUN cabal v2-test crux-mir

FROM debian:buster-slim

USER root
RUN apt-get update
RUN apt-get install -y libgmp10 zlibc zlib1g libcurl4

ARG DIR=/crux-mir
COPY --from=mir_json /usr/local/cargo /usr/local/cargo
COPY --from=mir_json /usr/local/rustup /usr/local/rustup
COPY --from=build /usr/local/bin/* /usr/local/bin/
COPY --from=build /crux-mir/build/crux-mir/rlibs /crux-mir/rlibs
RUN mkdir -p ${DIR}/workspace

WORKDIR ${DIR}/workspace

ENV CARGO_HOME=/usr/local/cargo \
    RUSTUP_HOME=/usr/local/rustup \
    CRUX_RUST_LIBRARY_PATH=/crux-mir/rlibs \
    LD_LIBRARY_PATH=/usr/local/lib:/usr/local/rustup/lib \
    LANG=C.UTF-8 \
    LC_ALL=C.UTF-8
ENTRYPOINT ["/usr/local/bin/cargo", "crux-test"]
