1#!/bin/sh 2 3# Script to create/update include/generated/autoksyms.h and dependency files 4# 5# Copyright: (C) 2016 Linaro Limited 6# Created by: Nicolas Pitre, January 2016 7# 8# This program is free software; you can redistribute it and/or modify 9# it under the terms of the GNU General Public License version 2 as 10# published by the Free Software Foundation. 11 12# Create/update the include/generated/autoksyms.h file from the list 13# of all module's needed symbols as recorded on the third line of 14# .tmp_versions/*.mod files. 15# 16# For each symbol being added or removed, the corresponding dependency 17# file's timestamp is updated to force a rebuild of the affected source 18# file. All arguments passed to this script are assumed to be a command 19# to be exec'd to trigger a rebuild of those files. 20 21set -e 22 23cur_ksyms_file="include/generated/autoksyms.h" 24new_ksyms_file="include/generated/autoksyms.h.tmpnew" 25 26info() { 27 if [ "$quiet" != "silent_" ]; then 28 printf " %-7s %s\n" "$1" "$2" 29 fi 30} 31 32info "CHK" "$cur_ksyms_file" 33 34# Use "make V=1" to debug this script. 35case "$KBUILD_VERBOSE" in 36*1*) 37 set -x 38 ;; 39esac 40 41# We need access to CONFIG_ symbols 42case "${KCONFIG_CONFIG}" in 43*/*) 44 . "${KCONFIG_CONFIG}" 45 ;; 46*) 47 # Force using a file from the current directory 48 . "./${KCONFIG_CONFIG}" 49esac 50 51# In case it doesn't exist yet... 52if [ -e "$cur_ksyms_file" ]; then touch "$cur_ksyms_file"; fi 53 54# Generate a new ksym list file with symbols needed by the current 55# set of modules. 56cat > "$new_ksyms_file" << EOT 57/* 58 * Automatically generated file; DO NOT EDIT. 59 */ 60 61EOT 62[ "$(ls -A "$MODVERDIR")" ] && 63sed -ns -e '3{s/ /\n/g;/^$/!p;}' "$MODVERDIR"/*.mod | sort -u | 64while read sym; do 65 if [ -n "$CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX" ]; then 66 sym="${sym#_}" 67 fi 68 echo "#define __KSYM_${sym} 1" 69done >> "$new_ksyms_file" 70 71# Special case for modversions (see modpost.c) 72if [ -n "$CONFIG_MODVERSIONS" ]; then 73 echo "#define __KSYM_module_layout 1" >> "$new_ksyms_file" 74fi 75 76# Extract changes between old and new list and touch corresponding 77# dependency files. 78changed=$( 79count=0 80sort "$cur_ksyms_file" "$new_ksyms_file" | uniq -u | 81sed -n 's/^#define __KSYM_\(.*\) 1/\1/p' | tr "A-Z_" "a-z/" | 82while read sympath; do 83 if [ -z "$sympath" ]; then continue; fi 84 depfile="include/config/ksym/${sympath}.h" 85 mkdir -p "$(dirname "$depfile")" 86 touch "$depfile" 87 # Filesystems with coarse time precision may create timestamps 88 # equal to the one from a file that was very recently built and that 89 # needs to be rebuild. Let's guard against that by making sure our 90 # dep files are always newer than the first file we created here. 91 while [ ! "$depfile" -nt "$new_ksyms_file" ]; do 92 touch "$depfile" 93 done 94 echo $((count += 1)) 95done | tail -1 ) 96changed=${changed:-0} 97 98if [ $changed -gt 0 ]; then 99 # Replace the old list with tne new one 100 old=$(grep -c "^#define __KSYM_" "$cur_ksyms_file" || true) 101 new=$(grep -c "^#define __KSYM_" "$new_ksyms_file" || true) 102 info "KSYMS" "symbols: before=$old, after=$new, changed=$changed" 103 info "UPD" "$cur_ksyms_file" 104 mv -f "$new_ksyms_file" "$cur_ksyms_file" 105 # Then trigger a rebuild of affected source files 106 exec $@ 107else 108 rm -f "$new_ksyms_file" 109fi 110