120708f35SMichal Berger#!/usr/bin/env bash 2eb53c232Spaul luse# SPDX-License-Identifier: BSD-3-Clause 3eb53c232Spaul luse# Copyright (C) 2020 Intel Corporation 4eb53c232Spaul luse# All rights reserved. 5eb53c232Spaul luse# 620708f35SMichal Bergerinstall_liburing() { 720708f35SMichal Berger local GIT_REPO_LIBURING=https://github.com/axboe/liburing.git 820708f35SMichal Berger local liburing_dir=/usr/local/src/liburing 920708f35SMichal Berger 1020708f35SMichal Berger if [[ -d $liburing_dir ]]; then 1120708f35SMichal Berger echo "liburing source already present, not cloning" 1220708f35SMichal Berger else 13b5fd1f86SMaciej Wawryk mkdir -p $liburing_dir 1420708f35SMichal Berger git clone "${GIT_REPO_LIBURING}" "$liburing_dir" 1520708f35SMichal Berger fi 16252ba4dfSMichal Berger # Use commit we know we can compile against. See #1673 as a reference. 173bf8f8a3SSimon A. F. Lund git -C "$liburing_dir" checkout liburing-2.2 18fecffda6SMichal Berger (cd "$liburing_dir" && ./configure --libdir=/usr/lib64 --libdevdir=/usr/lib64 && make install) 193a1d4786SMichal Berger echo /usr/lib64 > /etc/ld.so.conf.d/spdk-liburing.conf 20*0cdba6b1SMichal Berger ldconfig -X 2120708f35SMichal Berger} 2220708f35SMichal Berger 2313603217SZhangfei Gaoinstall_uadk() { 2413603217SZhangfei Gao local GIT_REPO_UADK=https://github.com/Linaro/uadk 2513603217SZhangfei Gao local uadk_dir=/usr/local/src/uadk 2613603217SZhangfei Gao 2713603217SZhangfei Gao if [[ -d $uadk_dir ]]; then 2813603217SZhangfei Gao echo "uadk source already present, not cloning" 2913603217SZhangfei Gao else 3013603217SZhangfei Gao mkdir -p $uadk_dir 3113603217SZhangfei Gao git clone "${GIT_REPO_UADK}" "$uadk_dir" 3213603217SZhangfei Gao fi 3313603217SZhangfei Gao (cd "$uadk_dir" && ./cleanup.sh && ./autogen.sh && ./configure --libdir=/usr/lib64 && make install) 3413603217SZhangfei Gao echo /usr/lib64 > /etc/ld.so.conf.d/uadk.conf 3513603217SZhangfei Gao ldconfig 3613603217SZhangfei Gao} 3713603217SZhangfei Gao 38357d98aeSMichal Berger_install_shfmt() { 39357d98aeSMichal Berger local version=$1 arch=$2 type=$3 40357d98aeSMichal Berger 41357d98aeSMichal Berger local shfmt_dir=/usr/local/src/shfmt shfmt_repo=https://github.com/mvdan/sh 42357d98aeSMichal Berger 43357d98aeSMichal Berger if [[ $type != build ]]; then 44357d98aeSMichal Berger echo "$shfmt_repo/releases/download/$version/shfmt_${version}_linux_${arch}" 45357d98aeSMichal Berger return 0 46357d98aeSMichal Berger fi 47357d98aeSMichal Berger 48357d98aeSMichal Berger if [[ ! -e /etc/opt/spdk-pkgdep/paths/go.path ]]; then 49357d98aeSMichal Berger install_golang 50357d98aeSMichal Berger fi 51357d98aeSMichal Berger source /etc/opt/spdk-pkgdep/paths/export.sh > /dev/null 52357d98aeSMichal Berger 53357d98aeSMichal Berger rm -rf "$shfmt_dir" 54357d98aeSMichal Berger 55357d98aeSMichal Berger git clone "$shfmt_repo" "$shfmt_dir" 56357d98aeSMichal Berger git -C "$shfmt_dir" checkout "$version" 57357d98aeSMichal Berger 58357d98aeSMichal Berger # See cmd/shfmt/Dockerfile 59357d98aeSMichal Berger CGO_ENABLED=0 go -C "$shfmt_dir" build \ 60357d98aeSMichal Berger -ldflags "-w -s -extldflags '-static' -X main.version=$version" \ 61357d98aeSMichal Berger "$shfmt_dir/cmd/shfmt" 62357d98aeSMichal Berger 63357d98aeSMichal Berger echo "file://$shfmt_dir/shfmt" 64357d98aeSMichal Berger} 65357d98aeSMichal Berger 6620708f35SMichal Bergerinstall_shfmt() { 6720708f35SMichal Berger # Fetch version that has been tested 68357d98aeSMichal Berger local shfmt_version=v3.8.0 6920708f35SMichal Berger local shfmt=shfmt-$shfmt_version 7020708f35SMichal Berger local shfmt_dir=${SHFMT_DIR:-/opt/shfmt} 7120708f35SMichal Berger local shfmt_dir_out=${SHFMT_DIR_OUT:-/usr/bin} 7220708f35SMichal Berger local shfmt_url 7320708f35SMichal Berger local os 74fe09e7d4SRichael Zhuang local arch 75357d98aeSMichal Berger local cmdline 7620708f35SMichal Berger 77357d98aeSMichal Berger if hash "$shfmt" && [[ $("$shfmt" --version) == "$shfmt_version" ]]; then 7820708f35SMichal Berger echo "$shfmt already installed" 7920708f35SMichal Berger return 0 8020708f35SMichal Berger fi 2> /dev/null 8120708f35SMichal Berger 82fe09e7d4SRichael Zhuang arch=$(uname -m) 8320708f35SMichal Berger os=$(uname -s) 8420708f35SMichal Berger 85fe09e7d4SRichael Zhuang case "$arch" in 86fe09e7d4SRichael Zhuang x86_64) arch="amd64" ;; 87fe09e7d4SRichael Zhuang aarch64) arch="arm" ;; 88c3870302SMichal Berger amd64) ;; # FreeBSD 89fe09e7d4SRichael Zhuang *) 90fe09e7d4SRichael Zhuang echo "Not supported arch (${arch:-Unknown}), skipping" 91fe09e7d4SRichael Zhuang return 0 92fe09e7d4SRichael Zhuang ;; 93fe09e7d4SRichael Zhuang esac 94fe09e7d4SRichael Zhuang 95357d98aeSMichal Berger cmdline=("$shfmt_version" "$arch") 96357d98aeSMichal Berger [[ $os == FreeBSD || -n $BUILD_SHFMT ]] && cmdline+=(build) 97357d98aeSMichal Berger 98357d98aeSMichal Berger shfmt_url=$(_install_shfmt "${cmdline[@]}") 9920708f35SMichal Berger 10020708f35SMichal Berger mkdir -p "$shfmt_dir" 10120708f35SMichal Berger mkdir -p "$shfmt_dir_out" 10220708f35SMichal Berger 10320708f35SMichal Berger echo "Fetching ${shfmt_url##*/}"... 10420708f35SMichal Berger local err 10520708f35SMichal Berger if err=$(curl -f -Lo"$shfmt_dir/$shfmt" "$shfmt_url" 2>&1); then 10620708f35SMichal Berger chmod +x "$shfmt_dir/$shfmt" 10720708f35SMichal Berger ln -sf "$shfmt_dir/$shfmt" "$shfmt_dir_out" 10820708f35SMichal Berger else 10920708f35SMichal Berger cat <<- CURL_ERR 11020708f35SMichal Berger 11120708f35SMichal Berger * Fetching $shfmt_url failed, $shfmt will not be available for format check. 11220708f35SMichal Berger * Error: 11320708f35SMichal Berger 11420708f35SMichal Berger $err 11520708f35SMichal Berger 11620708f35SMichal Berger CURL_ERR 11720708f35SMichal Berger return 0 11820708f35SMichal Berger fi 11920708f35SMichal Berger echo "$shfmt installed" 12020708f35SMichal Berger} 12120708f35SMichal Berger 12234cbbf3bSMichal Bergerinstall_spdk_bash_completion() { 12334cbbf3bSMichal Berger [[ -e /usr/share/bash-completion/bash_completion ]] || return 0 12434cbbf3bSMichal Berger 12534cbbf3bSMichal Berger local compat_dir=/etc/bash_completion.d 12634cbbf3bSMichal Berger mkdir -p "$compat_dir" 12734cbbf3bSMichal Berger 12834cbbf3bSMichal Berger if [[ ! -e $compat_dir/spdk ]]; then 129095df6b2SMichal Berger cp -v "$scriptsdir/bash-completion/spdk" "$compat_dir" 13034cbbf3bSMichal Berger fi 13134cbbf3bSMichal Berger} 13234cbbf3bSMichal Berger 13383440f1dSMaciej Wawrykinstall_markdownlint() { 13483440f1dSMaciej Wawryk local git_repo_mdl="https://github.com/markdownlint/markdownlint.git" 13583440f1dSMaciej Wawryk local mdl_version="v0.11.0" 1365e75b913SMichal Berger local srcdir=/usr/src/markdownlint 1375e75b913SMichal Berger 1385e75b913SMichal Berger rm -rf "$srcdir" 1395e75b913SMichal Berger git clone --branch "$mdl_version" "$git_repo_mdl" "$srcdir" 14083440f1dSMaciej Wawryk ( 1415e75b913SMichal Berger cd "$srcdir" 1425e75b913SMichal Berger rake install 14383440f1dSMaciej Wawryk ) 14483440f1dSMaciej Wawryk} 14583440f1dSMaciej Wawryk 146c2349da2SAntti Kervineninstall_protoc() { 147c2349da2SAntti Kervinen local PROTOCVERSION=${PROTOCVERSION:-21.7} 148c2349da2SAntti Kervinen local PROTOCGENGOVERSION=${PROTOCGENGOVERSION:-1.28} 149c2349da2SAntti Kervinen local PROTOCGENGOGRPCVERSION=${PROTOCGENGOGRPCVERSION:-1.2} 150c2349da2SAntti Kervinen local protocdir protocpkg protocurl protocver arch 151c2349da2SAntti Kervinen local skip_protoc=0 152c2349da2SAntti Kervinen # It is easy to find an incompatible combination of protoc, 153c2349da2SAntti Kervinen # protoc-gen-go and protoc-gen-go-grpc. Therefore install a 154c2349da2SAntti Kervinen # preferred version combination even if more recent versions 155c2349da2SAntti Kervinen # of some of these tools would be available in the system. 156c2349da2SAntti Kervinen protocver=$(protoc --version 2> /dev/null | { 157c2349da2SAntti Kervinen read -r _ v 158c2349da2SAntti Kervinen echo $v 159c2349da2SAntti Kervinen }) 160c2349da2SAntti Kervinen if [[ "3.${PROTOCVERSION}" == "${protocver}" ]]; then 161c2349da2SAntti Kervinen echo "found protoc version ${protocver} exactly required 3.${PROTOCVERSION}, skip installing" 162c2349da2SAntti Kervinen skip_protoc=1 163c2349da2SAntti Kervinen fi 164c2349da2SAntti Kervinen protocdir=/opt/protoc/${PROTOCVERSION} 165c2349da2SAntti Kervinen if [[ -x "${protocdir}/bin/protoc" ]]; then 166c2349da2SAntti Kervinen echo "protoc already installed to ${protocdir}, skip installing" 167c2349da2SAntti Kervinen skip_protoc=1 168c2349da2SAntti Kervinen fi 169c2349da2SAntti Kervinen if [[ "${skip_protoc}" != "1" ]]; then 170c2349da2SAntti Kervinen echo "installing protoc v${PROTOCVERSION} to ${protocdir}" 171c2349da2SAntti Kervinen mkdir -p "${protocdir}" 172c2349da2SAntti Kervinen arch=x86_64 173ade920a0SMichal Berger if [[ "$(uname -m)" == "aarch64" ]]; then 174c2349da2SAntti Kervinen arch=aarch_64 175c2349da2SAntti Kervinen fi 176c2349da2SAntti Kervinen protocpkg=protoc-${PROTOCVERSION}-linux-${arch}.zip 177c2349da2SAntti Kervinen protocurl=https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOCVERSION}/${protocpkg} 178c2349da2SAntti Kervinen curl -f -LO "${protocurl}" || { 179c2349da2SAntti Kervinen echo "downloading protoc ${PROTOCVERSION} from ${protocurl} failed" 180c2349da2SAntti Kervinen return 1 181c2349da2SAntti Kervinen } 182c2349da2SAntti Kervinen unzip -d "${protocdir}" "${protocpkg}" || { 183c2349da2SAntti Kervinen echo "extracting protoc ${PROTOCVERSION} from ${protocpkg} failed" 184c2349da2SAntti Kervinen rm -f "${protocpkg}" 185c2349da2SAntti Kervinen return 1 186c2349da2SAntti Kervinen } 187c2349da2SAntti Kervinen rm -f "${protocpkg}" 188c2349da2SAntti Kervinen fi 189c2349da2SAntti Kervinen if [[ -x "${protocdir}/bin/protoc-gen-go" ]]; then 190c2349da2SAntti Kervinen echo "${protocdir}/bin/protoc-gen-go already installed" 191c2349da2SAntti Kervinen else 192c2349da2SAntti Kervinen echo "installing protoc-gen-go v${PROTOCGENGOVERSION} to ${protocdir}/bin" 193c2349da2SAntti Kervinen mkdir -p "${protocdir}/bin" 194c2349da2SAntti Kervinen GOBIN="${protocdir}/bin" go install "google.golang.org/protobuf/cmd/protoc-gen-go@v${PROTOCGENGOVERSION}" || { 195c2349da2SAntti Kervinen echo "protoc protoc-gen-go plugin install failed" 196c2349da2SAntti Kervinen return 1 197c2349da2SAntti Kervinen } 198c2349da2SAntti Kervinen fi 199c2349da2SAntti Kervinen if [[ -x "${protocdir}/bin/protoc-gen-go-grpc" ]]; then 200c2349da2SAntti Kervinen echo "${protocdir}/bin/protoc-gen-go-grpc already installed" 201c2349da2SAntti Kervinen else 202c2349da2SAntti Kervinen echo "installing protoc-gen-go-grpc v${PROTOCGENGOGRPCVERSION} to ${protocdir}/bin" 203c2349da2SAntti Kervinen mkdir -p "${protocdir}/bin" 204c2349da2SAntti Kervinen GOBIN="${protocdir}/bin" go install "google.golang.org/grpc/cmd/protoc-gen-go-grpc@v${PROTOCGENGOGRPCVERSION}" || { 205c2349da2SAntti Kervinen echo "protoc protoc-gen-go-grpc plugin install failed" 206c2349da2SAntti Kervinen return 1 207c2349da2SAntti Kervinen } 208c2349da2SAntti Kervinen fi 209c2349da2SAntti Kervinen pkgdep_toolpath protoc "${protocdir}/bin" 210c2349da2SAntti Kervinen} 211c2349da2SAntti Kervinen 212c2349da2SAntti Kervineninstall_golang() { 2138b64d50eSKarol Latecki local GOVERSION=${GOVERSION:-1.21.1} 2142fca5274SMichal Berger local godir gopkg gover arch os 215deea9d10SMichal Berger 216944a30fdSKarol Latecki read -r _ _ gover _ < <(go version) || true 217deea9d10SMichal Berger gover=${gover#go} 218deea9d10SMichal Berger if [[ -n "${gover}" ]] && ge "${gover}" "${GOVERSION}"; then 219c2349da2SAntti Kervinen echo "found go version ${gover} >= required ${GOVERSION}, skip installing" 220c2349da2SAntti Kervinen return 0 221c2349da2SAntti Kervinen fi 222c2349da2SAntti Kervinen godir=/opt/go/${GOVERSION} 223c2349da2SAntti Kervinen if [[ -x "${godir}/bin/go" ]]; then 224c2349da2SAntti Kervinen echo "go already installed in ${godir}, skip installing" 225c2349da2SAntti Kervinen return 0 226c2349da2SAntti Kervinen fi 227c2349da2SAntti Kervinen mkdir -p "${godir}" 228c2349da2SAntti Kervinen arch=amd64 2292fca5274SMichal Berger os=$(uname -s) 230ade920a0SMichal Berger if [[ "$(uname -m)" == "aarch64" ]]; then 231c2349da2SAntti Kervinen arch=arm64 232c2349da2SAntti Kervinen fi 2332fca5274SMichal Berger gopkg=go${GOVERSION}.${os,,}-${arch}.tar.gz 234c2349da2SAntti Kervinen echo "installing go v${GOVERSION} to ${godir}/bin" 2351dc32345SKarol Latecki curl -sL https://go.dev/dl/${gopkg} | tar -C "${godir}" -xzf - --strip 1 236deea9d10SMichal Berger if ! "${godir}/bin/go" version; then 237c2349da2SAntti Kervinen echo "go install failed" 238c2349da2SAntti Kervinen return 1 239deea9d10SMichal Berger fi 240c2349da2SAntti Kervinen export PATH=${godir}/bin:$PATH 241c2349da2SAntti Kervinen export GOBIN=${godir}/bin 242c2349da2SAntti Kervinen pkgdep_toolpath go "${godir}/bin" 243c2349da2SAntti Kervinen} 244c2349da2SAntti Kervinen 24549311529Sehaligowinstall_golangci_lint() { 24649311529Sehaligow local golangcidir installed_lintversion lintversion=${GOLANGCLILINTVERSION:-1.54.2} 24749311529Sehaligow installed_lintversion=$(golangci-lint --version | awk '{print $4}') 24849311529Sehaligow 24949311529Sehaligow if [[ -n "${installed_lintversion}" ]] && ge "${installed_lintversion}" "${lintversion}"; then 25049311529Sehaligow echo "golangci-lint already installed, skip installing" 25149311529Sehaligow return 0 25249311529Sehaligow fi 25349311529Sehaligow 25449311529Sehaligow echo "installing golangci-lint" 25549311529Sehaligow golangcidir=/opt/golangci/$lintversion/bin 25649311529Sehaligow export PATH=${golangcidir}:$PATH 25749311529Sehaligow curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/v${lintversion}/install.sh \ 25818506bf1SMichal Berger | sh -s -- -b "${golangcidir}" "v$lintversion" || { 25949311529Sehaligow echo "installing golangci-lint failed" 26049311529Sehaligow return 1 26149311529Sehaligow } 26249311529Sehaligow pkgdep_toolpath golangci_lint "${golangcidir}" 26349311529Sehaligow} 26449311529Sehaligow 26520708f35SMichal Bergerif [[ $INSTALL_DEV_TOOLS == true ]]; then 26620708f35SMichal Berger install_shfmt 26734cbbf3bSMichal Berger install_spdk_bash_completion 268e8945f92SKamil Godzwon if [[ $ID != centos && $ID != rocky && $ID != sles ]]; then 26983440f1dSMaciej Wawryk install_markdownlint 2707e0fc667SMichal Berger else 2717e0fc667SMichal Berger echo "mdl not supported on $ID, disabling" 2727e0fc667SMichal Berger fi 27320708f35SMichal Bergerfi 27420708f35SMichal Berger 27520708f35SMichal Bergerif [[ $INSTALL_LIBURING == true ]]; then 27620708f35SMichal Berger install_liburing 27720708f35SMichal Bergerfi 278c2349da2SAntti Kervinen 27913603217SZhangfei Gaoif [[ $INSTALL_UADK == true ]]; then 28013603217SZhangfei Gao install_uadk 28113603217SZhangfei Gaofi 28213603217SZhangfei Gao 283c2349da2SAntti Kervinenif [[ $INSTALL_GOLANG == true ]]; then 284c2349da2SAntti Kervinen install_golang 2852fca5274SMichal Berger [[ $(uname -s) == Linux ]] && install_protoc 28649311529Sehaligow install_golangci_lint 287c2349da2SAntti Kervinenfi 288