Create a separate script to generate osreldate.h rather than sourcing

newvers.sh into a temporary subshell with inline make rules.

Using a separate script fixes a variety of problems, including establishing
the correct dependencies in the makefiles.  It also eliminates a problem
with the way newvers.sh uses `realpath $0`, because $0 expands differently
within a script sourced into a rule in a makefile depending on the version
of make and of /bin/sh being used.  The latter can cause build breakage in a
cross-build environment, and can also make it difficult to compile 10.0 on
older pre-10.0 systems.

PR:		160646 174422
Submitted by:	Garrett Cooper <yaneurabeya@gmail.com>
Approved by:	re (gjb)
MFC after:	2 weeks
This commit is contained in:
ian 2013-09-21 22:36:07 +00:00
parent b32fed86db
commit be20f14745
2 changed files with 59 additions and 13 deletions

View File

@ -104,19 +104,16 @@ SHARED?= copies
INCS+= osreldate.h
osreldate.h: ${.CURDIR}/../sys/conf/newvers.sh ${.CURDIR}/../sys/sys/param.h \
${.CURDIR}/Makefile
@${ECHO} creating osreldate.h from newvers.sh
@MAKE=${MAKE}; \
PARAMFILE=${.CURDIR}/../sys/sys/param.h; \
. ${.CURDIR}/../sys/conf/newvers.sh; \
echo "$$COPYRIGHT" > osreldate.h; \
echo "#ifdef _KERNEL" >> osreldate.h; \
echo "#error \"<osreldate.h> cannot be used in the kernel, use <sys/param.h>\"" >> osreldate.h; \
echo "#else" >> osreldate.h; \
echo "#undef __FreeBSD_version" >> osreldate.h; \
echo "#define __FreeBSD_version $$RELDATE" >> osreldate.h; \
echo "#endif" >> osreldate.h
NEWVERS_SH= ${.CURDIR}/../sys/conf/newvers.sh
PARAM_H= ${.CURDIR}/../sys/sys/param.h
MK_OSRELDATE_SH= ${.CURDIR}/mk-osreldate.sh
osreldate.h vers.c: ${NEWVERS_SH} ${PARAM_H} ${MK_OSRELDATE_SH}
env ECHO="${ECHO}" \
MAKE="${MAKE}" \
NEWVERS_SH=${NEWVERS_SH} \
PARAM_H=${PARAM_H} \
${MK_OSRELDATE_SH}
.for i in ${LHDRS}
INCSLINKS+= sys/$i ${INCLUDEDIR}/$i

49
include/mk-osreldate.sh Executable file
View File

@ -0,0 +1,49 @@
#!/bin/sh -
# Copyright (c) 2013 Garrett Cooper
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
set -e
CURDIR=$(pwd)
ECHO=${ECHO:=echo}
tmpfile=$(mktemp osreldate.XXXXXXXX)
trap "rm -f $tmpfile" EXIT
${ECHO} creating osreldate.h from newvers.sh
export PARAMFILE="${PARAM_H:=$CURDIR/../sys/sys/param.h}"
. "${NEWVERS_SH:=$CURDIR/../sys/conf/newvers.sh}"
cat > $tmpfile <<EOF
$COPYRIGHT
#ifdef _KERNEL
#error "<osreldate.h> cannot be used in the kernel, use <sys/param.h>"
#else
#undef __FreeBSD_version
#define __FreeBSD_version $RELDATE
#endif
EOF
mv $tmpfile osreldate.h