# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0

FROM ubuntu:22.10

RUN apt-get update \
  && apt-get install -y --no-install-recommends \
    fonts-freefont-ttf locales locales-all \
    git curl \
    doxygen hugo xsltproc \
    python3 python3-pip \
    gcc libc-dev

ENV LC_ALL "en_US.UTF-8"
ENV LANG "en_US.UTF-8"
ENV LANGUAGE en_US:en

RUN mkdir -p /tools



############
### rust ###
############

# Install cargo and mdbook
ENV RUSTUP_HOME "/tools/.rustup"
ENV CARGO_HOME "/tools/.cargo"
ENV PATH "/tools/.cargo/bin:${PATH}"
RUN curl -so- https://sh.rustup.rs | bash -s -- -y \
    && cargo install mdbook

##############
### python ###
##############

# Explicitly updating pip and setuptools is required to have these tools
# properly parse Python-version metadata, which some packages uses to
# specify that an older version of a package must be used for a certain
# Python version. If that information is not read, pip installs the latest
# version, which then fails to run.
COPY python-requirements.txt ./
RUN python3 -m pip install -U pip "setuptools<66.0.0" \
  && pip3 install -r python-requirements.txt



# Make /tools accessible to everyone
RUN chmod -R a+rwX /tools
# Cleanup
RUN apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*
