From owner-freebsd-ports@FreeBSD.ORG Thu Oct 31 01:52:13 2013 Return-Path: Delivered-To: freebsd-ports@freebsd.org Received: from mandree.no-ip.org (freefall.freebsd.org [IPv6:2001:1900:2254:206c::16:87]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id DD0016C7 for ; Thu, 31 Oct 2013 01:52:12 +0000 (UTC) (envelope-from mandree@FreeBSD.org) Received: from [IPv6:::1] (localhost6.localdomain6 [IPv6:::1]) by apollo.emma.line.org (Postfix) with ESMTP id D98FD23CF4D for ; Thu, 31 Oct 2013 02:52:10 +0100 (CET) Message-ID: <5271B7CA.3000806@FreeBSD.org> Date: Thu, 31 Oct 2013 02:52:10 +0100 From: Matthias Andree User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.0 MIME-Version: 1.0 To: freebsd-ports@freebsd.org Subject: RFT: bsd.stage.mk overhaul v2 References: <5271AF7B.40005@FreeBSD.org> In-Reply-To: <5271AF7B.40005@FreeBSD.org> X-Enigmail-Version: 1.5.2 Content-Type: multipart/mixed; boundary="------------090709020900050805090403" X-BeenThere: freebsd-ports@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Porting software to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 31 Oct 2013 01:52:13 -0000 This is a multi-part message in MIME format. --------------090709020900050805090403 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit Sorry for following up on myself this quickly, but testing with a really b0rked pkg-plist (news/leafnode), I found a few issues with mtree generation, and found it reasonable to make the pkg-plist parser a bit more conservative. v2 attached and uploaded to . Diffstat: Scripts/check-stagedir.sh | 113 ++++++++++++++++++++++++++++++++++++ Scripts/qa.sh | 5 - bsd.stage.mk | 103 ++++++-------------------------- 3 files changed, 137 insertions(+), 84 deletions(-) --------------090709020900050805090403 Content-Type: text/x-patch; name="stage-overhaul-v2.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="stage-overhaul-v2.patch" Index: Mk/Scripts/check-stagedir.sh =================================================================== --- Mk/Scripts/check-stagedir.sh (revision 0) +++ Mk/Scripts/check-stagedir.sh (working copy) @@ -0,0 +1,113 @@ +#!/bin/sh +# ports/Mk/Scripts/check-stagedir.sh - called from ports/Mk/bsd.stage.mk + +set -e +export LC_ALL=C + +# lists an mtree file's contents, prefixed to dir. +listmtree() { # mtreefile prefix + { + echo '#mtree' + sed 's/nochange$//;' $1 + } | tar -tf- | sed "s,^,$2/,;s,^$2/\.$,$2,;s,^$,/," +} + +# obtain operating mode from command line +makeplist=0 +case "$1" in + orphans) ;; + makeplist) makeplist=1 ;; + *) echo >&2 "Usage: $0 {orphans|makelist}" ; exit 1 ;; +esac + +# validate environment +envfault=0 +for i in STAGEDIR PREFIX LOCALBASE WRKDIR WRKSRC MTREE_FILE \ + TMPPLIST DATADIR DOCSDIR EXAMPLESDIR +do + if eval test -z "\$$i" ; then + echo >&2 "Environment variable $i undefined. Aborting." + envfault=1 + fi +done +if [ $envfault -ne 0 ] ; then + exit 1 +fi + +set -u + +#### EXPAND TMPPLIST TO ABSOLUTE PATHS, SPLITTING FILES AND DIRS TO +# Use file descriptors 1 and 3 so that the while loop can write +# files to the pipe and dirs to a separate file. +if [ $makeplist = 0 ] ; then + # check for orphans + cwd=${PREFIX} + while read line; do + case $line in + @dirrm*|'@unexec rmdir'*) + line="$(printf %s "$line" \ + | sed -Ee 's/\|\|.*//;s|[0-9]*[[:space:]]*>[&]?[[:space:]]*[^[:space:]]+||g' \ + -e "/^@unexec[[:space:]]+rmdir/s|([^%])%D([^%])|\1${PREFIX}\2|g" \ + -e '/^@unexec[[:space:]]+rmdir/s|"(.*)"[[:space:]]+|\1|g' \ + -e 's/@unexec[[:space:]]+rmdir[[:space:]]+//' \ + -e 's/@dirrm(try)?[[:space:]]+//' \ + -e 's/[[:space:]]+$//')" + case "$line" in + /*) echo >&3 "$line" ;; + *) echo >&3 "$cwd/$line" ;; + esac + ;; + # order matters here - we must check @cwd first because + # otherwise the @cwd* would also match it first, shadowing the + # @cwd) line. + @cwd|@cd) cwd=${PREFIX} ;; + @cwd*|@cd*) set -- $line ; cwd=$2 ;; + @*) ;; + /*) echo "$line" ;; + *) echo "$cwd/$line" ;; + esac + done < ${TMPPLIST} 3>${WRKDIR}/.plist-dirs-unsorted | sort >${WRKDIR}/.plist-files +else + # generate plist - pretend the plist had been empty + : >${WRKDIR}/.plist-dirs-unsorted + : >${WRKDIR}/.plist-files +fi + +### PRODUCE MTREE FILE +{ + listmtree /etc/mtree/BSD.root.dist "" + #listmtree /etc/mtree/BSD.usr.dist /usr + listmtree /etc/mtree/BSD.var.dist /var + + if [ -n "${MTREE_FILE}" ]; then + listmtree "${MTREE_FILE}" "${PREFIX}" + fi + + a=${PREFIX} + while :; do + a=${a%/*} + [ -z "${a}" ] && break + echo ${a} + done +} > ${WRKDIR}/.mtree + +### HANDLE FILES +find ${STAGEDIR} -type f -o -type l | sort | sed -e "s,${STAGEDIR},," >${WRKDIR}/.staged-files +comm -13 ${WRKDIR}/.plist-files ${WRKDIR}/.staged-files \ + | sed \ + -e "s,${DOCSDIR},%%PORTDOCS%%%%DOCSDIR%%,g" \ + -e "s,${EXAMPLESDIR},%%PORTEXAMPLES%%%%EXAMPLESDIR%%,g" \ + -e "s,${DATADIR},%%DATADIR%%,g" \ + -e "s,${PREFIX}/,,g" | grep -v "^share/licenses" || [ $? = 1 ] + +### HANDLE DIRS +cat ${WRKDIR}/.plist-dirs-unsorted ${WRKDIR}/.mtree | sort -u >${WRKDIR}/.traced-dirs +find ${STAGEDIR} -type d | sed -e "s,^${STAGEDIR},,;/^$/d" | sort >${WRKDIR}/.staged-dirs +comm -13 ${WRKDIR}/.traced-dirs ${WRKDIR}/.staged-dirs \ + | sort -r | sed \ + -e "s,\(.*\)${DOCSDIR},%%PORTDOCS%%\1%%DOCSDIR%%,g" \ + -e "s,\(.*\)${EXAMPLESDIR},%%PORTEXAMPLES%%\1%%EXAMPLESDIR%%,g" \ + -e "s,${DATADIR},%%DATADIR%%,g" \ + -e "s,${PREFIX}/,,g" \ + -e 's,^,@dirrmtry ,' \ + -e 's,@dirrmtry \(/.*\),@unexec rmdir >/dev/null 2>\&1 \1 || :,' | grep -v "^@dirrmtry share/licenses" || [ $? = 1 ] Property changes on: Mk/Scripts/check-stagedir.sh ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: Mk/Scripts/qa.sh =================================================================== --- Mk/Scripts/qa.sh (revision 332191) +++ Mk/Scripts/qa.sh (working copy) @@ -18,7 +18,7 @@ shebang() { rc=0 for f in `find ${STAGEDIR} -type f`; do - interp=$(sed -n -e '1s/^#![[:space:]]*\([^[:space:]]*\).*/\1/p' $f) + interp=$(sed -n -e '1s/^#![[:space:]]*\([^[:space:]]*\).*/\1/p;2q' $f) case "$interp" in "") ;; /usr/bin/env) ;; @@ -62,7 +62,8 @@ # For now do not raise an error, just warnings stripped() { - [ -x /usr/bin/file ] || return + [ -x /usr/bin/file ] || return # this is fatal + [ -n "${STRIP}" ] || return 0 for f in `find ${STAGEDIR} -type f`; do output=`/usr/bin/file ${f}` case "${output}" in Index: Mk/bsd.stage.mk =================================================================== --- Mk/bsd.stage.mk (revision 332191) +++ Mk/bsd.stage.mk (working copy) @@ -6,10 +6,22 @@ DESTDIRNAME?= DESTDIR MAKE_ARGS+= ${DESTDIRNAME}=${STAGEDIR} -QA_ENV+= STAGEDIR=${STAGEDIR} PREFIX=${PREFIX} \ +QA_ENV+= STAGEDIR=${STAGEDIR} \ + PREFIX=${PREFIX} \ LOCALBASE=${LOCALBASE} \ USESDESKTOPFILEUTILS=${USES:Mdesktop-file-utils} \ - USESSHAREDMIMEINFO=${USES:Mshared-mime-info} + USESSHAREDMIMEINFO=${USES:Mshared-mime-info} \ + "STRIP=${STRIP}" +CO_ENV+= STAGEDIR=${STAGEDIR} \ + PREFIX=${PREFIX} \ + LOCALBASE=${LOCALBASE} \ + WRKDIR=${WRKDIR} \ + WRKSRC=${WRKSRC} \ + MTREE_FILE=${MTREE_FILE} \ + TMPPLIST=${TMPPLIST} \ + DATADIR=${DATADIR} \ + DOCSDIR=${DOCSDIR} \ + EXAMPLESDIR=${EXAMPLESDIR} .if !target(stage-dir) stage-dir: @@ -28,8 +40,8 @@ # Fixes all dead symlinks left by the previous round .if !target(compress-man) compress-man: - @${ECHO_CMD} "====> Compressing man pages" ; \ - mdirs= ; \ + @${ECHO_MSG} "====> Compressing man pages (compress-man)" + @mdirs= ; \ for dir in ${MANDIRS:S/^/${STAGEDIR}/} ; do \ [ -d $$dir ] && mdirs="$$mdirs $$dir" ;\ done ; \ @@ -76,90 +88,17 @@ .if !target(makeplist) makeplist: stage - @if [ -n "${MTREE_FILE}" ]; then \ - { ${ECHO_CMD} "#mtree"; ${CAT} ${MTREE_FILE}; } | ${TAR} tf - | \ - awk '{ sub(/^\.$$/, "", $$1); \ - if ($$1 == "") print "${PREFIX}"; else print "${PREFIX}/"$$1; }' ; \ - fi > ${WRKDIR}/.mtree - @a=${PREFIX}; \ - while :; do \ - a=$${a%/*} ; \ - [ -z "$${a}" ] && break ; \ - ${ECHO_CMD} $${a} >> ${WRKDIR}/.mtree ; \ - done - @${FIND} ${STAGEDIR} -type f -o -type l | ${SORT} | ${SED} -e "s,${STAGEDIR},,g" \ - -e "s,${DOCSDIR},%%PORTDOCS%%%%DOCSDIR%%,g" \ - -e "s,${EXAMPLESDIR},%%PORTEXAMPLES%%%%EXAMPLESDIR%%,g" \ - -e "s,${DATADIR},%%DATADIR%%,g" \ - -e "s,${PREFIX}/,,g" | ${GREP} -v "^share/licenses" || ${TRUE} - @${FIND} ${STAGEDIR} -type d | ${SED} -e "s,${STAGEDIR},,g" \ - | while read line; do \ - ${GREP} -qw "^$${line}$$" ${WRKDIR}/.mtree || { \ - [ -n "$${line}" ] && ${ECHO_CMD} "@dirrmtry $${line}"; \ - }; \ - done | ${SORT} -r | ${SED} \ - -e "s,\(.*\)${DOCSDIR},%%PORTDOCS%%\1%%DOCSDIR%%,g" \ - -e "s,\(.*\)${EXAMPLESDIR},%%PORTEXAMPLES%%\1%%EXAMPLESDIR%%,g" \ - -e "s,${DATADIR},%%DATADIR%%,g" \ - -e "s,${PREFIX}/,,g" | ${GREP} -v "^@dirrmtry share/licenses" || ${TRUE} + @${SETENV} ${CO_ENV} ${SH} ${SCRIPTSDIR}/check-stagedir.sh makeplist .endif .if !target(check-orphans) check-orphans: stage - @while read line; do \ - cwd=${PREFIX} ; \ - case $$line in \ - @dirrm*) \ - set -- $$line ; \ - case $$2 in \ - /*) ${ECHO_CMD} "dir $$2" ;; \ - *) ${ECHO_CMD} "dir $$cwd/$$2" ;; \ - esac ; \ - ;; \ - @cwd) cwd=${PREFIX} ;; \ - @cwd*) set -- $$line ; \ - cwd=$$2 ;; \ - @*) ;; \ - /*) ${ECHO_CMD} $$line ;; \ - *) ${ECHO_CMD} $$cwd/$$line ;; \ - esac ; \ - done < ${TMPPLIST} > ${WRKDIR}/.expanded-plist - @if [ -n "${MTREE_FILE}" ]; then \ - { ${ECHO_CMD} "#mtree"; ${CAT} ${MTREE_FILE}; } | ${TAR} tf - | \ - awk '{ sub(/^\.$$/, "", $$1); \ - if ($$1 == "") print "${PREFIX}"; else print "${PREFIX}/"$$1; }' ; \ - fi > ${WRKDIR}/.mtree - @a=${PREFIX}; \ - while :; do \ - a=$${a%/*} ; \ - [ -z "$${a}" ] && break ; \ - ${ECHO_CMD} $${a} >> ${WRKDIR}/.mtree ; \ - done - @${FIND} ${STAGEDIR} -type f -o -type l | ${SORT} | ${SED} -e "s,${STAGEDIR},,g" \ - | while read line; do \ - ${GREP} -qw "^$${line}$$" ${WRKDIR}/.expanded-plist || { \ - [ -n "$${line}" ] && ${ECHO_CMD} "$${line}" ; \ - } ; \ - done | ${SED} \ - -e "s,${DOCSDIR},%%PORTDOCS%%%%DOCSDIR%%,g" \ - -e "s,${EXAMPLESDIR},%%PORTEXAMPLES%%%%EXAMPLESDIR%%,g" \ - -e "s,${DATADIR},%%DATADIR%%,g" \ - -e "s,${PREFIX}/,,g" | ${GREP} -v "^share/licenses" || ${TRUE} - @${FIND} ${STAGEDIR} -type d | ${SED} -e "s,${STAGEDIR},,g" \ - | while read line; do \ - ${GREP} -qw "^$${line}$$" ${WRKDIR}/.mtree || \ - ${GREP} -qw "dir\ $${line}$$" ${WRKDIR}/.expanded-plist || { \ - [ -n "$${line}" ] && ${ECHO_CMD} "@dirrmtry $${line}"; \ - } ; \ - done | ${SORT} -r | ${SED} \ - -e "s,\(.*\)${DOCSDIR},%%PORTDOCS%%\1%%DOCSDIR%%,g" \ - -e "s,\(.*\)${EXAMPLESDIR},%%PORTEXAMPLES%%\1%%EXAMPLESDIR%%,g" \ - -e "s,${DATADIR},%%DATADIR%%,g" \ - -e "s,${PREFIX}/,,g" | ${GREP} -v "^@dirrmtry share/licenses" || ${TRUE} + @${ECHO_MSG} "====> Items missing from pkg-plist (check-orphans)" + @${SETENV} ${CO_ENV} ${SH} ${SCRIPTSDIR}/check-stagedir.sh orphans .endif .if !target(stage-qa) stage-qa: - @${ECHO_CMD} "====> Running Q/A tests" ; \ - ${SETENV} ${QA_ENV} ${SH} ${SCRIPTSDIR}/qa.sh + @${ECHO_MSG} "====> Running Q/A tests (stage-qa)" + @${SETENV} ${QA_ENV} ${SH} ${SCRIPTSDIR}/qa.sh .endif --------------090709020900050805090403--