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
13set -Ceu
14
15: ${MV:=mv}
16
17# Location of the Nouveau sources relative to $NETBSDSRCDIR.
18nouveau_top=external/bsd/drm2/dist/drm/nouveau
19
20# config(5) flag for the Nouveau driver.
21nouveau_flag=nouveau
22
23filemap=
24
25clean ()
26{
27	[ -z "$filemap" ] || rm -f -- "$filemap" || :
28}
29trap clean EXIT HUP INT TERM
30
31filemap="$(mktemp -t ${0##*/})"
32
33cat 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
81while 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"
115done < "$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