xref: /spdk/scripts/env_dpdk/check_dpdk_pci_api.sh (revision 44290e13b4b59b1552e54a263dce8cc9534f7f45)
1*44290e13STomasz Zawadzki#!/usr/bin/env bash
2*44290e13STomasz Zawadzki#  SPDX-License-Identifier: BSD-3-Clause
3*44290e13STomasz Zawadzki#  Copyright (C) 2022 Intel Corporation
4*44290e13STomasz Zawadzki#  All rights reserved.
5*44290e13STomasz Zawadzki#
6*44290e13STomasz Zawadzki
7*44290e13STomasz Zawadzkiscriptdir=$(readlink -f "$(dirname "$0")")
8*44290e13STomasz Zawadzkirootdir=$(readlink -f "$scriptdir/../..")
9*44290e13STomasz Zawadzkisource "$rootdir/scripts/common.sh"
10*44290e13STomasz Zawadzki
11*44290e13STomasz Zawadzkiset -e
12*44290e13STomasz Zawadzkishopt -s extglob
13*44290e13STomasz Zawadzki
14*44290e13STomasz Zawadzkimode=${1:-check} # check or fix
15*44290e13STomasz Zawadzki
16*44290e13STomasz Zawadzki# By default verify headers matching the DPDK submodule
17*44290e13STomasz Zawadzkidpdk_dir=${2:-"$rootdir/dpdk"}
18*44290e13STomasz Zawadzkidpdk_ver=$(< "$dpdk_dir/VERSION")
19*44290e13STomasz Zawadzki
20*44290e13STomasz Zawadzkienv_path="$rootdir/lib/env_dpdk"
21*44290e13STomasz Zawadzkitracked_versions=("$env_path/"+([0-9]).+([0-9])/*.h)
22*44290e13STomasz Zawadzkitracked_versions=("${tracked_versions[@]#"$env_path/"}")
23*44290e13STomasz Zawadzkitracked_versions=("${tracked_versions[@]%/*}")
24*44290e13STomasz Zawadzki
25*44290e13STomasz Zawadzki# The DPDK PCI API tracking started with DPDK 22.11, all prior versions will use DPDK 22.07 headers
26*44290e13STomasz Zawadzkitarget_ver="22.07"
27*44290e13STomasz Zawadzkiwhile read -r ver; do
28*44290e13STomasz Zawadzki	ge "$dpdk_ver" "$ver" && target_ver=$ver && break
29*44290e13STomasz Zawadzkidone < <(printf "%s\n" "${tracked_versions[@]}" | sort -Vru)
30*44290e13STomasz Zawadzki
31*44290e13STomasz Zawadzkiecho "Checking DPDK PCI API from $dpdk_ver against $target_ver ..."
32*44290e13STomasz Zawadzki
33*44290e13STomasz Zawadzkitarget_headers=("$env_path/$target_ver/"*.h)
34*44290e13STomasz Zawadzkitarget_headers=("${target_headers[@]##*/}")
35*44290e13STomasz Zawadzki
36*44290e13STomasz Zawadzki# The includes should point to headers in SPDK tree rather than system ones.
37*44290e13STomasz Zawadzkiuse_local_includes="-e "
38*44290e13STomasz Zawadzkifor header in "${target_headers[@]}"; do
39*44290e13STomasz Zawadzki	use_local_includes+="s/#include <$header>/#include \"$header\"/g;"
40*44290e13STomasz Zawadzkidone
41*44290e13STomasz Zawadzki
42*44290e13STomasz Zawadzkifor header in "${target_headers[@]}"; do
43*44290e13STomasz Zawadzki	dpdk_file="$dpdk_dir/$(git -C "$dpdk_dir" ls-files "*/$header")"
44*44290e13STomasz Zawadzki
45*44290e13STomasz Zawadzki	# Patch DPDK header with any workarounds necessary
46*44290e13STomasz Zawadzki	patch_file="$scriptdir/$target_ver/$header.patch"
47*44290e13STomasz Zawadzki	if [[ -s $patch_file ]]; then
48*44290e13STomasz Zawadzki		dpdk_header=$(patch -s "$dpdk_file" "$patch_file" -o - | sed "$use_local_includes")
49*44290e13STomasz Zawadzki	else
50*44290e13STomasz Zawadzki		dpdk_header=$(sed "$use_local_includes" "$dpdk_file")
51*44290e13STomasz Zawadzki	fi
52*44290e13STomasz Zawadzki
53*44290e13STomasz Zawadzki	spdk_file="$env_path/$target_ver/$header"
54*44290e13STomasz Zawadzki	if ! single_diff=$(diff -u "$spdk_file" <(echo "$dpdk_header")); then
55*44290e13STomasz Zawadzki		header_diff+="$single_diff\n"
56*44290e13STomasz Zawadzki	fi
57*44290e13STomasz Zawadzkidone
58*44290e13STomasz Zawadzki
59*44290e13STomasz Zawadzkiif [[ -z "$header_diff" ]]; then
60*44290e13STomasz Zawadzki	echo "No differences in headers found."
61*44290e13STomasz Zawadzki	exit 0
62*44290e13STomasz Zawadzkifi
63*44290e13STomasz Zawadzki
64*44290e13STomasz Zawadzkiif [[ "$mode" == "check" ]]; then
65*44290e13STomasz Zawadzki	cat <<- CHECK
66*44290e13STomasz Zawadzki		$(echo -e "$header_diff")
67*44290e13STomasz Zawadzki
68*44290e13STomasz Zawadzki		Differences in DPDK and internal SPDK headers found.
69*44290e13STomasz Zawadzki		For changes that do not affect the API, please use 'fix' as \$1 to this script.
70*44290e13STomasz Zawadzki		If API was changed, please create "$env_path/$dpdk_ver/" with appropriate headers.
71*44290e13STomasz Zawadzki
72*44290e13STomasz Zawadzki	CHECK
73*44290e13STomasz Zawadzkielif [[ "$mode" == "fix" ]]; then
74*44290e13STomasz Zawadzki	echo -e "$header_diff" | patch -d "$env_path/$target_ver/"
75*44290e13STomasz Zawadzki	echo "Fixed differences between DPDK and internal SPDK headers."
76*44290e13STomasz Zawadzkielse
77*44290e13STomasz Zawadzki	echo "Incorrect \$1 passed, please use 'check' or 'fix'."
78*44290e13STomasz Zawadzki	exit 1
79*44290e13STomasz Zawadzkifi
80