Module Name:    src
Committed By:   apb
Date:           Sun Aug  3 09:13:11 UTC 2014

Modified Files:
        src/sys/conf: newvers.sh

Log Message:
BUILDINFO part 1: newvers.sh

If the BUILDINFO environment variable is set, then interpret it as
a string with embedded C-style escapes and store it in a new
buildinfo variable in the emitted vers.c file.

Also centralise the awk code for converting a multi-line string
to C source code.


To generate a diff of this commit:
cvs rdiff -u -r1.59 -r1.60 src/sys/conf/newvers.sh

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/conf/newvers.sh
diff -u src/sys/conf/newvers.sh:1.59 src/sys/conf/newvers.sh:1.60
--- src/sys/conf/newvers.sh:1.59	Sat Jun 14 12:42:41 2014
+++ src/sys/conf/newvers.sh	Sun Aug  3 09:13:11 2014
@@ -1,6 +1,6 @@
 #!/bin/sh -
 #
-#	$NetBSD: newvers.sh,v 1.59 2014/06/14 12:42:41 apb Exp $
+#	$NetBSD: newvers.sh,v 1.60 2014/08/03 09:13:11 apb Exp $
 #
 # Copyright (c) 1984, 1986, 1990, 1993
 #	The Regents of the University of California.  All rights reserved.
@@ -60,6 +60,12 @@
 #			(If the -i command line option is used, then
 #			BUILDID is not appended.)
 #
+#     BUILDINFO		A string to be stored in the kernel's buildinfo
+#			variable.  ${BUILDINFO} may be a multi-line string,
+#			and may use C-style backslash escapes.
+#			Lines may be separated by either literal newlines
+#			or "\n" escape sequences.
+#
 # Output files:
 #
 #     vers.c            The "vers.c" file in the current directory is
@@ -96,6 +102,44 @@
 #                       The result is stored in the osrelease variable.
 #
 
+# FUNCTIONS
+
+# source_lines [input] --
+#
+# Convert a multi-line string to a format that's suitable for inclusion in
+# C source code.  The result should look like this:
+#
+# "first line\n"
+# "second line\n"
+#
+# with <backslash><letter n> inside the quotes for each line,
+# literal quotation marks around each line,
+# and a literal newline separating one line from the next.
+#
+# Input is from "$1" if that is defined, or from stdin if $1 is not defined.
+#
+source_lines()
+{
+	if [ -n "${1+set}" ]; then
+		printf "%s" "$1"
+	else
+		cat
+	fi \
+	| awk '{
+		# awk does not care about whether or not the last line
+		# of input ends with a newline.
+		# Convert <backslash> to <backslash><backslash>.
+		gsub("\\\\","\\\\");
+		# Convert <quote> to <backslash><quote>
+		gsub("\"","\\\"");
+		# Add <backslash><letter n> to the end of each line,
+		# and wrap each line in double quotes.
+		printf("\"%s\\n\"\n", $0);
+	}'
+}
+
+# MAIN PROGRAM
+
 if [ ! -e version ]; then
 	echo 0 > version
 fi
@@ -106,7 +150,7 @@ u=${USER-root}
 h=$(hostname)
 d=$(pwd)
 cwd=$(dirname $0)
-copyright=$(awk '{ printf("\"%s\\n\"", $0); }' ${cwd}/copyright)
+copyright="$(cat "${cwd}/copyright")"
 
 while [ $# -gt 0 ]; do
 	case "$1" in
@@ -155,6 +199,14 @@ else
 	fullversion="${ost} ${osr} (${id}) #${v}: ${t}\n\t${u}@${h}:${d}\n"
 fi
 
+# Convert multi-line strings to C source code.
+# Also add an extra blank line to copyright.
+#
+copyright_source="$(printf "%s\n\n" "${copyright}" | source_lines)"
+fullversion_source="$(printf "%b" "${fullversion}" | source_lines)"
+buildinfo_source="$(printf "%b" "${BUILDINFO}" | source_lines)"
+
+# Increment the serial number in the version file
 echo $(expr ${v} + 1) > version
 
 cat << _EOF > vers.c
@@ -170,12 +222,11 @@ cat << _EOF > vers.c
 
 const char ostype[] = "${ost}";
 const char osrelease[] = "${osr}";
-const char sccs[] = "@(#)${fullversion}";
-const char version[] = "${fullversion}";
+const char sccs[] = "@(#)" ${fullversion_source};
+const char version[] = ${fullversion_source};
+const char buildinfo[] = ${buildinfo_source:-\"\"};
 const char kernel_ident[] = "${id}";
-const char copyright[] =
-${copyright}
-"\n";
+const char copyright[] = ${copyright_source};
 _EOF
 
 [ ! -z "${nflag}" ] && exit 0

Reply via email to