nouveau2netbsd revision 1.5
1#!/bin/sh 2 3# $NetBSD: nouveau2netbsd,v 1.5 2018/08/27 00:46:21 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 printf 'file\t%s\t%s\n' "$nouveau_top/$to" "$nouveau_flag" 86done < "$filemap" | sort 87 88# We sort the output again at the end because we renamed some files but 89# left $TOP/nouveau_* unchanged, so their sort order relative to the 90# ones that got renamed may have changed. 91