1*eb8305aeSMatthias Maennich#!/bin/bash 2*eb8305aeSMatthias Maennich# SPDX-License-Identifier: GPL-2.0 3*eb8305aeSMatthias Maennich# Linux kernel symbol namespace import generator 4*eb8305aeSMatthias Maennich# 5*eb8305aeSMatthias Maennich# This script requires a minimum spatch version. 6*eb8305aeSMatthias MaennichSPATCH_REQ_VERSION="1.0.4" 7*eb8305aeSMatthias Maennich 8*eb8305aeSMatthias MaennichDIR="$(dirname $(readlink -f $0))/.." 9*eb8305aeSMatthias MaennichSPATCH="`which ${SPATCH:=spatch}`" 10*eb8305aeSMatthias Maennichif [ ! -x "$SPATCH" ]; then 11*eb8305aeSMatthias Maennich echo 'spatch is part of the Coccinelle project and is available at http://coccinelle.lip6.fr/' 12*eb8305aeSMatthias Maennich exit 1 13*eb8305aeSMatthias Maennichfi 14*eb8305aeSMatthias Maennich 15*eb8305aeSMatthias MaennichSPATCH_REQ_VERSION_NUM=$(echo $SPATCH_REQ_VERSION | ${DIR}/scripts/ld-version.sh) 16*eb8305aeSMatthias MaennichSPATCH_VERSION=$($SPATCH --version | head -1 | awk '{print $3}') 17*eb8305aeSMatthias MaennichSPATCH_VERSION_NUM=$(echo $SPATCH_VERSION | ${DIR}/scripts/ld-version.sh) 18*eb8305aeSMatthias Maennich 19*eb8305aeSMatthias Maennichif [ "$SPATCH_VERSION_NUM" -lt "$SPATCH_REQ_VERSION_NUM" ] ; then 20*eb8305aeSMatthias Maennich echo "spatch needs to be version $SPATCH_REQ_VERSION or higher" 21*eb8305aeSMatthias Maennich exit 1 22*eb8305aeSMatthias Maennichfi 23*eb8305aeSMatthias Maennich 24*eb8305aeSMatthias Maennichgenerate_deps_for_ns() { 25*eb8305aeSMatthias Maennich $SPATCH --very-quiet --in-place --sp-file \ 26*eb8305aeSMatthias Maennich $srctree/scripts/coccinelle/misc/add_namespace.cocci -D ns=$1 $2 27*eb8305aeSMatthias Maennich} 28*eb8305aeSMatthias Maennich 29*eb8305aeSMatthias Maennichgenerate_deps() { 30*eb8305aeSMatthias Maennich local mod_name=`basename $@ .ko` 31*eb8305aeSMatthias Maennich local mod_file=`echo $@ | sed -e 's/\.ko/\.mod/'` 32*eb8305aeSMatthias Maennich local ns_deps_file=`echo $@ | sed -e 's/\.ko/\.ns_deps/'` 33*eb8305aeSMatthias Maennich if [ ! -f "$ns_deps_file" ]; then return; fi 34*eb8305aeSMatthias Maennich local mod_source_files=`cat $mod_file | sed -n 1p \ 35*eb8305aeSMatthias Maennich | sed -e 's/\.o/\.c/g' \ 36*eb8305aeSMatthias Maennich | sed "s/[^ ]* */${srctree}\/&/g"` 37*eb8305aeSMatthias Maennich for ns in `cat $ns_deps_file`; do 38*eb8305aeSMatthias Maennich echo "Adding namespace $ns to module $mod_name (if needed)." 39*eb8305aeSMatthias Maennich generate_deps_for_ns $ns $mod_source_files 40*eb8305aeSMatthias Maennich # sort the imports 41*eb8305aeSMatthias Maennich for source_file in $mod_source_files; do 42*eb8305aeSMatthias Maennich sed '/MODULE_IMPORT_NS/Q' $source_file > ${source_file}.tmp 43*eb8305aeSMatthias Maennich offset=$(wc -l ${source_file}.tmp | awk '{print $1;}') 44*eb8305aeSMatthias Maennich cat $source_file | grep MODULE_IMPORT_NS | sort -u >> ${source_file}.tmp 45*eb8305aeSMatthias Maennich tail -n +$((offset +1)) ${source_file} | grep -v MODULE_IMPORT_NS >> ${source_file}.tmp 46*eb8305aeSMatthias Maennich if ! diff -q ${source_file} ${source_file}.tmp; then 47*eb8305aeSMatthias Maennich mv ${source_file}.tmp ${source_file} 48*eb8305aeSMatthias Maennich else 49*eb8305aeSMatthias Maennich rm ${source_file}.tmp 50*eb8305aeSMatthias Maennich fi 51*eb8305aeSMatthias Maennich done 52*eb8305aeSMatthias Maennich done 53*eb8305aeSMatthias Maennich} 54*eb8305aeSMatthias Maennich 55*eb8305aeSMatthias Maennichfor f in `cat $objtree/modules.order`; do 56*eb8305aeSMatthias Maennich generate_deps $f 57*eb8305aeSMatthias Maennichdone 58*eb8305aeSMatthias Maennich 59