# 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 yum on RHEL/CentOS 7 platforms.
#
# 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
libssl-dev
libusb-1.0-0
lsb-release
make
# A requirement of the prebuilt clang toolchain.
ncurses
ninja-build
openssl11-libs
openssl11-devel
perl
pkgconf
python3
python3-pip
python3-setuptools
python3-wheel
srecord
tree
xsltproc
zlib1g-dev
xz-utils
