xref: /spdk/test/common/config/pkgdep/git (revision f417ec25e31cc22ca6cddd4d40bb4ad3031b2424)
118bc2f70SMichal Bergerfunction install_qat() {
27493be13SKarol Latecki	if ! hash yasm; then
37493be13SKarol Latecki		install yasm
47493be13SKarol Latecki	fi
57493be13SKarol Latecki
64d8ce959SMichal Berger	install libnl3 libnl3-devel || install libnl-3-200 libnl-3-dev libnl-genl-3-dev
715d11190SMichal Berger
80146f2eeSMichal Berger	in_syms() {
90146f2eeSMichal Berger		local syms
100146f2eeSMichal Berger		if [[ -e /proc/kallsyms ]]; then
110146f2eeSMichal Berger			syms=/proc/kallsyms
12f4e0fc09SMichal Berger		elif [[ -e /boot/System.map-$kernel_ver ]]; then
13f4e0fc09SMichal Berger			syms=/boot/System.map-$kernel_ver
140146f2eeSMichal Berger		else
150146f2eeSMichal Berger			return 0
160146f2eeSMichal Berger		fi
170146f2eeSMichal Berger
180146f2eeSMichal Berger		grep -q "$1" "$syms"
190146f2eeSMichal Berger	}
200146f2eeSMichal Berger
210bec3c3cSMichal Berger	if [[ -e /sys/module/qat_c62x ]]; then
220bec3c3cSMichal Berger		sudo modprobe -r qat_c62x || :
230bec3c3cSMichal Berger	fi
2470dfde6fSMichal Berger	if [[ -d $GIT_REPOS/QAT ]]; then
2570dfde6fSMichal Berger		sudo rm -rf "$GIT_REPOS/QAT"
2618bc2f70SMichal Berger	fi
2718bc2f70SMichal Berger
2835599b77SMaciej Wawryk	mkdir "$GIT_REPOS/QAT"
2918bc2f70SMichal Berger
3070dfde6fSMichal Berger	tar -C "$GIT_REPOS/QAT" -xzof - < <(wget -O- "$DRIVER_LOCATION_QAT")
3118bc2f70SMichal Berger
321073b6b1SMichal Berger	patch --dir="$GIT_REPOS/QAT" -p1 \
331073b6b1SMichal Berger		< "$rootdir/test/common/config/pkgdep/patches/qat/0001-old-style-declaration.patch"
341073b6b1SMichal Berger	patch --dir="$GIT_REPOS/QAT" -p1 \
351073b6b1SMichal Berger		< "$rootdir/test/common/config/pkgdep/patches/qat/0001-empty-body.patch"
361073b6b1SMichal Berger
37daa9779cSMichal Berger	(cd "$GIT_REPOS/QAT" && sudo ./configure --enable-icp-sriov=host && sudo make install)
3818bc2f70SMichal Berger
39a44d0614SMichal Berger	if ! sudo service qat_service start; then
4018bc2f70SMichal Berger		echo "failed to start the qat service. Something may be wrong with your device or package."
4118bc2f70SMichal Berger	fi
4218bc2f70SMichal Berger}
4318bc2f70SMichal Berger
4418bc2f70SMichal Bergerfunction install_rocksdb() {
4518bc2f70SMichal Berger	# Rocksdb is installed for use with the blobfs tests.
4618bc2f70SMichal Berger	if [ ! -d /usr/src/rocksdb ]; then
4770dfde6fSMichal Berger		git clone "${GIT_REPO_ROCKSDB}" "$GIT_REPOS/rocksdb"
48fa678934SMaciej Szwed		git -C "$GIT_REPOS/rocksdb" checkout 6.15.fb
4970dfde6fSMichal Berger		sudo mv "$GIT_REPOS/rocksdb" /usr/src/
5018bc2f70SMichal Berger	else
510306fa3aSTomasz Zawadzki		sudo git -C /usr/src/rocksdb checkout spdk-v8.1.1
5218bc2f70SMichal Berger		echo "rocksdb already in /usr/src. Not checking out again"
5318bc2f70SMichal Berger	fi
5418bc2f70SMichal Berger}
5518bc2f70SMichal Berger
569aff18edSMichal Bergerfunction install_ittapi() {
579aff18edSMichal Berger	# Install Intel Instrumentation and Trace API
589aff18edSMichal Berger	local ittapi_version=v3.24.5 ittapi_dir=/usr/src/ittapi
599aff18edSMichal Berger
609aff18edSMichal Berger	rm -rf "$ittapi_dir"
619aff18edSMichal Berger	git clone "${GIT_REPO_ITTAPI}" --branch "$ittapi_version" "$GIT_REPOS/ittapi"
629aff18edSMichal Berger	make -C "$GIT_REPOS/ittapi/src/ittnotify_refcol"
639aff18edSMichal Berger
649aff18edSMichal Berger	mv "$GIT_REPOS/ittapi" "$ittapi_dir"
659aff18edSMichal Berger	ln -s . "$ittapi_dir/sdk"
669aff18edSMichal Berger}
679aff18edSMichal Berger
6818bc2f70SMichal Bergerfunction install_fio() {
6918bc2f70SMichal Berger	# This version of fio is installed in /usr/src/fio to enable
7018bc2f70SMichal Berger	# building the spdk fio plugin.
71b40f4d93SMichal Berger	local fio_version="fio-3.35"
7218bc2f70SMichal Berger
7318bc2f70SMichal Berger	if [ ! -d /usr/src/fio ]; then
7418bc2f70SMichal Berger		if [ ! -d fio ]; then
7570dfde6fSMichal Berger			git clone "${GIT_REPO_FIO}" "$GIT_REPOS/fio"
7670dfde6fSMichal Berger			sudo mv "$GIT_REPOS/fio" /usr/src/
7718bc2f70SMichal Berger		else
7870dfde6fSMichal Berger			sudo mv "$GIT_REPOS/fio" /usr/src/
7918bc2f70SMichal Berger		fi
8018bc2f70SMichal Berger		(
8118bc2f70SMichal Berger			git -C /usr/src/fio checkout master \
8218bc2f70SMichal Berger				&& git -C /usr/src/fio pull \
8318bc2f70SMichal Berger				&& git -C /usr/src/fio checkout $fio_version \
8418bc2f70SMichal Berger				&& if [ $OSID == 'freebsd' ]; then
8518bc2f70SMichal Berger					gmake -C /usr/src/fio -j${jobs} \
8618bc2f70SMichal Berger						&& sudo gmake -C /usr/src/fio install
8718bc2f70SMichal Berger				else
8818bc2f70SMichal Berger					make -C /usr/src/fio -j${jobs} \
8918bc2f70SMichal Berger						&& sudo make -C /usr/src/fio install
9018bc2f70SMichal Berger				fi
9118bc2f70SMichal Berger		)
9218bc2f70SMichal Berger	else
9318bc2f70SMichal Berger		echo "fio already in /usr/src/fio. Not installing"
9418bc2f70SMichal Berger	fi
9518bc2f70SMichal Berger}
9618bc2f70SMichal Berger
9718bc2f70SMichal Bergerfunction install_flamegraph() {
9818bc2f70SMichal Berger	# Flamegraph is used when printing out timing graphs for the tests.
9918bc2f70SMichal Berger	if [ ! -d /usr/local/FlameGraph ]; then
10070dfde6fSMichal Berger		git clone "${GIT_REPO_FLAMEGRAPH}" "$GIT_REPOS/FlameGraph"
10118bc2f70SMichal Berger		mkdir -p /usr/local
10270dfde6fSMichal Berger		sudo mv "$GIT_REPOS/FlameGraph" /usr/local/FlameGraph
10318bc2f70SMichal Berger	else
10418bc2f70SMichal Berger		echo "flamegraph already installed. Skipping"
10518bc2f70SMichal Berger	fi
10618bc2f70SMichal Berger}
10718bc2f70SMichal Berger
108253c1785SKarol Lateckifunction _install_qemu() {
109253c1785SKarol Latecki	local repo=$1
110253c1785SKarol Latecki	local branch=$2
1113124e715SMichal Berger	local prefix=${3:-}
11242f99be2SMichal Berger	local name=${4:-}
11318bc2f70SMichal Berger
11470dfde6fSMichal Berger	mkdir -p "$GIT_REPOS/qemu"
1153124e715SMichal Berger
1163124e715SMichal Berger	local repo_dir=$GIT_REPOS/qemu/$branch
1173124e715SMichal Berger	if [[ -n $prefix ]]; then
1183124e715SMichal Berger		repo_dir=$GIT_REPOS/qemu/$prefix-$branch
1193124e715SMichal Berger	fi
1203124e715SMichal Berger
1213124e715SMichal Berger	if [[ ! -d $repo_dir ]]; then
1223124e715SMichal Berger		git clone "$repo" -b "$branch" "$repo_dir"
12318bc2f70SMichal Berger	else
12418bc2f70SMichal Berger		echo "qemu already checked out. Skipping"
12518bc2f70SMichal Berger	fi
12618bc2f70SMichal Berger
1273124e715SMichal Berger	declare -a opt_params=("--prefix=/usr/local/qemu/${repo_dir##*/}")
128ed3cd2b9SMichal Berger	declare -a extra_cflags=()
129ed3cd2b9SMichal Berger
130ed3cd2b9SMichal Berger	opt_params+=("--disable-docs")
13118bc2f70SMichal Berger	if ((gcc_version >= 9)); then
13218bc2f70SMichal Berger		opt_params+=("--disable-glusterfs")
13318bc2f70SMichal Berger	fi
13418bc2f70SMichal Berger
135ea98ada0SKamil Godzwon	extra_cflags+=("-Wno-error")
136aa303d87SMichal Berger
13718bc2f70SMichal Berger	# Most tsocks proxies rely on a configuration file in /etc/tsocks.conf.
13818bc2f70SMichal Berger	# If using tsocks, please make sure to complete this config before trying to build qemu.
1394892b935SMichal Berger	if [[ $INSTALL_TSOCKS == true && $NO_TSOCKS != true ]]; then
14018bc2f70SMichal Berger		if hash tsocks 2> /dev/null; then
14118bc2f70SMichal Berger			opt_params+=("--with-git='tsocks git'")
14218bc2f70SMichal Berger		fi
14318bc2f70SMichal Berger	fi
144ed3cd2b9SMichal Berger	opt_params+=("--extra-cflags=${extra_cflags[*]}")
14518bc2f70SMichal Berger
146eb4b7991SMichal Berger	if [[ $prefix == vanilla ]]; then
147eb4b7991SMichal Berger		# Latest qemu seems to take sysconfdir from the prefix and instead of checking /etc
148eb4b7991SMichal Berger		# it looks under /usr/local/qemu/vanilla*/bin/../etc which is a bit peculiar. Fix it.
149eb4b7991SMichal Berger		opt_params+=("--sysconfdir=/etc/")
150eb4b7991SMichal Berger	fi
151eb4b7991SMichal Berger
15218bc2f70SMichal Berger	# The qemu configure script places several output files in the CWD.
1533124e715SMichal Berger	(cd "$repo_dir" && ./configure "${opt_params[@]}" --target-list="x86_64-softmmu" --enable-kvm --enable-linux-aio --enable-numa)
15418bc2f70SMichal Berger
1553124e715SMichal Berger	make -C "$repo_dir" -j${jobs}
1563124e715SMichal Berger	sudo make -C "$repo_dir" install
15742f99be2SMichal Berger
15842f99be2SMichal Berger	# Add a symlink to point at a latest build - this is useful to easily track QEMU flavors for which
15942f99be2SMichal Berger	# branches change quite often (e.g. vfio-user's).
16042f99be2SMichal Berger	[[ -n $name ]] || return 0
16142f99be2SMichal Berger	[[ -L /usr/local/qemu/$name-latest ]] && sudo rm "/usr/local/qemu/$name-latest"
16242f99be2SMichal Berger	sudo ln -s "/usr/local/qemu/${repo_dir##*/}" "/usr/local/qemu/$name-latest"
163253c1785SKarol Latecki}
164253c1785SKarol Latecki
165253c1785SKarol Lateckifunction install_qemu() {
16618ee5d7bSMichal Berger	# Four versions of QEMU are used in the tests, three are installed
16718ee5d7bSMichal Berger	# directly from the source. Each QEMU is dedicated for different
16818ee5d7bSMichal Berger	# use-cases:
16918ee5d7bSMichal Berger	#  - Packed QEMU: version provided by given distro. Used to boot VMs
17018ee5d7bSMichal Berger	#    from within vhost tests.
17118ee5d7bSMichal Berger	#  - vfio-user QEMU: A special fork to test libvfio-user components.
172ca256d3bSMichal Berger	#  - Vanilla QEMU: Used by the CI to boot the testing VMs.
173253c1785SKarol Latecki
17442f99be2SMichal Berger	_install_qemu $GIT_REPO_QEMU_VFIO $VFIO_QEMU_BRANCH "" vfio-user
17542f99be2SMichal Berger	_install_qemu "$GIT_REPO_QEMU" "$VANILLA_QEMU_BRANCH" vanilla vanilla
17618bc2f70SMichal Berger}
17718bc2f70SMichal Berger
17818bc2f70SMichal Bergerfunction install_nvmecli() {
179ba7fd26cSKarol Latecki	# nvme-cli >1.11.1 should be used.
1803a52bbbeSMichal Berger	rm -rf "$GIT_REPOS/nvme-cli-cuse"
18170dfde6fSMichal Berger	git clone "https://github.com/linux-nvme/nvme-cli.git" "$GIT_REPOS/nvme-cli-cuse"
182d6b4caf5SMichal Berger	git -C "$GIT_REPOS/nvme-cli-cuse" checkout v2.5
1838f4be72eSKarol Latecki
184d6b4caf5SMichal Berger	meson setup --force-fallback-for=libnvme \
185d6b4caf5SMichal Berger		"$GIT_REPOS/nvme-cli-cuse/.build" \
186d6b4caf5SMichal Berger		"$GIT_REPOS/nvme-cli-cuse"
187d6b4caf5SMichal Berger	meson compile -C "$GIT_REPOS/nvme-cli-cuse/.build"
1888f4be72eSKarol Latecki
1893a52bbbeSMichal Berger	rm -rf /usr/local/src/nvme-cli
1903a52bbbeSMichal Berger	mv "$GIT_REPOS/nvme-cli-cuse" /usr/local/src/nvme-cli
1913a52bbbeSMichal Berger
192261384feSMichal Berger	# Make sure binary is available for the cuse tests
193261384feSMichal Berger	if [[ -e /usr/local/src/nvme-cli/.build/nvme ]]; then
194261384feSMichal Berger		sudo ln -s .build/nvme /usr/local/src/nvme-cli/
195261384feSMichal Berger	fi
19618bc2f70SMichal Berger}
19718bc2f70SMichal Berger
198c2fdd754SSebastian Brzezinka# This function install version of nvme-cli, that support listing spdk nvme
199c2fdd754SSebastian Brzezinka# devices, should be remove after changes present in nvme-cli upstream.
200c2fdd754SSebastian Brzezinkafunction install_nvmecli_plugin() {
201c2fdd754SSebastian Brzezinka	rm -rf "$GIT_REPOS/nvme-cli-plugin"
202c2fdd754SSebastian Brzezinka
203c2fdd754SSebastian Brzezinka	git clone $GIT_REPO_NVME_CLI "$GIT_REPOS/nvme-cli-plugin"
204c2fdd754SSebastian Brzezinka	git -C "$GIT_REPOS/nvme-cli-plugin" fetch $GIT_REPO_NVME_CLI refs/changes/95/16795/12
205c2fdd754SSebastian Brzezinka	git -C "$GIT_REPOS/nvme-cli-plugin" checkout FETCH_HEAD
206c2fdd754SSebastian Brzezinka
207b1d3b8c0SMichal Berger	meson setup --force-fallback-for=libnvme,json-c \
208c2fdd754SSebastian Brzezinka		"$GIT_REPOS/nvme-cli-plugin/.build" \
209c2fdd754SSebastian Brzezinka		"$GIT_REPOS/nvme-cli-plugin"
210c2fdd754SSebastian Brzezinka	meson compile -C "$GIT_REPOS/nvme-cli-plugin/.build"
211c2fdd754SSebastian Brzezinka
212c2fdd754SSebastian Brzezinka	rm -rf /usr/local/src/nvme-cli-plugin
213c2fdd754SSebastian Brzezinka	mv "$GIT_REPOS/nvme-cli-plugin" /usr/local/src/nvme-cli-plugin
214c2fdd754SSebastian Brzezinka
215c2fdd754SSebastian Brzezinka	# Make sure binary is available for the plugin tests
216c2fdd754SSebastian Brzezinka	if [[ -e /usr/local/src/nvme-cli-plugin/.build/nvme ]]; then
217c2fdd754SSebastian Brzezinka		sudo ln -s .build/nvme /usr/local/src/nvme-cli-plugin/
218c2fdd754SSebastian Brzezinka	fi
219c2fdd754SSebastian Brzezinka}
220c2fdd754SSebastian Brzezinka
22118bc2f70SMichal Bergerfunction install_libiscsi() {
22218bc2f70SMichal Berger	# We currently don't make any changes to the libiscsi repository for our tests, but it is possible that we will need
22318bc2f70SMichal Berger	# to later. Cloning from git is just future proofing the machines.
22470dfde6fSMichal Berger	if [[ ! -d $GIT_REPOS/libiscsi ]]; then
22570dfde6fSMichal Berger		git clone "${GIT_REPO_LIBISCSI}" "$GIT_REPOS/libiscsi"
22618bc2f70SMichal Berger	else
22718bc2f70SMichal Berger		echo "libiscsi already checked out. Skipping"
22818bc2f70SMichal Berger	fi
22970dfde6fSMichal Berger	(cd "$GIT_REPOS/libiscsi" && ./autogen.sh && ./configure --prefix=/usr/local/libiscsi)
2304301477cSMichal Berger	make -C "$GIT_REPOS/libiscsi" -j${jobs} WARN_CFLAGS=
23170dfde6fSMichal Berger	sudo make -C "$GIT_REPOS/libiscsi" install
23218bc2f70SMichal Berger}
23318bc2f70SMichal Berger
23418bc2f70SMichal Bergerfunction install_git() {
235f62834a6SMichal Berger	if type -P git; then
236dec533bfSMichal Berger		if ge "$(git --version | awk '{print $3}')" "$GIT_VERSION"; then
237f62834a6SMichal Berger			return 0
238dec533bfSMichal Berger		fi
239f62834a6SMichal Berger	fi >/dev/null
240f62834a6SMichal Berger
24118bc2f70SMichal Berger	install zlib-devel curl-devel
24270dfde6fSMichal Berger	tar -C "$GIT_REPOS" -xzof <(wget -qO- "$GIT_REPO_GIT")
24370dfde6fSMichal Berger	(cd "$GIT_REPOS/git-$GIT_VERSION" \
24418bc2f70SMichal Berger		&& make configure \
245ea91da8dSMichal Berger		&& ./configure \
24618bc2f70SMichal Berger		&& sudo make -j${jobs} install)
24718bc2f70SMichal Berger}
24818bc2f70SMichal Berger
249a66c52fdSMichal Bergerfunction install_extra_pkgs() {
250a66c52fdSMichal Berger	if [[ $INSTALL_QAT == true ]]; then
251b4fc019bSMichal Berger		install libudev-devel || install libudev-dev || :
252a66c52fdSMichal Berger	fi
253a66c52fdSMichal Berger
254a66c52fdSMichal Berger	if [[ $INSTALL_QEMU == true ]]; then
255a66c52fdSMichal Berger		install qemu-system-x86 qemu-img \
256a66c52fdSMichal Berger			|| install qemu-system-x86 qemu-utils \
257941cf96dSJaroslaw Chachulski			|| install qemu
258941cf96dSJaroslaw Chachulski
259941cf96dSJaroslaw Chachulski		# Install extra dependency which was removed from Qemu 7.2 source tree
260941cf96dSJaroslaw Chachulski		install libslirp-devel \
261941cf96dSJaroslaw Chachulski			|| install libslirp-dev
262941cf96dSJaroslaw Chachulski	fi || :
263a66c52fdSMichal Berger}
264a66c52fdSMichal Berger
2652188940eSPawel Piatekfunction install_vagrant() {
2662188940eSPawel Piatek	local vagrant_version="2.2.7"
2672188940eSPawel Piatek	local vagrant_installer="vagrant_${vagrant_version}_x86_64.deb"
2682188940eSPawel Piatek	local vagrant_plugins=(vagrant-libvirt vagrant-sshfs vagrant-cachier vagrant-proxyconf)
2692188940eSPawel Piatek
2702188940eSPawel Piatek	if [[ $OSID != ubuntu ]]; then
271b85b7e2bSMichal Berger		echo "Currently, Vagrant installation is supported only on ubuntu"
272b85b7e2bSMichal Berger		return 0
2732188940eSPawel Piatek	fi
2742188940eSPawel Piatek
2758ea52a41SPawel Piatek	# Install vagrant and it's plugins dependencies
2768ea52a41SPawel Piatek	# function should be defined in pkgdep/$package_manager file
2778ea52a41SPawel Piatek	install_vagrant_dependencies
2788ea52a41SPawel Piatek
2792188940eSPawel Piatek	# Download and install vagrant
2802188940eSPawel Piatek	if hash vagrant &> /dev/null; then
2812188940eSPawel Piatek		echo "Vagrant is already installed"
2822188940eSPawel Piatek	else
2832188940eSPawel Piatek		wget "https://releases.hashicorp.com/vagrant/${vagrant_version}/${vagrant_installer}"
2842188940eSPawel Piatek		sudo dpkg -i "${vagrant_installer}"
2852188940eSPawel Piatek	fi
2862188940eSPawel Piatek	vagrant --version
2872188940eSPawel Piatek
2882188940eSPawel Piatek	# Install vagrant plugins
2892188940eSPawel Piatek	local vagrant_plugin_list
2902188940eSPawel Piatek	vagrant_plugin_list=$(vagrant plugin list)
2912188940eSPawel Piatek
2922188940eSPawel Piatek	local plugin
2932188940eSPawel Piatek	for plugin in "${vagrant_plugins[@]}"; do
2942188940eSPawel Piatek		if grep -Fq "$plugin" <<< "$vagrant_plugin_list"; then
2952188940eSPawel Piatek			echo "$plugin already installed"
2962188940eSPawel Piatek		else
2972188940eSPawel Piatek			vagrant plugin install "$plugin"
2982188940eSPawel Piatek		fi
2992188940eSPawel Piatek	done
3002188940eSPawel Piatek}
3012188940eSPawel Piatek
3021b2eb024SKarol Lateckifunction install_igb_uio() {
3031b2eb024SKarol Latecki	git clone "${GIT_REPO_DPDK_KMODS}" "$GIT_REPOS/dpdk-kmods"
3042c65d556SMichal Berger
3051b2eb024SKarol Latecki	(cd "$GIT_REPOS/dpdk-kmods/linux/igb_uio" && make -j ${jobs})
3061b2eb024SKarol Latecki	sudo mkdir -p "/lib/modules/$(uname -r)/extra/dpdk"
3071b2eb024SKarol Latecki	sudo cp "$GIT_REPOS/dpdk-kmods/linux/igb_uio/igb_uio.ko" "/lib/modules/$(uname -r)/extra/dpdk"
3081b2eb024SKarol Latecki	sudo depmod
3091b2eb024SKarol Latecki}
3101b2eb024SKarol Latecki
31147508028SMichal Bergerfunction install_irdma() {
3127939c642SMichal Berger	local RDMA_CORE_VERSION=51.0
31347508028SMichal Berger	local RDMA_CORE=https://github.com/linux-rdma/rdma-core/releases/download/v$RDMA_CORE_VERSION/rdma-core-$RDMA_CORE_VERSION.tar.gz
31466bb5d46SMichal Berger	local packages=() hint=""
31547508028SMichal Berger
31666bb5d46SMichal Berger	case "$ID" in
31766bb5d46SMichal Berger		fedora)
31866bb5d46SMichal Berger			install \
31966bb5d46SMichal Berger				ninja-build \
32066bb5d46SMichal Berger				pandoc \
32166bb5d46SMichal Berger				perl-generators \
32266bb5d46SMichal Berger				valgrind-devel \
32366bb5d46SMichal Berger				python-docutils \
32466bb5d46SMichal Berger				libnl3 \
32566bb5d46SMichal Berger				libnl3-devel \
32666bb5d46SMichal Berger				python3-Cython
32766bb5d46SMichal Berger				;;
32866bb5d46SMichal Berger		debian | ubuntu)
32966bb5d46SMichal Berger			install \
33066bb5d46SMichal Berger				debhelper \
33166bb5d46SMichal Berger				dh-python \
33266bb5d46SMichal Berger				python3-docutils
33366bb5d46SMichal Berger			;;
33466bb5d46SMichal Berger		*)
33566bb5d46SMichal Berger			echo "irdma installation not supported under $ID" >&2
33647508028SMichal Berger			return 0
33766bb5d46SMichal Berger			;;
33866bb5d46SMichal Berger	esac
33947508028SMichal Berger
34047508028SMichal Berger	rm -rf "$GIT_REPOS/irdma-$IRDMA_VERSION"
34147508028SMichal Berger	rm -rf "$GIT_REPOS/rdma-core-$RDMA_CORE_VERSION"
34247508028SMichal Berger
34347508028SMichal Berger	curl -L -o- "$IRDMA_DRIVER" | tar -C "$GIT_REPOS" -xzf -
3441c5a5ee6SMichal Berger
3451c5a5ee6SMichal Berger	if ge "$kernel_ver" 6.10; then
3461c5a5ee6SMichal Berger		patch --dir="$GIT_REPOS/irdma-$IRDMA_VERSION" -p1  \
3471c5a5ee6SMichal Berger			< "$rootdir/test/common/config/pkgdep/patches/irdma/0001-ip_route_output.patch"
3481c5a5ee6SMichal Berger	fi
3491c5a5ee6SMichal Berger
350b8390354SMichal Berger	if ge "$kernel_ver" 6.11; then
351b8390354SMichal Berger		patch --dir="$GIT_REPOS/irdma-$IRDMA_VERSION" -p1  \
352b8390354SMichal Berger			< "$rootdir/test/common/config/pkgdep/patches/irdma/0001-uverbs_attr.patch"
353b8390354SMichal Berger	fi
354b8390354SMichal Berger
35547508028SMichal Berger	[[ -e $GIT_REPOS/irdma-$IRDMA_VERSION/build.sh ]]
35647508028SMichal Berger
35747508028SMichal Berger	(
35847508028SMichal Berger		cd "$GIT_REPOS/irdma-$IRDMA_VERSION"
35919d1b5f9SKarol Latecki		sed -i "s/IRDMA_FLUSH_DELAY_MS 1500/IRDMA_FLUSH_DELAY_MS 50/" \
36019d1b5f9SKarol Latecki			"$GIT_REPOS/irdma-$IRDMA_VERSION/src/irdma/verbs.h"
36147508028SMichal Berger		"$GIT_REPOS/irdma-$IRDMA_VERSION/build.sh"
36247508028SMichal Berger	)
36347508028SMichal Berger
36447508028SMichal Berger	# Fetch and build the rdma-core irdma depends on
36547508028SMichal Berger	curl -L -o- "$RDMA_CORE" | tar -C "$GIT_REPOS" -xzf -
36647508028SMichal Berger	[[ -e $GIT_REPOS/irdma-$IRDMA_VERSION/libirdma-$RDMA_CORE_VERSION.patch ]]
36747508028SMichal Berger
36847508028SMichal Berger	patch --dir="$GIT_REPOS/rdma-core-$RDMA_CORE_VERSION" -p2 \
36947508028SMichal Berger		< "$GIT_REPOS/irdma-$IRDMA_VERSION/libirdma-$RDMA_CORE_VERSION.patch"
37047508028SMichal Berger
37166bb5d46SMichal Berger	case "$ID" in
37266bb5d46SMichal Berger		fedora)
37347508028SMichal Berger			[[ -e $GIT_REPOS/rdma-core-$RDMA_CORE_VERSION/redhat/rdma-core.spec ]]
37466bb5d46SMichal Berger			# Note that paths and the name of the package are hardcoded into .spec, hence they need
37566bb5d46SMichal Berger			# to stay like this.
37647508028SMichal Berger			mkdir -p "$HOME/rpmbuild/"{SOURCES,SPECS}
37747508028SMichal Berger			cp "$GIT_REPOS/rdma-core-$RDMA_CORE_VERSION/redhat/rdma-core.spec" "$HOME/rpmbuild/SPECS"
37847508028SMichal Berger
37947508028SMichal Berger			# Re-package the source
38066bb5d46SMichal Berger			tar -czf "$HOME/rpmbuild/SOURCES/rdma-core-$RDMA_CORE_VERSION.tar.gz" \
38166bb5d46SMichal Berger				-C "$GIT_REPOS" "rdma-core-$RDMA_CORE_VERSION"
38247508028SMichal Berger
38347508028SMichal Berger			# Build the rpms
38447508028SMichal Berger			(
38547508028SMichal Berger				cd "$HOME/rpmbuild/SPECS"
38647508028SMichal Berger				# Make sure stock ninja-build is used
38747508028SMichal Berger				PATH="/usr/bin:$PATH" rpmbuild -ba rdma-core.spec
38847508028SMichal Berger			)
38947508028SMichal Berger
39066bb5d46SMichal Berger			packages=("$HOME/rpmbuild/RPMS/x86_64/"*.rpm)
39166bb5d46SMichal Berger			hint="$package_manager install [--allowerasing] $HOME/rpmbuild/RPMS/x86_64/*.rpm"
39266bb5d46SMichal Berger			;;
39366bb5d46SMichal Berger		debian | ubuntu)
39466bb5d46SMichal Berger			[[ -e $GIT_REPOS/rdma-core-$RDMA_CORE_VERSION/debian/control ]]
39547508028SMichal Berger
39666bb5d46SMichal Berger			# Build the debs
39766bb5d46SMichal Berger			(
39866bb5d46SMichal Berger				cd "$GIT_REPOS/rdma-core-$RDMA_CORE_VERSION"
39966bb5d46SMichal Berger				dh clean --with python3,systemd --builddirectory=build-deb
40066bb5d46SMichal Berger				dh build --with systemd --builddirectory=build-deb
40166bb5d46SMichal Berger				dh binary --with systemd --builddirectory=build-deb
40266bb5d46SMichal Berger			)
40366bb5d46SMichal Berger
40466bb5d46SMichal Berger			packages=("$GIT_REPOS/"*.deb)
40566bb5d46SMichal Berger			hint="dpkg --install $GIT_REPOS/*.deb"
40666bb5d46SMichal Berger			;;
40766bb5d46SMichal Berger	esac
40866bb5d46SMichal Berger
40966bb5d46SMichal Berger	((${#packages[@]} > 0)) || return 1
41047508028SMichal Berger
41147508028SMichal Berger	cat <<-EOF
41247508028SMichal Berger
41347508028SMichal Berger		INFO: rdma-core-$RDMA_CORE_VERSION was successfully built, following packages are
41447508028SMichal Berger		available for installation:
41547508028SMichal Berger
41666bb5d46SMichal Berger		$(printf '  - %s\n' "${packages[@]##*/}")
41747508028SMichal Berger
41847508028SMichal Berger		Note that installing the above packages may raise conflicts with their
41947508028SMichal Berger		potentially newer versions already installed on the system. Dependent
42047508028SMichal Berger		packages may be uninstalled during the process as well. Please, run the
42147508028SMichal Berger		following command to finish the installation:
42247508028SMichal Berger
42366bb5d46SMichal Berger		  $hint
42447508028SMichal Berger	EOF
42547508028SMichal Berger}
42647508028SMichal Berger
427d511348aSMichal Bergerfunction install_ice() {
428d511348aSMichal Berger	rm -rf "$GIT_REPOS/ice-$ICE_VERSION"
429d511348aSMichal Berger
430d511348aSMichal Berger	curl -L -o- "$ICE_DRIVER" | tar -C "$GIT_REPOS" -xzf -
4313bcff0b2SMichal Berger
43292b7734cSMichal Berger	if ge "$kernel_ver" 6.10; then
43392b7734cSMichal Berger		patch --dir="$GIT_REPOS/ice-$ICE_VERSION" -p1  \
43492b7734cSMichal Berger			< "$rootdir/test/common/config/pkgdep/patches/ice/0001-__assign_str.patch"
43592b7734cSMichal Berger		patch --dir="$GIT_REPOS/ice-$ICE_VERSION" -p1  \
43692b7734cSMichal Berger			< "$rootdir/test/common/config/pkgdep/patches/ice/0001-napi_alloc_skb.patch"
43792b7734cSMichal Berger		patch --dir="$GIT_REPOS/ice-$ICE_VERSION" -p1  \
43892b7734cSMichal Berger			< "$rootdir/test/common/config/pkgdep/patches/ice/0001-devlink_param.patch"
43992b7734cSMichal Berger		patch --dir="$GIT_REPOS/ice-$ICE_VERSION" -p1  \
44092b7734cSMichal Berger			< "$rootdir/test/common/config/pkgdep/patches/ice/0001-xsk_buff_dma.patch"
44192b7734cSMichal Berger	fi
44292b7734cSMichal Berger
443*f417ec25SMichal Berger	if ge "$kernel_ver" 6.11; then
444*f417ec25SMichal Berger		patch --dir="$GIT_REPOS/ice-$ICE_VERSION" -p1  \
445*f417ec25SMichal Berger			< "$rootdir/test/common/config/pkgdep/patches/ice/0001-kernel_ethtool_ts_info.patch"
446*f417ec25SMichal Berger		patch --dir="$GIT_REPOS/ice-$ICE_VERSION" -p1  \
447*f417ec25SMichal Berger			< "$rootdir/test/common/config/pkgdep/patches/ice/0001-ptp.patch"
448*f417ec25SMichal Berger	fi
449*f417ec25SMichal Berger
450d511348aSMichal Berger	(
451d511348aSMichal Berger		cd "$GIT_REPOS/ice-$ICE_VERSION/src"
452a26d6028Swawryk		sudo make -j"$(nproc)" install
453d511348aSMichal Berger	)
454d511348aSMichal Berger}
455d511348aSMichal Berger
45680c271ffSMichal Bergerfunction install_libbpf() {
45780c271ffSMichal Berger	local libbpf_version=v1.4.5
45860305d01SMichal Berger
45980c271ffSMichal Berger	rm -rf "$GIT_REPOS/libbpf"
46080c271ffSMichal Berger	git clone "$GIT_REPO_LIBBPF" --branch "$libbpf_version" "$GIT_REPOS/libbpf"
46180c271ffSMichal Berger
46280c271ffSMichal Berger	make -C "$GIT_REPOS/libbpf/src" -j install
46380c271ffSMichal Berger	# install target doesn't include the kernel header files
46480c271ffSMichal Berger	make -C "$GIT_REPOS/libbpf/src" install_uapi_headers
46580c271ffSMichal Berger}
46680c271ffSMichal Berger
46780c271ffSMichal Bergerfunction install_bpftrace() {
46880c271ffSMichal Berger	local deps_fedora=() deps_ubuntu=() bcc_rev
46980c271ffSMichal Berger
47080c271ffSMichal Berger	deps_fedora+=(cereal-devel)
47180c271ffSMichal Berger	deps_fedora+=(clang-devel)
47280c271ffSMichal Berger	deps_fedora+=(dwarves)
47380c271ffSMichal Berger	deps_fedora+=(gmock-devel)
47480c271ffSMichal Berger	deps_fedora+=(gtest-devel)
47580c271ffSMichal Berger	deps_fedora+=(llvm-devel)
47680c271ffSMichal Berger	deps_fedora+=(bcc-devel)
47780c271ffSMichal Berger	deps_fedora+=(libbpf-devel)
47880c271ffSMichal Berger
47980c271ffSMichal Berger	deps_ubuntu+=(libcereal-dev)
48080c271ffSMichal Berger	deps_ubuntu+=(libclang-dev)
48180c271ffSMichal Berger	deps_ubuntu+=(llvm-dev)
48280c271ffSMichal Berger	# Under jammy (2204) the libbpf version is not compatible with the version of
48380c271ffSMichal Berger	# bpftrace that we are using. Instead, we are going to provide our own build
48480c271ffSMichal Berger	# of libbpf, including both up-to-date bpf.h and linux/bpf.h.
48580c271ffSMichal Berger	[[ $VERSION_CODENAME == jammy ]] || deps_ubuntu+=(libbpf-dev)
48680c271ffSMichal Berger	deps_ubuntu+=(libbpfcc-dev)
48780c271ffSMichal Berger	deps_ubuntu+=(libelf-dev)
48880c271ffSMichal Berger	deps_ubuntu+=(binutils-dev)
48980c271ffSMichal Berger
49080c271ffSMichal Berger	local -n deps="deps_$ID"
49180c271ffSMichal Berger
49280c271ffSMichal Berger	((${#deps[@]} > 0)) || return 1
49380c271ffSMichal Berger
49480c271ffSMichal Berger	deps+=(clang cmake)
49560305d01SMichal Berger
49660305d01SMichal Berger	install "${deps[@]}"
49760305d01SMichal Berger
49880c271ffSMichal Berger	if [[ $VERSION_CODENAME == jammy ]]; then
49980c271ffSMichal Berger		install_libbpf
50080c271ffSMichal Berger	fi
50180c271ffSMichal Berger
50272c4255eSKamil Godzwon	rm -rf $GIT_REPOS/bpftrace
50372c4255eSKamil Godzwon
504c2e1dac9SMichal Berger	git clone "$GIT_REPO_BPFTRACE" "$GIT_REPOS/bpftrace"
505866007aeSKamil Godzwon	git -C $GIT_REPOS/bpftrace checkout $BPFTRACE_VERSION
506866007aeSKamil Godzwon
507945468caSMichal Berger	mkdir -p "$GIT_REPOS/bpftrace/build"
50860305d01SMichal Berger	cmake \
50960305d01SMichal Berger		-DCMAKE_BUILD_TYPE=Release \
510945468caSMichal Berger		-DBUILD_TESTING=OFF \
51160305d01SMichal Berger		-B "$GIT_REPOS/bpftrace/build" \
51260305d01SMichal Berger		-S "$GIT_REPOS/bpftrace"
51360305d01SMichal Berger
51472c4255eSKamil Godzwon	make -C $GIT_REPOS/bpftrace/build -j$(nproc)
515866007aeSKamil Godzwon	sudo make -C $GIT_REPOS/bpftrace/build install
51672c4255eSKamil Godzwon}
51772c4255eSKamil Godzwon
518713dbcddSMichal Bergerfunction install_doxygen() {
519713dbcddSMichal Berger	# Stable, 1.10 commit that works for our docs
520713dbcddSMichal Berger	local release=78422d3905e57acebf0374feefafa6578dbe86aa
521713dbcddSMichal Berger
522713dbcddSMichal Berger	rm -rf "$GIT_REPOS/doxygen"
523713dbcddSMichal Berger
524713dbcddSMichal Berger	git clone "$GIT_REPO_DOXYGEN" "$GIT_REPOS/doxygen"
525713dbcddSMichal Berger	git -C "$GIT_REPOS/doxygen" checkout "$release"
526713dbcddSMichal Berger
527713dbcddSMichal Berger	mkdir -p "$GIT_REPOS/doxygen/build"
528713dbcddSMichal Berger
529713dbcddSMichal Berger	cmake -G "Unix Makefiles" \
530713dbcddSMichal Berger		-B "$GIT_REPOS/doxygen/build" \
531713dbcddSMichal Berger		-S "$GIT_REPOS/doxygen"
532713dbcddSMichal Berger
533713dbcddSMichal Berger	# This build is quite heavy, so let's not go crazy with -j here
534713dbcddSMichal Berger	make -C "$GIT_REPOS/doxygen/build" -j$(($(nproc) / 2))
535713dbcddSMichal Berger	make -C "$GIT_REPOS/doxygen/build" install
536713dbcddSMichal Berger}
537713dbcddSMichal Berger
5380081cfeaSMichal Bergerfunction install_sources() {
53918bc2f70SMichal Berger	if [[ $ID == centos ]] && (( VERSION_ID == 7 )); then
54018bc2f70SMichal Berger		# install proper version of the git first
54118bc2f70SMichal Berger		install_git
54218bc2f70SMichal Berger	fi
54318bc2f70SMichal Berger
54418bc2f70SMichal Berger	IFS="," read -ra conf_env <<< "$CONF"
54518bc2f70SMichal Berger	for conf in "${conf_env[@]}"; do
54618bc2f70SMichal Berger		export "INSTALL_${conf^^}=true"
54718bc2f70SMichal Berger	done
54818bc2f70SMichal Berger
549d8956215SMichal Berger	if [[ $OSID == freebsd ]]; then
55018bc2f70SMichal Berger		jobs=$(($(sysctl -n hw.ncpu) * 2))
55118bc2f70SMichal Berger	else
55218bc2f70SMichal Berger		jobs=$(($(nproc) * 2))
55318bc2f70SMichal Berger		sources+=(
55447508028SMichal Berger			install_irdma
55518bc2f70SMichal Berger			install_libiscsi
55618bc2f70SMichal Berger			install_nvmecli
557c2fdd754SSebastian Brzezinka			install_nvmecli_plugin
55818bc2f70SMichal Berger			install_qat
55918bc2f70SMichal Berger			install_rocksdb
56018bc2f70SMichal Berger			install_qemu
5611b2eb024SKarol Latecki			install_igb_uio
562d511348aSMichal Berger			install_ice
563f5e5041dSMichal Berger			install_bpftrace
564713dbcddSMichal Berger			install_doxygen
56518bc2f70SMichal Berger		)
5664a50398cSMichal Berger		install_extra_pkgs
56718bc2f70SMichal Berger	fi
56818bc2f70SMichal Berger	sources+=(install_fio)
569a504b006SMichal Berger	sources+=(install_flamegraph)
5702188940eSPawel Piatek	sources+=(install_vagrant)
5719aff18edSMichal Berger	sources+=(install_ittapi)
57218bc2f70SMichal Berger
57318bc2f70SMichal Berger	sudo mkdir -p /usr/{,local}/src
57470dfde6fSMichal Berger	sudo mkdir -p "$GIT_REPOS"
57518bc2f70SMichal Berger
57618bc2f70SMichal Berger	for source in "${sources[@]}"; do
57718bc2f70SMichal Berger		source_conf=${source^^}
57818bc2f70SMichal Berger		if [[ ${!source_conf} == true ]]; then
579c9b46ba9SMichal Berger			"$source"
58018bc2f70SMichal Berger		fi
58118bc2f70SMichal Berger	done
5820081cfeaSMichal Berger}
5830081cfeaSMichal Berger
5840081cfeaSMichal BergerGIT_VERSION=2.25.1
5857939c642SMichal BergerIRDMA_VERSION=1.14.31
58667c18052SMichal BergerICE_VERSION=1.14.9
58772c4255eSKamil Godzwon
588f09c7da5SMichal BergerBPFTRACE_VERSION=${BPFTRACE_VERSION:-f7bdfb44}
589b1d3ea0cSKarol LateckiVFIO_QEMU_BRANCH=${VFIO_QEMU_BRANCH:-vfio-user-p3.0}
5908b8a7a80SMichal BergerVANILLA_QEMU_BRANCH=${VANILLA_QEMU_BRANCH:-v8.0.0}
5916b6c9db6SMichal Berger
5920081cfeaSMichal Berger: ${GIT_REPO_ROCKSDB=https://review.spdk.io/spdk/rocksdb}
5930081cfeaSMichal Bergerexport GIT_REPO_ROCKSDB
5940081cfeaSMichal Berger: ${GIT_REPO_FIO=https://github.com/axboe/fio.git}
5950081cfeaSMichal Bergerexport GIT_REPO_FIO
5960081cfeaSMichal Berger: ${GIT_REPO_FLAMEGRAPH=https://github.com/brendangregg/FlameGraph.git}
5970081cfeaSMichal Bergerexport GIT_REPO_FLAMEGRAPH
59818ee5d7bSMichal Berger: ${GIT_REPO_QEMU=https://github.com/qemu/qemu}
5990081cfeaSMichal Bergerexport GIT_REPO_QEMU
60022d7d62eSMichal Berger: ${GIT_REPO_QEMU_VFIO=https://github.com/oracle/qemu}
601253c1785SKarol Lateckiexport GIT_REPO_QEMU_VFIO
6020081cfeaSMichal Berger: ${GIT_REPO_LIBISCSI=https://github.com/sahlberg/libiscsi}
6030081cfeaSMichal Bergerexport GIT_REPO_LIBISCSI
60482c8059aSMichal Berger: ${DRIVER_LOCATION_QAT=https://downloadmirror.intel.com/828487/QAT.L.4.26.0-00008.tar.gz}
6050081cfeaSMichal Bergerexport DRIVER_LOCATION_QAT
6060081cfeaSMichal Berger: ${GIT_REPO_GIT=https://github.com/git/git/archive/v${GIT_VERSION}.tar.gz}
6070081cfeaSMichal Bergerexport GIT_REPO_GIT
6080081cfeaSMichal Berger: ${GIT_REPO_DPDK_KMODS=http://dpdk.org/git/dpdk-kmods}
6090081cfeaSMichal Bergerexport GIT_REPO_DPDK_KMODS
6107939c642SMichal Berger: ${IRDMA_DRIVER=https://downloadmirror.intel.com/823677/irdma-$IRDMA_VERSION.tgz}
6110081cfeaSMichal Bergerexport IRDMA_DRIVER
612ce2a2aedSMichal Berger: ${ICE_DRIVER="https://sourceforge.net/projects/e1000/files/ice%20stable/$ICE_VERSION/ice-$ICE_VERSION.tar.gz"}
6130081cfeaSMichal Bergerexport ICE_DRIVER
61472c4255eSKamil Godzwon: ${GIT_REPO_BCC=https://github.com/iovisor/bcc.git}
61572c4255eSKamil Godzwonexport GIT_REPO_BCC
61672c4255eSKamil Godzwon: ${GIT_REPO_BPFTRACE=https://github.com/iovisor/bpftrace.git}
61772c4255eSKamil Godzwonexport GIT_REPO_BPFTRACE
618c2fdd754SSebastian Brzezinka: ${GIT_REPO_NVME_CLI=https://review.spdk.io/gerrit/spdk/nvme-cli}
619c2fdd754SSebastian Brzezinkaexport GIT_REPO_NVME_CLI
6209aff18edSMichal Berger: ${GIT_REPO_ITTAPI=https://github.com/intel/ittapi.git}
6219aff18edSMichal Bergerexport GIT_REPO_ITTAPI
622713dbcddSMichal Berger: ${GIT_REPO_DOXYGEN="https://github.com/doxygen/doxygen"}
623713dbcddSMichal Bergerexport GIT_REPO_DOXYGEN
62480c271ffSMichal Berger: ${GIT_REPO_LIBBPF="https://github.com/libbpf/libbpf"}
62580c271ffSMichal Bergerexport GIT_REPO_LIBBPF
62672c4255eSKamil Godzwon
6270081cfeaSMichal BergerGIT_REPOS=${GIT_REPOS:-$HOME}
6280081cfeaSMichal Berger
6290081cfeaSMichal Bergergcc_version=$(gcc -dumpversion) gcc_version=${gcc_version%%.*}
630f4e0fc09SMichal Bergerif [[ -e /proc/sys/kernel/osrelease ]]; then
631f4e0fc09SMichal Berger	kernel_ver=$(< /proc/sys/kernel/osrelease)
632f4e0fc09SMichal Bergerfi
633