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