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