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