nouveau2netbsd revision 1.4 1 #!/bin/sh
2
3 # $NetBSD: nouveau2netbsd,v 1.4 2018/08/27 00:46:10 riastradh Exp $
4 #
5 # $ /path/to/nouveau2netbsd > /path/to/files.nouveau.new
6 #
7 # Run from the top-level Nouveau source directory. This stupid kludge
8 # reinterprets the GNU makefile as a BSD makefile to extract the source
9 # file names, renames the ones that have obscure and/or colliding
10 # basenames to be less obscure and unlikely (though not guaranteed) to
11 # collide, and spits out config(5) directives for all of them.
12
13 set -Ceu
14
15 : ${MV:=mv}
16
17 # Location of the Nouveau sources relative to $NETBSDSRCDIR.
18 nouveau_top=external/bsd/drm2/dist/drm/nouveau
19
20 # config(5) flag for the Nouveau driver.
21 nouveau_flag=nouveau
22
23 filemap=
24
25 clean ()
26 {
27 [ -z "$filemap" ] || rm -f -- "$filemap" || :
28 }
29 trap clean EXIT HUP INT TERM
30
31 filemap="$(mktemp -t ${0##*/})"
32
33 cat Kbuild \
34 | sed -e 's,^include \(.*\)$,.include "\1",' \
35 | sed -e 's,^ifdef \(.*\)$,.if !empty(\1:M[yY][eE][sS]),' \
36 | sed -e 's,^endif$,.endif,' \
37 | make -f /dev/stdin -V '$(nouveau-y)' src=. \
38 | tr ' ' '\n' \
39 | sed -e 's,^$,,' \
40 | sort -u \
41 | sed -e 's,\.o$,.c,' \
42 | awk '
43 BEGIN {
44 duplicates = 0
45 }
46 $1 ~ "nouveau_[^/]*$" {
47 if (seen[$1])
48 printf("Duplicate basename: %s\n", $1)
49 seen[$1] = $1
50 printf("%s %s\n", $1, $1)
51 next
52 }
53 {
54 if (index($1, "/")) {
55 dir = $1
56 sub("/[^/]*$", "/", dir)
57 } else {
58 dir = ""
59 }
60 base = $1
61 sub("^core/", "", base)
62 gsub("/", "_", base)
63 if (seen[base]) {
64 printf("Duplicate basename: %s %s\n", seen[base], $1) \
65 > "/dev/stderr"
66 duplicates = 1
67 }
68 if (duplicates)
69 next
70 seen[base] = $1
71 printf("%s %s\n", $1, dir "nouveau_" base)
72 }
73 END {
74 if (duplicates) {
75 printf("Time to rewite me!\n") > "/dev/stderr"
76 exit 1
77 }
78 }
79 ' >> "$filemap"
80
81 while read from to; do
82 if [ "x$from" != "x$to" ]; then
83 ${MV} -f -- "$from" "$to"
84 fi
85 # Probably not necessary -- Linux tends not to have RCS ids --
86 # but a precaution out of paranoia.
87 cleantags "$to"
88 case $to in
89 *.c)
90 # Heuristically apply NetBSD RCS ids: a comment at the
91 # top of the file, and a __KERNEL_RCSID before the
92 # first cpp line, which, with any luck, should be the
93 # first non-comment line and lie between the copyright
94 # notice and the header.
95 awk '
96 BEGIN {
97 done = 0
98 printf("/*\t%c%s%c\t*/\n\n", "$","NetBSD","$")
99 }
100 /^#/ && !done {
101 printf("#include <sys/cdefs.h>\n")
102 printf("__KERNEL_RCSID(0, \"%c%s%c\");\n",
103 "$","NetBSD","$")
104 printf("\n")
105 done = 1
106 }
107 {
108 print
109 }
110 ' < "$to" > "$to".tmp
111 ;;
112 esac
113 mv -f -- "$to".tmp "$to"
114 printf 'file\t%s\t%s\n' "$nouveau_top/$to" "$nouveau_flag"
115 done < "$filemap" | sort
116
117 # We sort the output again at the end because we renamed some files but
118 # left $TOP/nouveau_* unchanged, so their sort order relative to the
119 # ones that got renamed may have changed.
120