xref: /netbsd-src/sys/conf/newvers.sh (revision 92e958de60c71aa0f2452bd7074cbb006fe6546b)
1#!/bin/sh -
2#
3#	$NetBSD: newvers.sh,v 1.61 2014/08/03 13:14:59 justin Exp $
4#
5# Copyright (c) 1984, 1986, 1990, 1993
6#	The Regents of the University of California.  All rights reserved.
7#
8# Redistribution and use in source and binary forms, with or without
9# modification, are permitted provided that the following conditions
10# are met:
11# 1. Redistributions of source code must retain the above copyright
12#    notice, this list of conditions and the following disclaimer.
13# 2. Redistributions in binary form must reproduce the above copyright
14#    notice, this list of conditions and the following disclaimer in the
15#    documentation and/or other materials provided with the distribution.
16# 3. Neither the name of the University nor the names of its contributors
17#    may be used to endorse or promote products derived from this software
18#    without specific prior written permission.
19#
20# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30# SUCH DAMAGE.
31#
32#	@(#)newvers.sh	8.1 (Berkeley) 4/20/94
33
34# newvers.sh -- Create a "vers.c" file containing version information.
35#
36# The "vers.c" file in the current directory is the primary output.  It
37# contains C source code with several variables containing information
38# about the build.  This file is expected to be incorporated into a
39# kernel, and when that kernel is booted then the information can be
40# queried by the uname(8) command.
41#
42# Command line options:
43#
44#     -r                Reproducible build: Do not embed directory
45#                       names, user names, time stamps, or other dynamic
46#                       information into the output file.  This intended
47#                       to allow two builds done at different times and
48#                       even by different people on different hosts to
49#                       produce identical output.
50#
51#     -i <id>           Use the specified string as the value of the
52#                       kernel_ident variable
53#
54#     -n                Do not include an ELF note section in the output
55#                       file.
56# Environment variables:
57#
58#     BUILDID		If defined, ${BUILDID} is appended to the
59#			default value of the kernel_ident string.
60#			(If the -i command line option is used, then
61#			BUILDID is not appended.)
62#
63#     BUILDINFO		A string to be stored in the kernel's buildinfo
64#			variable.  ${BUILDINFO} may be a multi-line string,
65#			and may use C-style backslash escapes.
66#			Lines may be separated by either literal newlines
67#			or "\n" escape sequences.
68#
69# Output files:
70#
71#     vers.c            The "vers.c" file in the current directory is
72#                       the primary output.
73#
74#     version           The "version" file in the current directory
75#                       is both an input and an output.  See the
76#                       description under "Input files".
77#
78# Input files:
79#
80#     version           The "version" file in the current directory
81#                       contains an integer counter, representing the
82#                       number of times this script has been executed in
83#                       this directory, starting with "0" if the file
84#                       does not exist.  The serial number in the file
85#                       is incremented after the file is read. so that
86#                       the incremented serial number is an output from
87#                       the present build and an input to the next build
88#                       that is performed in the same directory.
89#
90#     copyright         The "copyright" file (in the same directory as
91#                       this script itself) contains a copyright notice,
92#                       which is embedded in the copyright variable in
93#                       the output file.
94#
95#     ident             The "ident" file in the current directory is optional.
96#			If this file exists, then its contents override the
97#			default value of the kernel_ident string.
98#
99# Input from external commands:
100#
101#     osrelease.sh      This script is expected to print the OS revision.
102#                       The result is stored in the osrelease variable.
103#
104
105# FUNCTIONS
106
107# source_lines [input] --
108#
109# Convert a multi-line string to a format that's suitable for inclusion in
110# C source code.  The result should look like this:
111#
112# "first line\n"
113# "second line\n"
114#
115# with <backslash><letter n> inside the quotes for each line,
116# literal quotation marks around each line,
117# and a literal newline separating one line from the next.
118#
119# Input is from "$1" if that is defined, or from stdin if $1 is not defined.
120#
121source_lines()
122{
123	if [ -n "${1+set}" ]; then
124		printf "%s" "$1"
125	else
126		cat
127	fi \
128	| awk '{
129		# awk does not care about whether or not the last line
130		# of input ends with a newline.
131		# Convert <backslash> to <backslash><backslash>.
132		gsub("\\\\","\\\\");
133		# Convert <quote> to <backslash><quote>
134		gsub("\"","\\\"");
135		# Add <backslash><letter n> to the end of each line,
136		# and wrap each line in double quotes.
137		printf("\"%s\\n\"\n", $0);
138	}'
139}
140
141# MAIN PROGRAM
142
143if [ ! -e version ]; then
144	echo 0 > version
145fi
146
147v=$(cat version)
148t=$(LC_ALL=C date)
149u=${USER-root}
150h=$(hostname)
151d=$(pwd)
152cwd=$(dirname $0)
153copyright="$(cat "${cwd}/copyright")"
154
155while [ $# -gt 0 ]; do
156	case "$1" in
157	-r)
158		# -r: Reproducible build
159		rflag=true
160		;;
161	-i)
162		# -i <id>: Use the secified string as the
163		# value of the kernel_ident variable
164		id="$2"
165		shift
166		;;
167	-n)
168		# -n: Do not include a ELF note section
169		# in the output file.
170		nflag=true
171		;;
172	esac
173	shift
174done
175
176if [ -z "${id}" ]; then
177	if [ -f ident ]; then
178		id="$(cat ident)"
179	else
180		id=$(basename ${d})
181	fi
182	# Append ".${BUILDID}" to the default value of <id>.
183	# If the "-i <id>" command line option was used then this
184	# branch is not taken, so the command-line value of <id>
185	# is used without change.
186	if [ -n "${BUILDID}" ]; then
187		id="${id}.${BUILDID}"
188	fi
189fi
190
191osrelcmd=${cwd}/osrelease.sh
192
193ost="NetBSD"
194osr=$(sh $osrelcmd)
195
196if [ ! -z "${rflag}" ]; then
197	fullversion="${ost} ${osr} (${id})\n"
198else
199	fullversion="${ost} ${osr} (${id}) #${v}: ${t}\n\t${u}@${h}:${d}\n"
200fi
201
202# Convert multi-line strings to C source code.
203# Also add an extra blank line to copyright.
204#
205copyright_source="$(printf "%s\n\n" "${copyright}" | source_lines)"
206fullversion_source="$(printf "%b" "${fullversion}" | source_lines)"
207buildinfo_source="$(printf "%b" "${BUILDINFO}" | source_lines)"
208
209# Increment the serial number in the version file
210echo $(expr ${v} + 1) > version
211
212# work around escaping issues with different shells
213emptyq='""'
214
215cat << _EOF > vers.c
216/*
217 * Automatically generated file from $0
218 * Do not edit.
219 */
220#include <sys/cdefs.h>
221#include <sys/types.h>
222#include <sys/param.h>
223#include <sys/exec.h>
224#include <sys/exec_elf.h>
225
226const char ostype[] = "${ost}";
227const char osrelease[] = "${osr}";
228const char sccs[] = "@(#)" ${fullversion_source};
229const char version[] = ${fullversion_source};
230const char buildinfo[] = ${buildinfo_source:-${emptyq}};
231const char kernel_ident[] = "${id}";
232const char copyright[] = ${copyright_source};
233_EOF
234
235[ ! -z "${nflag}" ] && exit 0
236
237cat << _EOF >> vers.c
238
239/*
240 * NetBSD identity note.
241 */
242#ifdef __arm__
243#define _SHT_NOTE	%note
244#else
245#define _SHT_NOTE	@note
246#endif
247
248#define	_S(TAG)	__STRING(TAG)
249__asm(
250	".section\t\".note.netbsd.ident\", \"\"," _S(_SHT_NOTE) "\n"
251	"\t.p2align\t2\n"
252	"\t.long\t" _S(ELF_NOTE_NETBSD_NAMESZ) "\n"
253	"\t.long\t" _S(ELF_NOTE_NETBSD_DESCSZ) "\n"
254	"\t.long\t" _S(ELF_NOTE_TYPE_NETBSD_TAG) "\n"
255	"\t.ascii\t" _S(ELF_NOTE_NETBSD_NAME) "\n"
256	"\t.long\t" _S(__NetBSD_Version__) "\n"
257	"\t.p2align\t2\n"
258);
259
260_EOF
261