2024-07-03 04:25:52 +00:00
#!/bin/bash
###########################################
## Package installation
##
## Written: Jordan Carlin, jcarlin@hmc.edu
## Created: 30 June 2024
## Modified:
##
## Purpose: Package manager installation for open source tool chain installation script
##
## A component of the CORE-V-WALLY configurable RISC-V project.
## https://github.com/openhwgroup/cvw
##
## Copyright (C) 2021-23 Harvey Mudd College & Oklahoma State University
##
## SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1
##
## Licensed under the Solderpad Hardware License v 2.1 (the “License”); you may not use this file
## except in compliance with the License, or, at your option, the Apache License version 2.0. You
## may obtain a copy of the License at
##
## https:##solderpad.org/licenses/SHL-2.1/
##
## Unless required by applicable law or agreed to in writing, any work distributed under the
## License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
## either express or implied. See the License for the specific language governing permissions
## and limitations under the License.
################################################################################################
set -e # break on error
# Colors
BOLD = '\033[1m'
SECTION_COLOR = '\033[95m' $BOLD
SUCCESS_COLOR = '\033[92m'
FAIL_COLOR = '\033[91m'
2024-07-04 06:42:31 +00:00
ENDC = '\033[0m' # Reset to default color
2024-07-03 04:25:52 +00:00
# If run standalone, determine distro information. Otherwise, use info from main install script
if [ -z " $FAMILY " ] ; then
2024-07-03 05:17:43 +00:00
dir = " $( cd " $( dirname " ${ BASH_SOURCE [0] } " ) " && pwd ) "
source " ${ dir } " /wally-distro-check.sh
2024-07-03 04:25:52 +00:00
fi
2024-07-04 06:42:31 +00:00
# Generate list of packages to install and package manager commands based on distro
# Packages are grouped by which tool requires them. If multiple tools need a package, it is included in the first tool only
2024-07-20 07:45:10 +00:00
if [ " $FAMILY " = = rhel ] ; then
2024-07-23 05:37:23 +00:00
PYTHON_VERSION = python3.12
2024-07-03 04:25:52 +00:00
PACKAGE_MANAGER = "dnf"
2024-07-23 04:35:21 +00:00
UPDATE_COMMAND = " sudo $PACKAGE_MANAGER update -y "
2024-07-26 18:05:12 +00:00
GENERAL_PACKAGES += ( which rsync git make cmake " $PYTHON_VERSION " " $PYTHON_VERSION " -pip curl wget tar pkgconf-pkg-config dialog mutt ssmtp)
2024-07-23 05:37:23 +00:00
GNU_PACKAGES += ( autoconf automake libmpc-devel mpfr-devel gmp-devel gawk bison flex texinfo gperf libtool patchutils bc gcc gcc-c++ zlib-devel expat-devel libslirp-devel)
QEMU_PACKAGES += ( glib2-devel libfdt-devel pixman-devel bzip2 ninja-build)
SPIKE_PACKAGES += ( dtc boost-regex boost-system)
VERILATOR_PACKAGES += ( help2man perl clang ccache gperftools numactl mold)
2024-07-26 17:56:25 +00:00
BUILDROOT_PACKAGES += ( ncurses-base ncurses ncurses-libs ncurses-devel gcc-gfortran cpio) # gcc-gfortran is only needed for compiling spec benchmarks on buildroot linux
2024-08-29 15:42:41 +00:00
# Extra packages not availale in rhel8, nice for Verilator
2024-07-23 07:16:27 +00:00
if ( ( RHEL_VERSION >= 9 ) ) ; then
2024-07-20 06:46:05 +00:00
VERILATOR_PACKAGES += ( perl-doc)
2024-07-03 04:25:52 +00:00
fi
# A newer version of gcc is required for qemu
2024-07-20 06:46:05 +00:00
OTHER_PACKAGES = ( gcc-toolset-13)
2024-11-24 04:04:39 +00:00
elif [ [ " $FAMILY " = = ubuntu || " $FAMILY " = = debian ] ] ; then
2024-07-23 05:37:23 +00:00
if ( ( UBUNTU_VERSION >= 24 ) ) ; then
PYTHON_VERSION = python3.12
2024-07-23 07:16:27 +00:00
elif ( ( UBUNTU_VERSION >= 22 ) ) ; then
2024-07-23 05:37:23 +00:00
PYTHON_VERSION = python3.11
2024-07-23 07:16:27 +00:00
elif ( ( UBUNTU_VERSION >= 20 ) ) ; then
PYTHON_VERSION = python3.9
2024-07-23 05:37:23 +00:00
OTHER_PACKAGES += ( gcc-10 g++-10 cpp-10) # Newer version of gcc needed for Verilator
2024-11-24 04:04:39 +00:00
elif ( ( DEBIAN_VERSION >= 12 ) ) ; then
PYTHON_VERSION = python3.11
2024-11-24 05:51:57 +00:00
elif ( ( DEBIAN_VERSION >= 11 ) ) ; then
PYTHON_VERSION = python3.9
fi
# Mold not available in older distros for Verilator, will download binary instead
if ( ( UBUNTU_VERSION != 20 && DEBIAN_VERSION != 11 ) ) ; then
VERILATOR_PACKAGES += ( mold)
2024-07-23 05:37:23 +00:00
fi
2024-07-23 04:35:21 +00:00
PACKAGE_MANAGER = "DEBIAN_FRONTEND=noninteractive apt-get"
UPDATE_COMMAND = " sudo $PACKAGE_MANAGER update -y && sudo $PACKAGE_MANAGER upgrade -y --with-new-pkgs "
2024-11-24 06:08:29 +00:00
GENERAL_PACKAGES += ( rsync git make cmake " $PYTHON_VERSION " python3-pip " $PYTHON_VERSION " -venv curl wget tar unzip pkg-config dialog mutt ssmtp)
2024-11-24 04:04:39 +00:00
GNU_PACKAGES += ( autoconf automake autotools-dev libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat1-dev ninja-build libglib2.0-dev libslirp-dev)
2024-07-23 05:37:23 +00:00
QEMU_PACKAGES += ( libfdt-dev libpixman-1-dev)
SPIKE_PACKAGES += ( device-tree-compiler libboost-regex-dev libboost-system-dev)
VERILATOR_PACKAGES += ( help2man perl g++ clang ccache libunwind-dev libgoogle-perftools-dev numactl perl-doc libfl2 libfl-dev zlib1g)
2024-07-26 04:16:00 +00:00
BUILDROOT_PACKAGES += ( ncurses-base ncurses-bin libncurses-dev gfortran cpio) # gfortran is only needed for compiling spec benchmarks on buildroot linux
2024-07-26 17:56:25 +00:00
VIVADO_PACKAGES += ( libncurses*) # Vivado hangs on the third stage of installation without this
2024-07-03 04:25:52 +00:00
fi
2024-07-04 06:42:31 +00:00
# Check if required packages are installed or install/update them depending on passed flag.
2024-07-20 07:45:10 +00:00
if [ " ${ 1 } " = = "--check" ] ; then
2024-07-23 06:10:45 +00:00
section_header "Checking Dependencies from Package Manager"
2024-07-20 07:45:10 +00:00
if [ " $FAMILY " = = rhel ] ; then
2024-08-29 15:42:41 +00:00
for pack in " ${ GENERAL_PACKAGES [@] } " " ${ GNU_PACKAGES [@] } " " ${ QEMU_PACKAGES [@] } " " ${ SPIKE_PACKAGES [@] } " " ${ VERILATOR_PACKAGES [@] } " " ${ BUILDROOT_PACKAGES [@] } " " ${ OTHER_PACKAGES [@] } " ; do
2024-07-03 04:25:52 +00:00
rpm -q " $pack " > /dev/null || ( echo -e " ${ FAIL_COLOR } Missing packages detected ( ${ WARNING_COLOR } $pack ${ FAIL_COLOR } ). Run as root to auto-install or run wally-package-install.sh first. ${ ENDC } " && exit 1)
done
2024-07-20 07:45:10 +00:00
elif [ " $FAMILY " = = ubuntu ] ; then
2024-08-29 15:42:41 +00:00
for pack in " ${ GENERAL_PACKAGES [@] } " " ${ GNU_PACKAGES [@] } " " ${ QEMU_PACKAGES [@] } " " ${ SPIKE_PACKAGES [@] } " " ${ VERILATOR_PACKAGES [@] } " " ${ BUILDROOT_PACKAGES [@] } " " ${ OTHER_PACKAGES [@] } " ; do
2024-07-03 04:25:52 +00:00
dpkg -l " $pack " | grep "ii" > /dev/null || ( echo -e " ${ FAIL_COLOR } Missing packages detected ( ${ WARNING_COLOR } $pack ${ FAIL_COLOR } ). Run as root to auto-install or run wally-package-install.sh first. " && exit 1)
done
fi
echo -e " ${ OK_COLOR } All required packages detected. ${ ENDC } "
else
# Check if root, otherwise exit with error message
[ " ${ EUID : = $( id -u) } " -ne 0 ] && echo -e " \n ${ FAIL_COLOR } Must be run as root ${ ENDC } " && exit 1
2024-07-23 06:10:45 +00:00
section_header "Installing/Updating Dependencies from Package Manager"
2024-07-04 06:42:31 +00:00
# Enable extra repos necessary for rhel
2024-07-20 07:45:10 +00:00
if [ " $FAMILY " = = rhel ] ; then
2024-07-03 04:25:52 +00:00
sudo dnf install -y dnf-plugins-core
sudo dnf group install -y "Development Tools"
2024-07-20 07:45:10 +00:00
if [ " $ID " = = rhel ] ; then
2024-07-03 04:25:52 +00:00
sudo subscription-manager repos --enable " codeready-builder-for-rhel- $RHEL_VERSION - $( arch) -rpms "
sudo dnf install -y " https://dl.fedoraproject.org/pub/epel/epel-release-latest- $RHEL_VERSION .noarch.rpm "
else # RHEL clone
2024-07-20 07:45:10 +00:00
if ( ( RHEL_VERSION = = 8 ) ) ; then
2024-07-03 04:25:52 +00:00
sudo dnf config-manager -y --set-enabled powertools
else # Version 9
sudo dnf config-manager -y --set-enabled crb
fi
sudo dnf install -y epel-release
fi
fi
# Update and Upgrade tools
eval " $UPDATE_COMMAND "
2024-07-04 06:42:31 +00:00
# Install packages listed above using appropriate package manager
2024-08-29 15:42:41 +00:00
sudo $PACKAGE_MANAGER install -y " ${ GENERAL_PACKAGES [@] } " " ${ GNU_PACKAGES [@] } " " ${ QEMU_PACKAGES [@] } " " ${ SPIKE_PACKAGES [@] } " " ${ VERILATOR_PACKAGES [@] } " " ${ BUILDROOT_PACKAGES [@] } " " ${ OTHER_PACKAGES [@] } " " ${ VIVADO_PACKAGES [@] } "
2024-10-30 22:37:33 +00:00
# Post install steps
# Vivado looks for ncurses5 libraries, but Ubuntu 24.04 only has ncurses6
# Create symbolic links to the ncurses6 libraries to fool Vivado
if ( ( UBUNTU_VERSION >= 24 ) ) ; then
2024-10-30 22:39:01 +00:00
sudo ln -vsf /lib/x86_64-linux-gnu/libncurses.so.6 /lib/x86_64-linux-gnu/libncurses.so.5
sudo ln -vsf /lib/x86_64-linux-gnu/libtinfo.so.6 /lib/x86_64-linux-gnu/libntinfo.so.5
2024-10-30 22:37:33 +00:00
fi
2024-07-03 04:25:52 +00:00
echo -e " ${ SUCCESS_COLOR } Packages successfully installed. ${ ENDC } "
fi