1#!/bin/sh - 2# 3# SPDX-License-Identifier: BSD-3-Clause 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# $FreeBSD$ 34 35# Command line options: 36# 37# -c Print the copyright / license statement as a C comment and exit 38# 39# -r Reproducible build. Do not embed directory names, user names, 40# time stamps or other dynamic information into the output file. 41# This is intended to allow two builds done at different times 42# and even by different people on different hosts to produce 43# identical output. 44# 45# -R Reproducible build if the tree represents an unmodified 46# checkout from a version control system. Metadata is included 47# if the tree is modified. 48# 49# -V var Print ${var}="${val-of-var}" and exit 50# 51# -v Print TYPE REVISION BRANCH RELEASE VERSION RELDATE variables 52# like the -V command 53# 54 55TYPE="FreeBSD" 56REVISION="13.0" 57BRANCH="CURRENT" 58if [ -n "${BRANCH_OVERRIDE}" ]; then 59 BRANCH=${BRANCH_OVERRIDE} 60fi 61RELEASE="${REVISION}-${BRANCH}" 62VERSION="${TYPE} ${RELEASE}" 63 64if [ -z "${SYSDIR}" ]; then 65 SYSDIR=$(dirname $0)/.. 66fi 67 68RELDATE=$(awk '/__FreeBSD_version.*propagated to newvers/ {print $3}' ${PARAMFILE:-${SYSDIR}/sys/param.h}) 69 70if [ -r "${SYSDIR}/../COPYRIGHT" ]; then 71 year=$(sed -Ee '/^Copyright .* The FreeBSD Project/!d;s/^.*1992-([0-9]*) .*$/\1/g' ${SYSDIR}/../COPYRIGHT) 72else 73 year=$(date +%Y) 74fi 75# look for copyright template 76b=share/examples/etc/bsd-style-copyright 77for bsd_copyright in $b ../$b ../../$b ../../../$b /usr/src/$b /usr/$b 78do 79 if [ -r "$bsd_copyright" ]; then 80 COPYRIGHT=$(sed \ 81 -e "s/\[year\]/1992-$year/" \ 82 -e 's/\[your name here\]\.* /The FreeBSD Project./' \ 83 -e 's/\[your name\]\.*/The FreeBSD Project./' \ 84 -e '/\[id for your version control system, if any\]/d' \ 85 $bsd_copyright) 86 break 87 fi 88done 89 90# no copyright found, use a dummy 91if [ -z "$COPYRIGHT" ]; then 92 COPYRIGHT="/*- 93 * Copyright (c) 1992-$year The FreeBSD Project. 94 * 95 */" 96fi 97 98# add newline 99COPYRIGHT="$COPYRIGHT 100" 101 102# We expand include_metadata later since we may set it to the 103# future value of modified. 104include_metadata=yes 105modified=no 106while getopts crRvV: opt; do 107 case "$opt" in 108 c) 109 echo "$COPYRIGHT" 110 exit 0 111 ;; 112 r) 113 include_metadata=no 114 ;; 115 R) 116 include_metadata=if-modified 117 ;; 118 v) 119 # Only put variables that are single lines here. 120 for v in TYPE REVISION BRANCH RELEASE VERSION RELDATE; do 121 eval val=\$${v} 122 echo ${v}=\"${val}\" 123 done 124 exit 0 125 ;; 126 V) 127 v=$OPTARG 128 eval val=\$${v} 129 echo ${v}=\"${val}\" 130 exit 0 131 ;; 132 esac 133done 134shift $((OPTIND - 1)) 135 136# VARS_ONLY means no files should be generated, this is just being 137# included. 138[ -n "$VARS_ONLY" ] && return 0 139 140# 141# findvcs dir 142# Looks up directory dir at world root and up the filesystem 143# 144findvcs() 145{ 146 local savedir 147 148 savedir=$(pwd) 149 cd ${SYSDIR}/.. 150 while [ $(pwd) != "/" ]; do 151 if [ -e "./$1" ]; then 152 VCSTOP=$(pwd) 153 VCSDIR=${VCSTOP}"/$1" 154 cd ${savedir} 155 return 0 156 fi 157 cd .. 158 done 159 cd ${savedir} 160 return 1 161} 162 163git_tree_modified() 164{ 165 # git diff-index lists both files that are known to have changes as 166 # well as those with metadata that does not match what is recorded in 167 # git's internal state. The latter case is indicated by an all-zero 168 # destination file hash. 169 170 local fifo 171 172 fifo=$(mktemp -u) 173 mkfifo -m 600 $fifo || exit 1 174 $git_cmd --work-tree=${VCSTOP} diff-index HEAD > $fifo & 175 while read smode dmode ssha dsha status file; do 176 if ! expr $dsha : '^00*$' >/dev/null; then 177 rm $fifo 178 return 0 179 fi 180 if ! $git_cmd --work-tree=${VCSTOP} diff --quiet -- "${file}"; then 181 rm $fifo 182 return 0 183 fi 184 done < $fifo 185 # No files with content differences. 186 rm $fifo 187 return 1 188} 189 190LC_ALL=C; export LC_ALL 191if [ ! -r version ] 192then 193 echo 0 > version 194fi 195 196touch version 197v=$(cat version) 198u=${USER:-root} 199d=$(pwd) 200h=${HOSTNAME:-$(hostname)} 201if [ -n "$SOURCE_DATE_EPOCH" ]; then 202 if ! t=$(date -r $SOURCE_DATE_EPOCH 2>/dev/null); then 203 echo "Invalid SOURCE_DATE_EPOCH" >&2 204 exit 1 205 fi 206else 207 t=$(date) 208fi 209i=$(${MAKE:-make} -V KERN_IDENT) 210compiler_v=$($(${MAKE:-make} -V CC) -v 2>&1 | grep -w 'version') 211 212for dir in /usr/bin /usr/local/bin; do 213 if [ ! -z "${svnversion}" ] ; then 214 break 215 fi 216 if [ -x "${dir}/svnversion" ] && [ -z ${svnversion} ] ; then 217 # Run svnversion from ${dir} on this script; if return code 218 # is not zero, the checkout might not be compatible with the 219 # svnversion being used. 220 ${dir}/svnversion $(realpath ${0}) >/dev/null 2>&1 221 if [ $? -eq 0 ]; then 222 svnversion=${dir}/svnversion 223 break 224 fi 225 fi 226done 227 228if [ -z "${svnversion}" ] && [ -x /usr/bin/svnliteversion ] ; then 229 /usr/bin/svnliteversion $(realpath ${0}) >/dev/null 2>&1 230 if [ $? -eq 0 ]; then 231 svnversion=/usr/bin/svnliteversion 232 else 233 svnversion= 234 fi 235fi 236 237if findvcs .git; then 238 for dir in /usr/bin /usr/local/bin; do 239 if [ -x "${dir}/git" ] ; then 240 git_cmd="${dir}/git -c help.autocorrect=0 --git-dir=${VCSDIR}" 241 break 242 fi 243 done 244fi 245 246if findvcs .hg; then 247 for dir in /usr/bin /usr/local/bin; do 248 if [ -x "${dir}/hg" ] ; then 249 hg_cmd="${dir}/hg -R ${VCSDIR}" 250 break 251 fi 252 done 253fi 254 255if [ -n "$svnversion" ] ; then 256 svn=$(cd ${SYSDIR} && $svnversion 2>/dev/null) 257 case "$svn" in 258 [0-9]*[MSP]|*:*) 259 svn=" r${svn}" 260 modified=yes 261 ;; 262 [0-9]*) 263 svn=" r${svn}" 264 ;; 265 *) 266 unset svn 267 ;; 268 esac 269fi 270 271if [ -n "$git_cmd" ] ; then 272 git=$($git_cmd rev-parse --verify --short HEAD 2>/dev/null) 273 gitsvn=$($git_cmd svn find-rev $git 2>/dev/null) 274 if [ -n "$gitsvn" ] ; then 275 svn=" r${gitsvn}" 276 git="=${git}" 277 else 278# Log searches are limited to 10k commits to speed up failures. 279# We assume that if a tree is more than 10k commits out-of-sync 280# with FreeBSD, it has forked the the OS and the SVN rev no 281# longer matters. 282 gitsvn=$($git_cmd log -n 10000 | 283 grep '^ git-svn-id:' | head -1 | \ 284 sed -n 's/^.*@\([0-9][0-9]*\).*$/\1/p') 285 if [ -z "$gitsvn" ] ; then 286 gitsvn=$($git_cmd log -n 10000 --format='format:%N' | \ 287 grep '^svn ' | head -1 | \ 288 sed -n 's/^.*revision=\([0-9][0-9]*\).*$/\1/p') 289 fi 290 if [ -n "$gitsvn" ] ; then 291 svn=" r${gitsvn}" 292 git="+${git}" 293 else 294 git=" ${git}" 295 fi 296 fi 297 git_cnt=$($git_cmd rev-list --count HEAD 2>/dev/null) 298 if [ -n "$git_cnt" ] ; then 299 git="${git}-c${git_cnt}" 300 fi 301 git_b=$($git_cmd rev-parse --abbrev-ref HEAD) 302 if [ -n "$git_b" ] ; then 303 git="${git}(${git_b})" 304 fi 305 if git_tree_modified; then 306 git="${git}-dirty" 307 modified=yes 308 fi 309fi 310 311if [ -n "$hg_cmd" ] ; then 312 hg=$($hg_cmd id 2>/dev/null) 313 hgsvn=$($hg_cmd svn info 2>/dev/null | \ 314 awk -F': ' '/Revision/ { print $2 }') 315 if [ -n "$hgsvn" ] ; then 316 svn=" r${hgsvn}" 317 fi 318 if [ -n "$hg" ] ; then 319 hg=" ${hg}" 320 fi 321fi 322 323[ ${include_metadata} = "if-modified" -a ${modified} = "yes" ] && include_metadata=yes 324if [ ${include_metadata} != "yes" ]; then 325 VERINFO="${VERSION}${svn}${git}${hg} ${i}" 326 VERSTR="${VERINFO}\\n" 327else 328 VERINFO="${VERSION} #${v}${svn}${git}${hg}: ${t}" 329 VERSTR="${VERINFO}\\n ${u}@${h}:${d}\\n" 330fi 331 332vers_content_new=$(cat << EOF 333$COPYRIGHT 334#define SCCSSTR "@(#)${VERINFO}" 335#define VERSTR "${VERSTR}" 336#define RELSTR "${RELEASE}" 337 338char sccs[sizeof(SCCSSTR) > 128 ? sizeof(SCCSSTR) : 128] = SCCSSTR; 339char version[sizeof(VERSTR) > 256 ? sizeof(VERSTR) : 256] = VERSTR; 340char compiler_version[] = "${compiler_v}"; 341char ostype[] = "${TYPE}"; 342char osrelease[sizeof(RELSTR) > 32 ? sizeof(RELSTR) : 32] = RELSTR; 343int osreldate = ${RELDATE}; 344char kern_ident[] = "${i}"; 345EOF 346) 347vers_content_old=$(cat vers.c 2>/dev/null || true) 348if [ "$vers_content_new" != "$vers_content_old" ]; then 349 printf "%s" "$vers_content_new" > vers.c 350fi 351 352echo $((v + 1)) > version 353