Home | History | Annotate | Line # | Download | only in nouveau
nouveau2netbsd revision 1.3
      1 #!/bin/sh
      2 
      3 #	$NetBSD: nouveau2netbsd,v 1.3 2018/08/27 00:46:04 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 
     13 set -Ceu
     14 
     15 : ${MV:=mv}
     16 
     17 # Location of the Nouveau sources relative to $NETBSDSRCDIR.
     18 nouveau_top=external/bsd/drm2/dist/drm/nouveau
     19 
     20 # config(5) flag for the Nouveau driver.
     21 nouveau_flag=nouveau
     22 
     23 filemap=
     24 
     25 clean ()
     26 {
     27 	[ -z "$filemap" ] || rm -f -- "$filemap" || :
     28 }
     29 trap clean EXIT HUP INT TERM
     30 
     31 filemap="$(mktemp -t ${0##*/})"
     32 
     33 cat Makefile								\
     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 
     81 while 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"
    115 done < "$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