]>
Commit | Line | Data |
---|---|---|
23121ca2 NP |
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 | ||
21 | set -e | |
22 | ||
23 | cur_ksyms_file="include/generated/autoksyms.h" | |
24 | new_ksyms_file="include/generated/autoksyms.h.tmpnew" | |
25 | ||
26 | info() { | |
27 | if [ "$quiet" != "silent_" ]; then | |
28 | printf " %-7s %s\n" "$1" "$2" | |
29 | fi | |
30 | } | |
31 | ||
32 | info "CHK" "$cur_ksyms_file" | |
33 | ||
34 | # Use "make V=1" to debug this script. | |
35 | case "$KBUILD_VERBOSE" in | |
36 | *1*) | |
37 | set -x | |
38 | ;; | |
39 | esac | |
40 | ||
41 | # We need access to CONFIG_ symbols | |
42 | case "${KCONFIG_CONFIG}" in | |
43 | */*) | |
44 | . "${KCONFIG_CONFIG}" | |
45 | ;; | |
46 | *) | |
47 | # Force using a file from the current directory | |
48 | . "./${KCONFIG_CONFIG}" | |
49 | esac | |
50 | ||
51 | # In case it doesn't exist yet... | |
52 | if [ -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. | |
56 | cat > "$new_ksyms_file" << EOT | |
57 | /* | |
58 | * Automatically generated file; DO NOT EDIT. | |
59 | */ | |
60 | ||
61 | EOT | |
d073472a | 62 | [ "$(ls -A "$MODVERDIR")" ] && |
a7c65b97 | 63 | sed -ns -e '3{s/ /\n/g;/^$/!p;}' "$MODVERDIR"/*.mod | sort -u | |
23121ca2 NP |
64 | while read sym; do |
65 | if [ -n "$CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX" ]; then | |
66 | sym="${sym#_}" | |
67 | fi | |
68 | echo "#define __KSYM_${sym} 1" | |
69 | done >> "$new_ksyms_file" | |
70 | ||
71 | # Special case for modversions (see modpost.c) | |
72 | if [ -n "$CONFIG_MODVERSIONS" ]; then | |
73 | echo "#define __KSYM_module_layout 1" >> "$new_ksyms_file" | |
74 | fi | |
75 | ||
76 | # Extract changes between old and new list and touch corresponding | |
77 | # dependency files. | |
78 | changed=$( | |
79 | count=0 | |
80 | sort "$cur_ksyms_file" "$new_ksyms_file" | uniq -u | | |
81 | sed -n 's/^#define __KSYM_\(.*\) 1/\1/p' | tr "A-Z_" "a-z/" | | |
82 | while 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 | echo $((count += 1)) | |
88 | done | tail -1 ) | |
89 | changed=${changed:-0} | |
90 | ||
91 | if [ $changed -gt 0 ]; then | |
92 | # Replace the old list with tne new one | |
93 | old=$(grep -c "^#define __KSYM_" "$cur_ksyms_file" || true) | |
94 | new=$(grep -c "^#define __KSYM_" "$new_ksyms_file" || true) | |
95 | info "KSYMS" "symbols: before=$old, after=$new, changed=$changed" | |
96 | info "UPD" "$cur_ksyms_file" | |
97 | mv -f "$new_ksyms_file" "$cur_ksyms_file" | |
98 | # Then trigger a rebuild of affected source files | |
99 | exec $@ | |
100 | else | |
101 | rm -f "$new_ksyms_file" | |
102 | fi |