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