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 [ -d "./$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 | fgrep 'git-svn-id:' | head -1 | \ 222 sed -n 's/^.*@\([0-9][0-9]*\).*$/\1/p'` 223 if [ -z "$svn" ] ; then 224 svn=`$git_cmd log --format='format:%N' | \ 225 grep '^svn ' | head -1 | \ 226 sed -n 's/^.*revision=\([0-9][0-9]*\).*$/\1/p'` 227 fi 228 if [ -n "$svn" ] ; then 229 svn=" r${svn}" 230 git="+${git}" 231 else 232 git=" ${git}" 233 fi 234 fi 235 git_b=`$git_cmd rev-parse --abbrev-ref HEAD` 236 if [ -n "$git_b" ] ; then 237 git="${git}(${git_b})" 238 fi 239 if $git_cmd --work-tree=${VCSDIR}/.. diff-index \ 240 --name-only HEAD | read dummy; then 241 git="${git}-dirty" 242 modified=true 243 fi 244fi 245 246if [ -n "$p4_cmd" ] ; then 247 p4version=`cd ${SYSDIR} && $p4_cmd changes -m1 "./...#have" 2>&1 | \ 248 awk '{ print $2 }'` 249 case "$p4version" in 250 [0-9]*) 251 p4version=" ${p4version}" 252 p4opened=`cd ${SYSDIR} && $p4_cmd opened ./... 2>&1` 253 case "$p4opened" in 254 File*) ;; 255 //*) 256 p4version="${p4version}+edit" 257 modified=true 258 ;; 259 esac 260 ;; 261 *) unset p4version ;; 262 esac 263fi 264 265if [ -n "$hg_cmd" ] ; then 266 hg=`$hg_cmd id 2>/dev/null` 267 svn=`$hg_cmd svn info 2>/dev/null | \ 268 awk -F': ' '/Revision/ { print $2 }'` 269 if [ -n "$svn" ] ; then 270 svn=" r${svn}" 271 fi 272 if [ -n "$hg" ] ; then 273 hg=" ${hg}" 274 fi 275fi 276 277include_metadata=true 278while getopts rR opt; do 279 case "$opt" in 280 r) 281 include_metadata= 282 ;; 283 R) 284 if [ -z "${modified}" ]; then 285 include_metadata= 286 fi 287 esac 288done 289shift $((OPTIND - 1)) 290 291if [ -z "${include_metadata}" ]; then 292 VERINFO="${VERSION} ${svn}${git}${hg}${p4version}" 293 VERSTR="${VERINFO}\\n" 294else 295 VERINFO="${VERSION} #${v}${svn}${git}${hg}${p4version}: ${t}" 296 VERSTR="${VERINFO}\\n ${u}@${h}:${d}\\n" 297fi 298 299cat << EOF > vers.c 300$COPYRIGHT 301#define SCCSSTR "@(#)${VERINFO}" 302#define VERSTR "${VERSTR}" 303#define RELSTR "${RELEASE}" 304 305char sccs[sizeof(SCCSSTR) > 128 ? sizeof(SCCSSTR) : 128] = SCCSSTR; 306char version[sizeof(VERSTR) > 256 ? sizeof(VERSTR) : 256] = VERSTR; 307char compiler_version[] = "${compiler_v}"; 308char ostype[] = "${TYPE}"; 309char osrelease[sizeof(RELSTR) > 32 ? sizeof(RELSTR) : 32] = RELSTR; 310int osreldate = ${RELDATE}; 311char kern_ident[] = "${i}"; 312EOF 313 314echo $((v + 1)) > version 315