nouveau2netbsd revision 1.6 1 #!/bin/sh
2
3 # $NetBSD: nouveau2netbsd,v 1.6 2024/04/16 14:26:53 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]),' \
36 | sed -e 's,^endif$,.endif,' \
37 | env \
38 env CONFIG_ACPI=y \
39 env CONFIG_X86=y \
40 env src=. \
41 make -f /dev/stdin -V '$(nouveau-y)' \
42 | tr ' ' '\n' \
43 | sed -e 's,^$,,' \
44 | sort -u \
45 | sed -e 's,\.o$,.c,' \
46 | awk '
47 BEGIN {
48 duplicates = 0
49 }
50 $1 ~ "nouveau_[^/]*$" {
51 if (seen[$1])
52 printf("Duplicate basename: %s\n", $1)
53 seen[$1] = $1
54 printf("%s %s\n", $1, $1)
55 next
56 }
57 {
58 if (index($1, "/")) {
59 dir = $1
60 sub("/[^/]*$", "/", dir)
61 } else {
62 dir = ""
63 }
64 base = $1
65 sub("^core/", "", base)
66 gsub("/", "_", base)
67 if (seen[base]) {
68 printf("Duplicate basename: %s %s\n", seen[base], $1) \
69 > "/dev/stderr"
70 duplicates = 1
71 }
72 if (duplicates)
73 next
74 seen[base] = $1
75 printf("%s %s\n", $1, dir "nouveau_" base)
76 }
77 END {
78 if (duplicates) {
79 printf("Time to rewite me!\n") > "/dev/stderr"
80 exit 1
81 }
82 }
83 ' >> "$filemap"
84
85 while read from to; do
86 if [ "x$from" != "x$to" ]; then
87 ${MV} -f -- "$from" "$to"
88 fi
89 printf 'file\t%s\t%s\n' "$nouveau_top/$to" "$nouveau_flag"
90 done < "$filemap" | sort
91
92 # We sort the output again at the end because we renamed some files but
93 # left $TOP/nouveau_* unchanged, so their sort order relative to the
94 # ones that got renamed may have changed.
95