Date: Sun, 14 Dec 2008 20:12:49 GMT From: Sam Leffler <sam@FreeBSD.org> To: freebsd-gnats-submit@FreeBSD.org Subject: misc/129639: mergemaster does not use the right mk files Message-ID: <200812142012.mBEKCnxD022398@www.freebsd.org> Resent-Message-ID: <200812142020.mBEKKBb3044205@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 129639 >Category: misc >Synopsis: mergemaster does not use the right mk files >Confidential: no >Severity: serious >Priority: high >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Sun Dec 14 20:20:11 UTC 2008 >Closed-Date: >Last-Modified: >Originator: Sam Leffler >Release: HEAD >Organization: >Environment: >Description: mergemaster (implicitly) uses /usr/share/mk for all make operations. This fails when the source tree adds MK_* knobs not present on the host. The problem is make is invoked without a -m option to specify the location of .mk files. Note the only way to deal with this is to pollute the host build environment by doing something like cp $SRC/share/mk/bsd.own.mk /usr/share/mk which is unacceptable. >How-To-Repeat: Use a 7.0-RELEASE system to cross-build for a different architecture; e.g. setup an NFS root for arm: make TARGET_ARCH=arm TARGET_CPUTYPE=xscale TARGET_BIG_ENDIAN=true buildworld ROOT=/data/freebsd/roots/gateworks make TARGET_ARCH=arm TARGET_CPUTYPE=xscale TARGET_BIG_ENDIAN=true \ DESTDIR=$ROOT installworld mergemaster -m $SRC/etc -D $ROOT -i -A arm Note the make distrib-dirs done by mergemaster fails because MK_* knobs are undefined: *** Creating and populating directory structure in /var/tmp/temproot "Makefile", line 34: Malformed conditional (${MK_AMD} != "no") "Makefile", line 36: if-less endif "Makefile", line 38: Malformed conditional (${MK_APM} != "no") "Makefile", line 40: if-less endif ... >Fix: See attached patch for a proof of concept change. It changes the meaning of the -m option to the path to the top of the source tree (not include /etc) and then passes an explicit -m option to make for all work. This is unlikely to be acceptable as people use mergemaster for directories/paths other than "/usr/src". I suggest adding a different option with these semantics; e.g. -M. Patch attached with submission follows: Index: mergemaster.sh =================================================================== --- mergemaster.sh (revision 186013) +++ mergemaster.sh (working copy) @@ -412,8 +412,12 @@ # Assign the source directory # -SOURCEDIR=${SOURCEDIR:-/usr/src/etc} +SOURCEDIR=${SOURCEDIR:-/usr/src} +# +# Setup make to use system files from SOURCEDIR +MAKE="make -m ${SOURCEDIR}/share/mk" + # Check DESTDIR against the mergemaster mtree database to see what # files the user changed from the reference files. # @@ -548,20 +552,20 @@ case "${PRE_WORLD}" in '') - { cd ${SOURCEDIR} && + { cd ${SOURCEDIR}/etc && case "${DESTDIR}" in '') ;; *) - make DESTDIR=${DESTDIR} ${ARCHSTRING} distrib-dirs + ${MAKE} DESTDIR=${DESTDIR} ${ARCHSTRING} distrib-dirs ;; esac - make DESTDIR=${TEMPROOT} ${ARCHSTRING} distrib-dirs && - MAKEOBJDIRPREFIX=${TEMPROOT}/usr/obj make ${ARCHSTRING} obj && - MAKEOBJDIRPREFIX=${TEMPROOT}/usr/obj make ${ARCHSTRING} all && - MAKEOBJDIRPREFIX=${TEMPROOT}/usr/obj make ${ARCHSTRING} \ + ${MAKE} DESTDIR=${TEMPROOT} ${ARCHSTRING} distrib-dirs && + MAKEOBJDIRPREFIX=${TEMPROOT}/usr/obj ${MAKE} ${ARCHSTRING} obj && + MAKEOBJDIRPREFIX=${TEMPROOT}/usr/obj ${MAKE} ${ARCHSTRING} all && + MAKEOBJDIRPREFIX=${TEMPROOT}/usr/obj ${MAKE} ${ARCHSTRING} \ DESTDIR=${TEMPROOT} distribution;} || { echo ''; - echo " *** FATAL ERROR: Cannot 'cd' to ${SOURCEDIR} and install files to"; + echo " *** FATAL ERROR: Cannot 'cd' to ${SOURCEDIR}/etc and install files to"; echo " the temproot environment"; echo ''; exit 1;} @@ -569,8 +573,8 @@ *) # Only set up files that are crucial to {build|install}world { mkdir -p ${TEMPROOT}/etc && - cp -p ${SOURCEDIR}/master.passwd ${TEMPROOT}/etc && - cp -p ${SOURCEDIR}/group ${TEMPROOT}/etc;} || + cp -p ${SOURCEDIR}/etc/master.passwd ${TEMPROOT}/etc && + cp -p ${SOURCEDIR}/etc/group ${TEMPROOT}/etc;} || { echo ''; echo ' *** FATAL ERROR: Cannot copy files to the temproot environment'; echo ''; @@ -647,7 +651,7 @@ echo '' echo " *** Your umask is currently set to ${USER_UMASK}. By default, this script" echo " installs all files with the same user, group and modes that" - echo " they are created with by ${SOURCEDIR}/Makefile, compared to" + echo " they are created with by ${SOURCEDIR}/etc/Makefile, compared to" echo " a umask of 022. This umask allows world read permission when" echo " the file's default permissions have it." echo '' @@ -904,7 +908,7 @@ fi # Using -size +0 avoids uselessly checking the empty log files created -# by ${SOURCEDIR}/Makefile and the device entries in ./dev, but does +# by ${SOURCEDIR}/etc/Makefile and the device entries in ./dev, but does # check the scripts in ./dev, as we'd like (assuming no devfs of course). # for COMPFILE in `find . -type f -size +0`; do @@ -1206,7 +1210,7 @@ case "${PRE_WORLD}" in '') ;; *) - MAKE_CONF="${SOURCEDIR%etc}share/examples/etc/make.conf" + MAKE_CONF="${SOURCEDIR}/share/examples/etc/make.conf" (echo '' echo '*** Comparing make variables' >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200812142012.mBEKCnxD022398>