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

# Keep sorted.
autoconf
bison
build-essential
clang-format
curl
flake8
flex
g++
git
libelf1
libelf-dev
libftdi1-2
libftdi1-dev
libssl-dev
libusb-1.0-0
make
ninja-build
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 in fusesoc.
python3-yaml
srecord
tree
zlib1g-dev
