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

# List of packages installed with apt on our reference Ubuntu platform.
#
# When updating this list, please keep the yum package requirements for
# RHEL/CentOS 7 in sync. These were derived from the Ubuntu requirements
# and are maintained in yum-requirements.txt.
#
# This list of packages is also included in the documentation at
# doc/ug/install_instructions/index.md. When updating this file also check if
# doc/ug/install_instructions/index.md needs to be updated as well.
#
# Keep it sorted.
autoconf
bison
build-essential
clang-format
cmake
curl
doxygen
flex
g++
git
golang
libelf1
libelf-dev
libftdi1-2
libftdi1-dev
# A requirement of the prebuilt clang toolchain.
libncurses5
libssl-dev
libusb-1.0-0
lsb-release
make
ninja-build
perl
pkgconf
python3
python3-pip
python3-setuptools
python3-wheel
# The pip-installed version does not come with LibYAML support by default,
# which significantly speeds up the parsing/dumping of YAML files.
python3-yaml
srecord
tree
xsltproc
zlib1g-dev
xz-utils
