xref: /spdk/scripts/pkgdep/common.sh (revision 0cdba6b186375c7b8356940a958b8b186a5ca1f9)
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