# 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.
"Development Tools"
autoconf
bison
cmake
curl
doxygen
epel-release
flex
gcc-c++
git
golang
elfutils-libelf
elfutils-libelf-devel
libftdi
libftdi-devel
libudev-devel
libusbx
lld
make
openssl-devel
redhat-lsb-core
# A requirement of the prebuilt clang toolchain.
ncurses
ninja-build
openssl11-libs
openssl11-devel
perl
pkgconfig
python3
python3-pip
python3-setuptools
python3-wheel
ShellCheck
srecord
tree
libxslt
zlib-devel
xz-libs
