1#!/bin/sh - 2# 3# Copyright (c) 1984, 1986, 1990, 1993 4# The Regents of the University of California. All rights reserved. 5# 6# Redistribution and use in source and binary forms, with or without 7# modification, are permitted provided that the following conditions 8# are met: 9# 1. Redistributions of source code must retain the above copyright 10# notice, this list of conditions and the following disclaimer. 11# 2. Redistributions in binary form must reproduce the above copyright 12# notice, this list of conditions and the following disclaimer in the 13# documentation and/or other materials provided with the distribution. 14# 3. Neither the name of the University nor the names of its contributors 15# may be used to endorse or promote products derived from this software 16# without specific prior written permission. 17# 18# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 19# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 22# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28# SUCH DAMAGE. 29# 30# @(#)newvers.sh 8.1 (Berkeley) 4/20/94 31# $FreeBSD$ 32 33# Command line options: 34# 35# -r Reproducible build. Do not embed directory names, user 36# names, time stamps or other dynamic information into 37# the output file. This is intended to allow two builds 38# done at different times and even by different people on 39# different hosts to produce identical output. 40# 41# -R Reproducible build if the tree represents an unmodified 42# checkout from a version control system. Metadata is 43# included if the tree is modified. 44 45TYPE="FreeBSD" 46REVISION="12.0" 47BRANCH="CURRENT" 48if [ -n "${BRANCH_OVERRIDE}" ]; then 49 BRANCH=${BRANCH_OVERRIDE} 50fi 51RELEASE="${REVISION}-${BRANCH}" 52VERSION="${TYPE} ${RELEASE}" 53 54# 55# findvcs dir 56# Looks up directory dir at world root and up the filesystem 57# 58findvcs() 59{ 60 local savedir 61 62 savedir=$(pwd) 63 cd ${SYSDIR}/.. 64 while [ $(pwd) != "/" ]; do 65 if [ -e "./$1" ]; then 66 VCSDIR=$(pwd)"/$1" 67 cd ${savedir} 68 return 0 69 fi 70 cd .. 71 done 72 cd ${savedir} 73 return 1 74} 75 76if [ -z "${SYSDIR}" ]; then 77 SYSDIR=$(dirname $0)/.. 78fi 79 80if [ -n "${PARAMFILE}" ]; then 81 RELDATE=$(awk '/__FreeBSD_version.*propagated to newvers/ {print $3}' \ 82 ${PARAMFILE}) 83else 84 RELDATE=$(awk '/__FreeBSD_version.*propagated to newvers/ {print $3}' \ 85 ${SYSDIR}/sys/param.h) 86fi 87 88b=share/examples/etc/bsd-style-copyright 89if [ -r "${SYSDIR}/../COPYRIGHT" ]; then 90 year=$(sed -Ee '/^Copyright .* The FreeBSD Project/!d;s/^.*1992-([0-9]*) .*$/\1/g' ${SYSDIR}/../COPYRIGHT) 91else 92 year=$(date +%Y) 93fi 94# look for copyright template 95for bsd_copyright in ../$b ../../$b ../../../$b /usr/src/$b /usr/$b 96do 97 if [ -r "$bsd_copyright" ]; then 98 COPYRIGHT=`sed \ 99 -e "s/\[year\]/1992-$year/" \ 100 -e 's/\[your name here\]\.* /The FreeBSD Project./' \ 101 -e 's/\[your name\]\.*/The FreeBSD Project./' \ 102 -e '/\[id for your version control system, if any\]/d' \ 103 $bsd_copyright` 104 break 105 fi 106done 107 108# no copyright found, use a dummy 109if [ -z "$COPYRIGHT" ]; then 110 COPYRIGHT="/*- 111 * Copyright (c) 1992-$year The FreeBSD Project. 112 * All rights reserved. 113 * 114 */" 115fi 116 117# add newline 118COPYRIGHT="$COPYRIGHT 119" 120 121# VARS_ONLY means no files should be generated, this is just being 122# included. 123if [ -n "$VARS_ONLY" ]; then 124 return 0 125fi 126 127LC_ALL=C; export LC_ALL 128if [ ! -r version ] 129then 130 echo 0 > version 131fi 132 133touch version 134v=`cat version` 135u=${USER:-root} 136d=`pwd` 137h=${HOSTNAME:-`hostname`} 138if [ -n "$SOURCE_DATE_EPOCH" ]; then 139 if ! t=`date -r $SOURCE_DATE_EPOCH 2>/dev/null`; then 140 echo "Invalid SOURCE_DATE_EPOCH" >&2 141 exit 1 142 fi 143else 144 t=`date` 145fi 146i=`${MAKE:-make} -V KERN_IDENT` 147compiler_v=$($(${MAKE:-make} -V CC) -v 2>&1 | grep -w 'version') 148 149for dir in /usr/bin /usr/local/bin; do 150 if [ ! -z "${svnversion}" ] ; then 151 break 152 fi 153 if [ -x "${dir}/svnversion" ] && [ -z ${svnversion} ] ; then 154 # Run svnversion from ${dir} on this script; if return code 155 # is not zero, the checkout might not be compatible with the 156 # svnversion being used. 157 ${dir}/svnversion $(realpath ${0}) >/dev/null 2>&1 158 if [ $? -eq 0 ]; then 159 svnversion=${dir}/svnversion 160 break 161 fi 162 fi 163done 164 165if [ -z "${svnversion}" ] && [ -x /usr/bin/svnliteversion ] ; then 166 /usr/bin/svnliteversion $(realpath ${0}) >/dev/null 2>&1 167 if [ $? -eq 0 ]; then 168 svnversion=/usr/bin/svnliteversion 169 else 170 svnversion= 171 fi 172fi 173 174for dir in /usr/bin /usr/local/bin; do 175 if [ -x "${dir}/p4" ] && [ -z ${p4_cmd} ] ; then 176 p4_cmd=${dir}/p4 177 fi 178done 179 180if findvcs .git; then 181 for dir in /usr/bin /usr/local/bin; do 182 if [ -x "${dir}/git" ] ; then 183 git_cmd="${dir}/git --git-dir=${VCSDIR}" 184 break 185 fi 186 done 187fi 188 189if findvcs .hg; then 190 for dir in /usr/bin /usr/local/bin; do 191 if [ -x "${dir}/hg" ] ; then 192 hg_cmd="${dir}/hg -R ${VCSDIR}" 193 break 194 fi 195 done 196fi 197 198if [ -n "$svnversion" ] ; then 199 svn=`cd ${SYSDIR} && $svnversion 2>/dev/null` 200 case "$svn" in 201 [0-9]*[MSP]|*:*) 202 svn=" r${svn}" 203 modified=true 204 ;; 205 [0-9]*) 206 svn=" r${svn}" 207 ;; 208 *) 209 unset svn 210 ;; 211 esac 212fi 213 214if [ -n "$git_cmd" ] ; then 215 git=`$git_cmd rev-parse --verify --short HEAD 2>/dev/null` 216 svn=`$git_cmd svn find-rev $git 2>/dev/null` 217 if [ -n "$svn" ] ; then 218 svn=" r${svn}" 219 git="=${git}" 220 else 221 svn=`$git_cmd log --grep '^git-svn-id:' | \ 222 grep '^ git-svn-id:' | head -1 | \ 223 sed -n 's/^.*@\([0-9][0-9]*\).*$/\1/p'` 224 if [ -z "$svn" ] ; then 225 svn=`$git_cmd log --format='format:%N' | \ 226 grep '^svn ' | head -1 | \ 227 sed -n 's/^.*revision=\([0-9][0-9]*\).*$/\1/p'` 228 fi 229 if [ -n "$svn" ] ; then 230 svn=" r${svn}" 231 git="+${git}" 232 else 233 git=" ${git}" 234 fi 235 fi 236 git_b=`$git_cmd rev-parse --abbrev-ref HEAD` 237 if [ -n "$git_b" ] ; then 238 git="${git}(${git_b})" 239 fi 240 if $git_cmd --work-tree=${VCSDIR}/.. diff-index \ 241 --name-only HEAD | read dummy; then 242 git="${git}-dirty" 243 modified=true 244 fi 245fi 246 247if [ -n "$p4_cmd" ] ; then 248 p4version=`cd ${SYSDIR} && $p4_cmd changes -m1 "./...#have" 2>&1 | \ 249 awk '{ print $2 }'` 250 case "$p4version" in 251 [0-9]*) 252 p4version=" ${p4version}" 253 p4opened=`cd ${SYSDIR} && $p4_cmd opened ./... 2>&1` 254 case "$p4opened" in 255 File*) ;; 256 //*) 257 p4version="${p4version}+edit" 258 modified=true 259 ;; 260 esac 261 ;; 262 *) unset p4version ;; 263 esac 264fi 265 266if [ -n "$hg_cmd" ] ; then 267 hg=`$hg_cmd id 2>/dev/null` 268 svn=`$hg_cmd svn info 2>/dev/null | \ 269 awk -F': ' '/Revision/ { print $2 }'` 270 if [ -n "$svn" ] ; then 271 svn=" r${svn}" 272 fi 273 if [ -n "$hg" ] ; then 274 hg=" ${hg}" 275 fi 276fi 277 278include_metadata=true 279while getopts rR opt; do 280 case "$opt" in 281 r) 282 include_metadata= 283 ;; 284 R) 285 if [ -z "${modified}" ]; then 286 include_metadata= 287 fi 288 esac 289done 290shift $((OPTIND - 1)) 291 292if [ -z "${include_metadata}" ]; then 293 VERINFO="${VERSION} ${svn}${git}${hg}${p4version}" 294 VERSTR="${VERINFO}\\n" 295else 296 VERINFO="${VERSION} #${v}${svn}${git}${hg}${p4version}: ${t}" 297 VERSTR="${VERINFO}\\n ${u}@${h}:${d}\\n" 298fi 299 300cat << EOF > vers.c 301$COPYRIGHT 302#define SCCSSTR "@(#)${VERINFO}" 303#define VERSTR "${VERSTR}" 304#define RELSTR "${RELEASE}" 305 306char sccs[sizeof(SCCSSTR) > 128 ? sizeof(SCCSSTR) : 128] = SCCSSTR; 307char version[sizeof(VERSTR) > 256 ? sizeof(VERSTR) : 256] = VERSTR; 308char compiler_version[] = "${compiler_v}"; 309char ostype[] = "${TYPE}"; 310char osrelease[sizeof(RELSTR) > 32 ? sizeof(RELSTR) : 32] = RELSTR; 311int osreldate = ${RELDATE}; 312char kern_ident[] = "${i}"; 313EOF 314 315echo $((v + 1)) > version 316