nouveau2netbsd revision 1.1
1#!/bin/sh 2 3# $NetBSD: nouveau2netbsd,v 1.1 2014/08/05 17:39:07 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# Location of the Nouveau sources relative to $NETBSDSRCDIR. 16nouveau_top=external/bsd/drm2/dist/drm/nouveau 17 18# config(5) flag for the Nouveau driver. 19nouveau_flag=nouveau 20 21filemap= 22 23clean () 24{ 25 [ -z "$filemap" ] || rm -f -- "$filemap" || : 26} 27trap clean EXIT HUP INT TERM 28 29filemap="$(mktemp -t ${0##*/})" 30 31cat Makefile \ 32| sed -e 's,^include \(.*\)$,.include "\1",' \ 33| sed -e 's,^ifdef \(.*\)$,.if !empty(\1:M[yY][eE][sS]),' \ 34| sed -e 's,^endif$,.endif,' \ 35| make -f /dev/stdin -V nouveau-y src=. \ 36| tr ' ' '\n' \ 37| sed -e 's,^$,,' \ 38| sort -u \ 39| sed -e 's,\.o$,.c,' \ 40| awk ' 41 BEGIN { 42 duplicates = 0 43 } 44 $1 ~ "nouveau_[^/]*$" { 45 if (seen[$1]) 46 printf("Duplicate basename: %s\n", $1) 47 seen[$1] = $1 48 printf("%s %s\n", $1, $1) 49 next 50 } 51 { 52 if (index($1, "/")) { 53 dir = $1 54 sub("/[^/]*$", "/", dir) 55 } else { 56 dir = "" 57 } 58 base = $1 59 sub("^core/", "", base) 60 gsub("/", "_", base) 61 if (seen[base]) { 62 printf("Duplicate basename: %s %s\n", seen[base], $1) \ 63 > "/dev/stderr" 64 duplicates = 1 65 } 66 if (duplicates) 67 next 68 seen[base] = $1 69 printf("%s %s\n", $1, dir "nouveau_" base) 70 } 71 END { 72 if (duplicates) { 73 printf("Time to rewite me!\n") > "/dev/stderr" 74 exit 1 75 } 76 } 77' >> "$filemap" 78 79while read from to; do 80 if [ "x$from" != "x$to" ]; then 81 mv -f -- "$from" "$to" 82 fi 83 # Probably not necessary -- Linux tends not to have RCS ids -- 84 # but a precaution out of paranoia. 85 cleantags "$to" 86 case $to in 87 *.c) 88 awk ' 89 BEGIN { 90 done = 0 91 printf("/*\t%c%s%c\t*/\n\n", "$","NetBSD","$") 92 } 93 /^#include/ && !done { 94 printf("#include <sys/cdefs.h>\n") 95 printf("__KERNEL_RCSID(0, \"%c%s%c\");\n", 96 "$","NetBSD","$") 97 printf("\n") 98 done = 1 99 } 100 { 101 print 102 } 103 ' < "$to" > "$to".tmp 104 ;; 105 esac 106 mv -f -- "$to".tmp "$to" 107 printf 'file\t%s\t%s\n' "$nouveau_top/$to" "$nouveau_flag" 108done < "$filemap" | sort 109 110# We sort the output again at the end because we renamed some files but 111# left $TOP/nouveau_* unchanged, so their sort order relative to the 112# ones that got renamed may have changed. 113