Spdk/scripts/pkgdep.sh
Michal Berger 6e08a3146c pkgdep: Use major version of the pip bin
pip3 can come for different python releases (3.6, 3.7, etc.) and
depending on which version is installed some maj.min bins may simply
not exist.

Change-Id: Iefc26902161e2e3578d07e99a9e742b132ef11f0
Signed-off-by: Michal Berger <michalx.berger@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/2565
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
2020-05-27 07:36:39 +00:00

376 lines
12 KiB
Bash
Executable File

#!/usr/bin/env bash
# Please run this script as root.
set -e
function usage() {
echo ""
echo "This script is intended to automate the installation of package dependencies to build SPDK."
echo "Please run this script as root user or with sudo -E."
echo ""
echo "$0"
echo " -h --help"
echo " -a --all"
echo " -d --developer-tools Install tools for developers (code styling, code coverage, etc.)"
echo " -p --pmem Additional dependencies for reduce and pmdk"
echo " -f --fuse Additional dependencies for FUSE and NVMe-CUSE"
echo " -r --rdma Additional dependencies for RDMA transport in NVMe over Fabrics"
echo " -b --docs Additional dependencies for building docs"
echo ""
exit 0
}
function install_all_dependencies() {
INSTALL_DEV_TOOLS=true
INSTALL_PMEM=true
INSTALL_FUSE=true
INSTALL_RDMA=true
INSTALL_DOCS=true
}
function install_shfmt() {
# Fetch version that has been tested
local shfmt_version=3.1.0
local shfmt=shfmt-$shfmt_version
local shfmt_dir=${SHFMT_DIR:-/opt/shfmt}
local shfmt_dir_out=${SHFMT_DIR_OUT:-/usr/bin}
local shfmt_url
local os
if hash "$shfmt" && [[ $("$shfmt" --version) == "v$shfmt_version" ]]; then
echo "$shfmt already installed"
return 0
fi 2> /dev/null
os=$(uname -s)
case "$os" in
Linux) shfmt_url=https://github.com/mvdan/sh/releases/download/v$shfmt_version/shfmt_v${shfmt_version}_linux_amd64 ;;
FreeBSD) shfmt_url=https://github.com/mvdan/sh/releases/download/v$shfmt_version/shfmt_v${shfmt_version}_freebsd_amd64 ;;
*)
echo "Not supported OS (${os:-Unknown}), skipping"
return 0
;;
esac
mkdir -p "$shfmt_dir"
mkdir -p "$shfmt_dir_out"
echo "Fetching ${shfmt_url##*/}"...
local err
if err=$(curl -f -Lo"$shfmt_dir/$shfmt" "$shfmt_url" 2>&1); then
chmod +x "$shfmt_dir/$shfmt"
ln -sf "$shfmt_dir/$shfmt" "$shfmt_dir_out"
else
cat <<- CURL_ERR
* Fetching $shfmt_url failed, $shfmt will not be available for format check.
* Error:
$err
CURL_ERR
return 0
fi
echo "$shfmt installed"
}
INSTALL_CRYPTO=false
INSTALL_DEV_TOOLS=false
INSTALL_PMEM=false
INSTALL_FUSE=false
INSTALL_RDMA=false
INSTALL_DOCS=false
while getopts 'abdfhipr-:' optchar; do
case "$optchar" in
-)
case "$OPTARG" in
help) usage ;;
all) install_all_dependencies ;;
developer-tools) INSTALL_DEV_TOOLS=true ;;
pmem) INSTALL_PMEM=true ;;
fuse) INSTALL_FUSE=true ;;
rdma) INSTALL_RDMA=true ;;
docs) INSTALL_DOCS=true ;;
*)
echo "Invalid argument '$OPTARG'"
usage
;;
esac
;;
h) usage ;;
a) install_all_dependencies ;;
d) INSTALL_DEV_TOOLS=true ;;
p) INSTALL_PMEM=true ;;
f) INSTALL_FUSE=true ;;
r) INSTALL_RDMA=true ;;
b) INSTALL_DOCS=true ;;
*)
echo "Invalid argument '$OPTARG'"
usage
;;
esac
done
trap 'set +e; trap - ERR; echo "Error!"; exit 1;' ERR
scriptsdir=$(readlink -f $(dirname $0))
rootdir=$(readlink -f $scriptsdir/..)
if [ -s /etc/redhat-release ]; then
. /etc/os-release
# Minimal install
if echo "$ID $VERSION_ID" | grep -E -q 'centos 8'; then
# Add PowerTools needed for install CUnit-devel in Centos8
yum install -y yum-utils
yum config-manager --set-enabled PowerTools
fi
yum install -y gcc gcc-c++ make CUnit-devel libaio-devel openssl-devel \
libuuid-devel libiscsi-devel ncurses-devel
if echo "$ID $VERSION_ID" | grep -E -q 'centos 8'; then
yum install -y python36
#Create hard link to use in SPDK as python
ln /etc/alternatives/python3 /usr/bin/python || true
else
yum install -y python
fi
yum install -y python3-pip
pip3 install ninja
pip3 install meson
# Additional dependencies for SPDK CLI - not available in rhel and centos
if ! echo "$ID $VERSION_ID" | grep -E -q 'rhel 7|centos 7'; then
yum install -y python3-configshell python3-pexpect
fi
# Additional dependencies for ISA-L used in compression
yum install -y autoconf automake libtool help2man
# Additional dependencies for DPDK
yum install -y numactl-devel nasm
if [[ $INSTALL_DEV_TOOLS == "true" ]]; then
# Tools for developers
# Includes Fedora, CentOS 7, RHEL 7
# Add EPEL repository for CUnit-devel and libunwind-devel
if echo "$ID $VERSION_ID" | grep -E -q 'rhel 7|centos 7|centos 8'; then
if ! rpm --quiet -q epel-release; then
yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
fi
if [[ $ID = 'rhel' ]]; then
subscription-manager repos --enable "rhel-*-optional-rpms" --enable "rhel-*-extras-rpms"
elif [[ $ID = 'centos' ]]; then
yum --enablerepo=extras install -y epel-release
fi
fi
if echo "$ID $VERSION_ID" | grep -E -q 'centos 8'; then
yum install -y python3-pycodestyle
echo "Centos 8 does not have lcov and ShellCheck dependencies"
else
yum install -y python-pycodestyle lcov ShellCheck
fi
yum install -y git astyle sg3_utils pciutils
# Additional (optional) dependencies for showing backtrace in logs
yum install -y libunwind-devel || true
install_shfmt
fi
if [[ $INSTALL_PMEM == "true" ]]; then
# Additional dependencies for building pmem based backends
yum install -y libpmemblk-devel || true
fi
if [[ $INSTALL_FUSE == "true" ]]; then
# Additional dependencies for FUSE and NVMe-CUSE
yum install -y fuse3-devel
fi
if [[ $INSTALL_RDMA == "true" ]]; then
# Additional dependencies for RDMA transport in NVMe over Fabrics
yum install -y libibverbs-devel librdmacm-devel
fi
if [[ $INSTALL_DOCS == "true" ]]; then
# Additional dependencies for building docs
yum install -y mscgen || echo "Warning: couldn't install mscgen via yum. Please install mscgen manually."
yum install -y doxygen graphviz
fi
elif [ -f /etc/debian_version ]; then
. /etc/os-release
VERSION_ID_NUM=$(sed 's/\.//g' <<< $VERSION_ID)
# Includes Ubuntu, Debian
# Minimal install
apt-get install -y gcc g++ make libcunit1-dev libaio-dev libssl-dev \
uuid-dev libiscsi-dev python libncurses5-dev libncursesw5-dev python3-pip
pip3 install ninja
pip3 install meson
# Additional dependencies for SPDK CLI - not available on older Ubuntus
apt-get install -y python3-configshell-fb python3-pexpect || echo \
"Note: Some SPDK CLI dependencies could not be installed."
# Additional dependencies for DPDK
if [[ $NAME == "Ubuntu" ]] && [[ $VERSION_ID_NUM -lt 1900 ]]; then
echo "Ubuntu $VERSION_ID needs NASM version 2.13.03 for DPDK but is not in the mainline repository."
echo "You can install it manually"
else
apt-get install -y nasm
fi
apt-get install -y libnuma-dev
# Additional dependencies for ISA-L used in compression
apt-get install -y autoconf automake libtool help2man
if [[ $INSTALL_DEV_TOOLS == "true" ]]; then
# Tools for developers
apt-get install -y git astyle pep8 lcov clang sg3-utils pciutils shellcheck
# Additional python style checker not available on ubuntu 16.04 or earlier.
apt-get install -y pycodestyle || true
# Additional (optional) dependencies for showing backtrace in logs
apt-get install -y libunwind-dev || true
# Additional dependecies for nvmf performance test script
apt-get install -y python3-paramiko
install_shfmt
fi
if [[ $INSTALL_PMEM == "true" ]]; then
# Additional dependencies for building pmem based backends
if [[ $NAME == "Ubuntu" ]] && [[ $VERSION_ID_NUM -gt 1800 ]]; then
apt-get install -y libpmem-dev
fi
fi
if [[ $INSTALL_FUSE == "true" ]]; then
# Additional dependencies for FUSE and NVMe-CUSE
if [[ $NAME == "Ubuntu" ]] && ((VERSION_ID_NUM > 1400 && VERSION_ID_NUM < 1900)); then
echo "Ubuntu $VERSION_ID does not have libfuse3-dev in mainline repository."
echo "You can install it manually"
else
apt-get install -y libfuse3-dev
fi
fi
if [[ $INSTALL_RDMA == "true" ]]; then
# Additional dependencies for RDMA transport in NVMe over Fabrics
apt-get install -y libibverbs-dev librdmacm-dev
fi
if [[ $INSTALL_DOCS == "true" ]]; then
# Additional dependencies for building docs
apt-get install -y doxygen mscgen graphviz
fi
elif [ -f /etc/SuSE-release ] || [ -f /etc/SUSE-brand ]; then
# Minimal install
zypper install -y gcc gcc-c++ make cunit-devel libaio-devel libopenssl-devel \
libuuid-devel python-base ncurses-devel ninja meson
# Additional dependencies for DPDK
zypper install -y libnuma-devel nasm
# Additional dependencies for ISA-L used in compression
zypper install -y autoconf automake libtool help2man
if [[ $INSTALL_DEV_TOOLS == "true" ]]; then
# Tools for developers
zypper install -y git-core lcov python-pycodestyle sg3_utils \
pciutils ShellCheck
# Additional (optional) dependencies for showing backtrace in logs
zypper install libunwind-devel || true
install_shfmt
fi
if [[ $INSTALL_PMEM == "true" ]]; then
# Additional dependencies for building pmem based backends
zypper install -y libpmemblk-devel
fi
if [[ $INSTALL_FUSE == "true" ]]; then
# Additional dependencies for FUSE and NVMe-CUSE
zypper install -y fuse3-devel
fi
if [[ $INSTALL_RDMA == "true" ]]; then
# Additional dependencies for RDMA transport in NVMe over Fabrics
zypper install -y rdma-core-devel
fi
if [[ $INSTALL_DOCS == "true" ]]; then
# Additional dependencies for building docs
zypper install -y doxygen mscgen graphviz
fi
elif [ $(uname -s) = "FreeBSD" ]; then
# Minimal install
pkg install -y gmake cunit openssl git bash misc/e2fsprogs-libuuid python \
ncurses ninja meson
# Additional dependencies for ISA-L used in compression
pkg install -y autoconf automake libtool help2man
if [[ $INSTALL_DEV_TOOLS == "true" ]]; then
# Tools for developers
pkg install -y devel/astyle bash py27-pycodestyle \
misc/e2fsprogs-libuuid sysutils/sg3_utils nasm
install_shfmt
fi
if [[ $INSTALL_DOCS == "true" ]]; then
# Additional dependencies for building docs
pkg install -y doxygen mscgen graphviz
fi
elif [ -f /etc/arch-release ]; then
# Install main dependencies
pacman -Sy --needed --noconfirm gcc make cunit libaio openssl \
libutil-linux libiscsi python ncurses ninja meson
# Additional dependencies for SPDK CLI
pacman -Sy --needed --noconfirm python-pexpect python-pip
pip install configshell_fb
# Additional dependencies for DPDK
pacman -Sy --needed --noconfirm numactl nasm
# Additional dependencies for ISA-L used in compression
pacman -Sy --needed --noconfirm autoconf automake libtool help2man
if [[ $INSTALL_DEV_TOOLS == "true" ]]; then
# Tools for developers
pacman -Sy --needed --noconfirm git astyle autopep8 \
clang sg3_utils pciutils shellcheck
# Additional (optional) dependencies for showing backtrace in logs
pacman -Sy --needed --noconfirm libunwind
#fakeroot needed to instal via makepkg
pacman -Sy --needed --noconfirm fakeroot
su - $SUDO_USER -c "pushd /tmp;
git clone https://aur.archlinux.org/perl-perlio-gzip.git;
cd perl-perlio-gzip;
yes y | makepkg -si --needed;
cd ..; rm -rf perl-perlio-gzip
popd"
# sed is to modify sources section in PKGBUILD
# By default it uses git:// which will fail behind proxy, so
# redirect it to http:// source instead
su - $SUDO_USER -c "pushd /tmp;
git clone https://aur.archlinux.org/lcov-git.git;
cd lcov-git;
sed -i 's/git:/git+http:/' PKGBUILD;
makepkg -si --needed --noconfirm;
cd .. && rm -rf lcov-git;
popd"
install_shfmt
fi
if [[ $INSTALL_PMEM == "true" ]]; then
# Additional dependencies for building pmem based backends
pacman -Sy --needed --noconfirm ndctl pkg-config
git clone https://github.com/pmem/pmdk.git /tmp/pmdk -b 1.6.1
make -C /tmp/pmdk -j$(nproc)
make install prefix=/usr -C /tmp/pmdk
echo "/usr/local/lib" > /etc/ld.so.conf.d/pmdk.conf
ldconfig
rm -rf /tmp/pmdk
fi
if [[ $INSTALL_FUSE == "true" ]]; then
# Additional dependencies for FUSE and NVMe-CUSE
pacman -Sy --needed --noconfirm fuse3
fi
if [[ $INSTALL_RDMA == "true" ]]; then
# Additional dependencies for RDMA transport in NVMe over Fabrics
if [[ -n "$http_proxy" ]]; then
gpg_options=" --keyserver hkp://pgp.mit.edu:11371 --keyserver-options \"http-proxy=$http_proxy\""
fi
su - $SUDO_USER -c "gpg $gpg_options --recv-keys 29F0D86B9C1019B1"
su - $SUDO_USER -c "pushd /tmp;
git clone https://aur.archlinux.org/rdma-core.git;
cd rdma-core;
makepkg -si --needed --noconfirm;
cd .. && rm -rf rdma-core;
popd"
fi
if [[ $INSTALL_DOCS == "true" ]]; then
# Additional dependencies for building docs
pacman -Sy --needed --noconfirm doxygen graphviz
pacman -S --noconfirm --needed gd ttf-font
su - $SUDO_USER -c "pushd /tmp;
git clone https://aur.archlinux.org/mscgen.git;
cd mscgen;
makepkg -si --needed --noconfirm;
cd .. && rm -rf mscgen;
popd"
fi
else
echo "pkgdep: unknown system type."
exit 1
fi