Blame view

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