144290e13STomasz Zawadzki#!/usr/bin/env bash 244290e13STomasz Zawadzki# SPDX-License-Identifier: BSD-3-Clause 344290e13STomasz Zawadzki# Copyright (C) 2022 Intel Corporation 444290e13STomasz Zawadzki# All rights reserved. 544290e13STomasz Zawadzki# 644290e13STomasz Zawadzki 744290e13STomasz Zawadzkiscriptdir=$(readlink -f "$(dirname "$0")") 844290e13STomasz Zawadzkirootdir=$(readlink -f "$scriptdir/../..") 944290e13STomasz Zawadzkisource "$rootdir/scripts/common.sh" 1044290e13STomasz Zawadzki 1144290e13STomasz Zawadzkiset -e 1244290e13STomasz Zawadzkishopt -s extglob 13*11694e8dSTomasz Zawadzkishopt -s nullglob 1444290e13STomasz Zawadzki 1544290e13STomasz Zawadzkimode=${1:-check} # check or fix 1644290e13STomasz Zawadzki 1744290e13STomasz Zawadzki# By default verify headers matching the DPDK submodule 1844290e13STomasz Zawadzkidpdk_dir=${2:-"$rootdir/dpdk"} 1944290e13STomasz Zawadzkidpdk_ver=$(< "$dpdk_dir/VERSION") 2044290e13STomasz Zawadzki 2144290e13STomasz Zawadzkienv_path="$rootdir/lib/env_dpdk" 2244290e13STomasz Zawadzkitracked_versions=("$env_path/"+([0-9]).+([0-9])/*.h) 2344290e13STomasz Zawadzkitracked_versions=("${tracked_versions[@]#"$env_path/"}") 2444290e13STomasz Zawadzkitracked_versions=("${tracked_versions[@]%/*}") 2544290e13STomasz Zawadzki 2644290e13STomasz Zawadzki# The DPDK PCI API tracking started with DPDK 22.11, all prior versions will use DPDK 22.07 headers 2744290e13STomasz Zawadzkitarget_ver="22.07" 2844290e13STomasz Zawadzkiwhile read -r ver; do 2944290e13STomasz Zawadzki ge "$dpdk_ver" "$ver" && target_ver=$ver && break 3044290e13STomasz Zawadzkidone < <(printf "%s\n" "${tracked_versions[@]}" | sort -Vru) 3144290e13STomasz Zawadzki 3244290e13STomasz Zawadzkiecho "Checking DPDK PCI API from $dpdk_ver against $target_ver ..." 3344290e13STomasz Zawadzki 3444290e13STomasz Zawadzkitarget_headers=("$env_path/$target_ver/"*.h) 3544290e13STomasz Zawadzkitarget_headers=("${target_headers[@]##*/}") 3644290e13STomasz Zawadzki 3744290e13STomasz Zawadzki# The includes should point to headers in SPDK tree rather than system ones. 3844290e13STomasz Zawadzkiuse_local_includes="-e " 3944290e13STomasz Zawadzkifor header in "${target_headers[@]}"; do 4044290e13STomasz Zawadzki use_local_includes+="s/#include <$header>/#include \"$header\"/g;" 4144290e13STomasz Zawadzkidone 4244290e13STomasz Zawadzki 4344290e13STomasz Zawadzkifor header in "${target_headers[@]}"; do 4444290e13STomasz Zawadzki dpdk_file="$dpdk_dir/$(git -C "$dpdk_dir" ls-files "*/$header")" 45*11694e8dSTomasz Zawadzki patch_dir="$scriptdir/$target_ver" 46*11694e8dSTomasz Zawadzki patch_versions=("$patch_dir/"+([0-9]).+([0-9])-$header.patch) 47*11694e8dSTomasz Zawadzki patch_versions=("${patch_versions[@]#"$patch_dir/"}") 48*11694e8dSTomasz Zawadzki patch_versions=("${patch_versions[@]%-$header.patch*}") 49*11694e8dSTomasz Zawadzki 50*11694e8dSTomasz Zawadzki # Patch file version matches to versions equal or greater than 51*11694e8dSTomasz Zawadzki # their creation. 52*11694e8dSTomasz Zawadzki while read -r ver; do 53*11694e8dSTomasz Zawadzki ge "$dpdk_ver" "$ver" && patch_version=$ver && break 54*11694e8dSTomasz Zawadzki done < <(printf "%s\n" "${patch_versions[@]}" | sort -Vru) 5544290e13STomasz Zawadzki 5644290e13STomasz Zawadzki # Patch DPDK header with any workarounds necessary 57*11694e8dSTomasz Zawadzki patch_file="$patch_dir/$patch_version-$header.patch" 5844290e13STomasz Zawadzki if [[ -s $patch_file ]]; then 5944290e13STomasz Zawadzki dpdk_header=$(patch -s "$dpdk_file" "$patch_file" -o - | sed "$use_local_includes") 6044290e13STomasz Zawadzki else 6144290e13STomasz Zawadzki dpdk_header=$(sed "$use_local_includes" "$dpdk_file") 6244290e13STomasz Zawadzki fi 6344290e13STomasz Zawadzki 6444290e13STomasz Zawadzki spdk_file="$env_path/$target_ver/$header" 6544290e13STomasz Zawadzki if ! single_diff=$(diff -u "$spdk_file" <(echo "$dpdk_header")); then 6644290e13STomasz Zawadzki header_diff+="$single_diff\n" 6744290e13STomasz Zawadzki fi 6844290e13STomasz Zawadzkidone 6944290e13STomasz Zawadzki 7044290e13STomasz Zawadzkiif [[ -z "$header_diff" ]]; then 7144290e13STomasz Zawadzki echo "No differences in headers found." 7244290e13STomasz Zawadzki exit 0 7344290e13STomasz Zawadzkifi 7444290e13STomasz Zawadzki 7544290e13STomasz Zawadzkiif [[ "$mode" == "check" ]]; then 7644290e13STomasz Zawadzki cat <<- CHECK 7744290e13STomasz Zawadzki $(echo -e "$header_diff") 7844290e13STomasz Zawadzki 7944290e13STomasz Zawadzki Differences in DPDK and internal SPDK headers found. 8044290e13STomasz Zawadzki For changes that do not affect the API, please use 'fix' as \$1 to this script. 81a6139931STomasz Zawadzki If API was changed, please create "$env_path/${dpdk_ver%.*}/" with appropriate headers. 8244290e13STomasz Zawadzki 8344290e13STomasz Zawadzki CHECK 842c8000beSTomasz Zawadzki exit 1 8544290e13STomasz Zawadzkielif [[ "$mode" == "fix" ]]; then 8644290e13STomasz Zawadzki echo -e "$header_diff" | patch -d "$env_path/$target_ver/" 8744290e13STomasz Zawadzki echo "Fixed differences between DPDK and internal SPDK headers." 8844290e13STomasz Zawadzkielse 8944290e13STomasz Zawadzki echo "Incorrect \$1 passed, please use 'check' or 'fix'." 9044290e13STomasz Zawadzki exit 1 9144290e13STomasz Zawadzkifi 92