Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/pkgsrc/mk/bsd.pkg.mk,v rcsdiff: /ftp/cvs/cvsroot/pkgsrc/mk/bsd.pkg.mk,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.1540.2.7 retrieving revision 1.1540.2.14 diff -u -p -r1.1540.2.7 -r1.1540.2.14 --- pkgsrc/mk/bsd.pkg.mk 2004/12/03 19:15:00 1.1540.2.7 +++ pkgsrc/mk/bsd.pkg.mk 2005/01/24 18:50:16 1.1540.2.14 @@ -1,4 +1,4 @@ -# $NetBSD: bsd.pkg.mk,v 1.1540.2.7 2004/12/03 19:15:00 tv Exp $ +# $NetBSD: bsd.pkg.mk,v 1.1540.2.14 2005/01/24 18:50:16 tv Exp $ # # This file is in the public domain. # @@ -7,6 +7,8 @@ # Please see the pkgsrc/doc/guide manual for details on the # variables used in this make file template. # +# XXX tv: rev 1.1554 is not merged yet (phase "error handlers") +# ############################################################################ # Include any preferences, if not already included, and common definitions @@ -33,6 +35,8 @@ MAKEFLAGS+= _PATH_ORIG=${_PATH_ORIG:Q} # Transform package Makefile variables and set defaults ############################################################################ +CHECK_FILES?= NO # run check-files after install +CHECK_FILES_STRICT?= NO # make check-files very strict on errors CHECK_SHLIBS?= YES # run check-shlibs after install CLEANDEPENDS?= NO DEINSTALLDEPENDS?= NO # add -R to pkg_delete @@ -350,8 +354,6 @@ ${var}+= ${${var}.*} . endfor CPPFLAGS+= ${CPP_PRECOMP_FLAGS} -DEPENDS+= ${USE_USERADD:D${_USER_DEPENDS}} -DEPENDS+= ${USE_GROUPADD:D${_USER_DEPENDS}} .if !empty(USE_BUILDLINK3:M[nN][oO]) LDFLAGS+= ${COMPILER_RPATH_FLAG}${LOCALBASE}/lib @@ -364,6 +366,8 @@ ALL_ENV+= CPPFLAGS=${CPPFLAGS:Q} ALL_ENV+= CXX=${CXX:Q} ALL_ENV+= CXXFLAGS=${CXXFLAGS:Q} ALL_ENV+= COMPILER_RPATH_FLAG=${COMPILER_RPATH_FLAG:Q} +ALL_ENV+= F77=${F77:Q} +ALL_ENV+= FC=${FC:Q} ALL_ENV+= FFLAGS=${FFLAGS:Q} ALL_ENV+= LDFLAGS=${LDFLAGS:Q} ALL_ENV+= LINKER_RPATH_FLAG=${LINKER_RPATH_FLAG:Q} @@ -526,6 +530,9 @@ SCRIPTS_ENV+= ${_INSTALL_MACROS} . if defined(USE_GNU_TOOLS) && !empty(USE_GNU_TOOLS:Mmake) MAKE_PROGRAM= ${GMAKE} . elif defined(USE_IMAKE) +. if ${_IMAKE_MAKE} == ${GMAKE} +USE_GNU_TOOLS+= make +. endif MAKE_PROGRAM= ${_IMAKE_MAKE} . endif MAKE_PROGRAM?= ${MAKE} @@ -1047,12 +1054,12 @@ PATCH_DIST_CAT.${i:S/=/--/}?= { patchfil . if !empty(PKGSRC_SHOW_PATCH_ERRORMSG:M[yY][eE][sS]) PKGSRC_PATCH_FAIL= \ if [ -n "${PKG_OPTIONS}" ] || [ -n "${_LOCALPATCHFILES}" ]; then \ - ${ECHO} "=========================================================================="; \ + ${ECHO} "=========================================================================="; \ ${ECHO}; \ - ${ECHO} "Some of the selected build options and/or local patches may be incompatible."; \ + ${ECHO} "Some of the selected build options and/or local patches may be incompatible."; \ ${ECHO} "Please try building with fewer options or patches."; \ ${ECHO}; \ - ${ECHO} "=========================================================================="; \ + ${ECHO} "=========================================================================="; \ fi; exit 1 . endif PKGSRC_PATCH_FAIL?= exit 1 @@ -1094,8 +1101,6 @@ _REAL_TARGETS.wrapper+= wrapper-message CONFIGURE_ENV+= ${ALL_ENV} CONFIGURE_ENV+= ac_given_INSTALL="`${TYPE} ${INSTALL} | ${AWK} '{ print $$NF }'` -c -o ${BINOWN} -g ${BINGRP}" CONFIGURE_ENV+= AWK=${AWK:Q} -CONFIGURE_ENV+= F77=${FC:Q} -CONFIGURE_ENV+= FC=${FC:Q} CONFIGURE_ENV+= INSTALL="`${TYPE} ${INSTALL} | ${AWK} '{ print $$NF }'` -c -o ${BINOWN} -g ${BINGRP}" CONFIGURE_ENV+= MAKE=${MAKE_PROGRAM:T:Q} CONFIGURE_ENV+= M4=${M4:Q} @@ -1136,6 +1141,7 @@ CONFIG_GUESS_OVERRIDE?= \ config.guess */config.guess */*/config.guess CONFIG_SUB_OVERRIDE?= \ config.sub */config.sub */*/config.sub +CONFIG_RPATH_OVERRIDE?= # set by platform file as needed # # By default, override config.status for GNU configure packages. We # never want it to execute after the configure phase has ended as it @@ -1278,6 +1284,20 @@ init-install: ${ECHO_MSG} "If this is not desired, set it to an appropriate value (${DEF_UMASK})"; \ ${ECHO_MSG} "and install this package again by \`\`${MAKE} deinstall reinstall''."; \ fi +. if defined(PKG_DEVELOPER) && (${CHECK_FILES} == "YES") + ${_PKG_SILENT}${_PKG_DEBUG}${ECHO_MSG} "${_PKGSRC_IN}> Generating pre-install file lists" + ${_PKG_SILENT}${_PKG_DEBUG}${FIND} ${PREFIX} -type f -or -type l \ + 2>/dev/null ${CHECK_FILES_SKIP_CMD} >${WRKDIR}/.prefix.pre \ + || ${TRUE} +. if ${CHECK_FILES_STRICT} == "YES" + ${_PKG_SILENT}${_PKG_DEBUG}${FIND} ${PKG_SYSCONFDIR} \ + 2>/dev/null ${CHECK_FILES_SKIP_CMD} >${WRKDIR}/.sysconfdir.pre \ + || ${TRUE} + ${_PKG_SILENT}${_PKG_DEBUG}${FIND} ${VARBASE} \ + 2>/dev/null ${CHECK_FILES_SKIP_CMD} >${WRKDIR}/.varbase.pre \ + || ${TRUE} +. endif +. endif . if defined(INSTALLATION_DIRS) && !empty(INSTALLATION_DIRS) ${_PKG_SILENT}${_PKG_DEBUG}${ECHO_MSG} "${_PKGSRC_IN}> Creating installation directories" ${_PKG_SILENT}${_PKG_DEBUG} \ @@ -1356,6 +1376,26 @@ _REAL_TARGETS.su-install+= plist .PHONY: plist plist: ${PLIST} +#===> "post-install-check-files" + +.if defined(PKG_DEVELOPER) && (${CHECK_FILES} == "YES") +_REAL_TARGETS.su-install+= post-install-check-files +.PHONY: post-install-check-files +post-install-check-files: + ${_PKG_SILENT}${_PKG_DEBUG}${ECHO_MSG} "${_PKGSRC_IN}> Generating post-install file lists" + ${_PKG_SILENT}${_PKG_DEBUG}${FIND} ${PREFIX} -type f -or -type l \ + 2>/dev/null ${CHECK_FILES_SKIP_CMD} >${WRKDIR}/.prefix.post \ + || ${TRUE} +. if ${CHECK_FILES_STRICT} == "YES" + ${_PKG_SILENT}${_PKG_DEBUG}${FIND} ${PKG_SYSCONFDIR} \ + 2>/dev/null ${CHECK_FILES_SKIP_CMD} >${WRKDIR}/.sysconfdir.post\ + || ${TRUE} + ${_PKG_SILENT}${_PKG_DEBUG}${FIND} ${VARBASE} \ + 2>/dev/null ${CHECK_FILES_SKIP_CMD} >${WRKDIR}/.varbase.post \ + || ${TRUE} +. endif +.endif + #===> "post-install-script" _REAL_TARGETS.su-install+= post-install-script @@ -1396,7 +1436,7 @@ post-install-man: for manpage in $$newmanpages; do \ manpage=`${ECHO} $$manpage | ${SED} -e 's|\.gz$$||'`; \ if [ -h ${PREFIX}/$$manpage ]; then \ - set - `${LS} -l ${PREFIX}/$$manpage`; \ + set - `${LS} -l ${PREFIX}/$$manpage`; \ shift `expr $$# - 1`; \ ${RM} -f ${PREFIX}/$$manpage.gz; \ ${LN} -s $${1}.gz ${PREFIX}/$$manpage.gz; \ @@ -1455,6 +1495,12 @@ _REAL_TARGETS.su-install+= fake-pkg _REAL_TARGETS.su-install+= check-shlibs . endif +#===> "check-files" + +. if defined(PKG_DEVELOPER) && (${CHECK_FILES} == "YES") +_REAL_TARGETS.su-install+= check-files +. endif + .endif # !empty(PKG_PHASES:Minstall) ############################################################################ @@ -1570,9 +1616,8 @@ tags: .OPTIONAL update ${targ}: . if !defined(SKIP_SILENT) - @for str in ${PKG_FAIL_REASON} ${PKG_SKIP_REASON} ; \ - do \ - ${ECHO} "${_PKGSRC_IN}> $$str" ; \ + @for str in ${PKG_FAIL_REASON} ${PKG_SKIP_REASON}; do \ + ${ECHO} "${_PKGSRC_IN}> $$str"; \ done . endif . if defined(PKG_FAIL_REASON) @@ -1605,7 +1650,7 @@ undo-replace: real-undo-replace . for targ in ${_PKG_PHASES_WRKDIR} ${${targ}_COOKIE}: real-${targ} - ${_PKG_SILENT}${_PKG_DEBUG}${ECHO} ${PKGNAME} >${${targ}_COOKIE} + ${_PKG_SILENT}${_PKG_DEBUG}${RM} -f $@ && ${ECHO} ${PKGNAME} >$@ . endfor # mark a stage as complete if its cookie (and all parent cookies) exist @@ -1854,11 +1899,11 @@ _RESUME_TRANSFER= \ tsize=`${AWK} '/^Size/ && $$2 == '"\"($$file)\""' { print $$4 }' ${DISTINFO_FILE}` || ${TRUE}; \ if [ ! -f "${DISTDIR}/${DIST_SUBDIR}/$$bfile.temp" ]; then \ ${CP} ${DISTDIR}/${DIST_SUBDIR}/$$bfile ${DISTDIR}/${DIST_SUBDIR}/$$bfile.temp; \ - fi; \ + fi; \ dsize=`${WC} -c < ${DISTDIR}/${DIST_SUBDIR}/$$bfile.temp`; \ - if [ "$$dsize" -eq "$$tsize" -a -f "${DISTDIR}/${DIST_SUBDIR}/$$bfile.temp" ]; then \ + if [ "$$dsize" -eq "$$tsize" -a -f "${DISTDIR}/${DIST_SUBDIR}/$$bfile.temp" ]; then \ ${MV} ${DISTDIR}/${DIST_SUBDIR}/$$bfile.temp ${DISTDIR}/${DIST_SUBDIR}/$$bfile; \ - fi; \ + fi; \ case "$$tsize" in \ "") ${ECHO_MSG} "No size in distinfo file (${DISTINFO_FILE})"; \ break ;; \ @@ -1867,33 +1912,33 @@ _RESUME_TRANSFER= \ ${ECHO_MSG} "===> Resume is not supported by ftp(1) using http/ftp proxies."; \ break; \ else \ - if [ "$$dsize" -lt "$$tsize" ]; then \ + if [ "$$dsize" -lt "$$tsize" ]; then \ if [ "${FETCH_CMD:T}" != "ftp" -a -z "${FETCH_RESUME_ARGS}" ]; then \ ${ECHO_MSG} "=> Resume transfers are not supported, FETCH_RESUME_ARGS is empty."; \ break; \ else \ - for res_site in $$sites; do \ - if [ -z "${FETCH_OUTPUT_ARGS}" ]; then \ - ${ECHO_MSG} "=> FETCH_OUTPUT_ARGS has to be defined."; \ + for res_site in $$sites; do \ + if [ -z "${FETCH_OUTPUT_ARGS}" ]; then \ + ${ECHO_MSG} "=> FETCH_OUTPUT_ARGS has to be defined."; \ break; \ fi; \ - ${ECHO_MSG} "=> $$bfile not completed, resuming:"; \ - ${ECHO_MSG} "=> Downloaded: $$dsize Total: $$tsize."; \ + ${ECHO_MSG} "=> $$bfile not completed, resuming:"; \ + ${ECHO_MSG} "=> Downloaded: $$dsize Total: $$tsize."; \ ${ECHO_MSG}; \ cd ${_DISTDIR}; \ - ${FETCH_CMD} ${FETCH_BEFORE_ARGS} ${FETCH_RESUME_ARGS} \ + ${FETCH_CMD} ${FETCH_BEFORE_ARGS} ${FETCH_RESUME_ARGS} \ ${FETCH_OUTPUT_ARGS} $${bfile}.temp $${res_site}$${bfile}; \ if [ $$? -eq 0 ]; then \ - ndsize=`${WC} -c < ${DISTDIR}/${DIST_SUBDIR}/$$bfile.temp`; \ - if [ "$$tsize" -eq "$$ndsize" ]; then \ - ${MV} ${DISTDIR}/${DIST_SUBDIR}/$$bfile.temp ${DISTDIR}/${DIST_SUBDIR}/$$bfile; \ + ndsize=`${WC} -c < ${DISTDIR}/${DIST_SUBDIR}/$$bfile.temp`; \ + if [ "$$tsize" -eq "$$ndsize" ]; then \ + ${MV} ${DISTDIR}/${DIST_SUBDIR}/$$bfile.temp ${DISTDIR}/${DIST_SUBDIR}/$$bfile; \ fi; \ break; \ fi; \ done; \ fi; \ elif [ "$$dsize" -gt "$$tsize" ]; then \ - ${ECHO_MSG} "==> Downloaded file larger than the recorded size."; \ + ${ECHO_MSG} "==> Downloaded file larger than the recorded size."; \ break; \ fi; \ fi @@ -1933,7 +1978,7 @@ _FETCH_FILE= \ fi; \ fi \ done; \ - if [ ! -f ${_DISTDIR}/$$bfile ]; then \ + if [ ! -f ${_DISTDIR}/$$bfile ]; then \ ${ECHO_MSG} "=> Couldn't fetch $$bfile - please try to retrieve this";\ ${ECHO_MSG} "=> file manually into ${_DISTDIR} and try again."; \ exit 1; \ @@ -1942,7 +1987,7 @@ _FETCH_FILE= \ _CHECK_DIST_PATH= \ if [ "X${DIST_PATH}" != "X" ]; then \ - for d in "" ${DIST_PATH:S/:/ /g}; do \ + for d in "" ${DIST_PATH:S/:/ /g}; do \ if [ "X$$d" = "X" -o "X$$d" = "X${DISTDIR}" ]; then continue; fi; \ if [ -f $$d/${DIST_SUBDIR}/$$bfile ]; then \ ${ECHO} "Using $$d/${DIST_SUBDIR}/$$bfile"; \ @@ -2405,11 +2450,11 @@ do-ltconfig-override: . endfor .endif -.if defined(CONFIG_GUESS_OVERRIDE) || defined(CONFIG_SUB_OVERRIDE) _CONFIGURE_PREREQ+= do-config-star-override .PHONY: do-config-star-override do-config-star-override: -. if defined(CONFIG_GUESS_OVERRIDE) && !empty(CONFIG_GUESS_OVERRIDE) +.if defined(GNU_CONFIGURE) +. if !empty(CONFIG_GUESS_OVERRIDE) . for _pattern_ in ${CONFIG_GUESS_OVERRIDE} ${_PKG_SILENT}${_PKG_DEBUG}cd ${WRKSRC}; \ for file in ${_pattern_}; do \ @@ -2421,7 +2466,7 @@ do-config-star-override: done . endfor . endif -. if defined(CONFIG_SUB_OVERRIDE) && !empty(CONFIG_SUB_OVERRIDE) +. if !empty(CONFIG_SUB_OVERRIDE) . for _pattern_ in ${CONFIG_SUB_OVERRIDE} ${_PKG_SILENT}${_PKG_DEBUG}cd ${WRKSRC}; \ for file in ${_pattern_}; do \ @@ -2433,6 +2478,18 @@ do-config-star-override: done . endfor . endif +. if !empty(CONFIG_RPATH_OVERRIDE) +. for _pattern_ in ${CONFIG_RPATH_OVERRIDE} + ${_PKG_SILENT}${_PKG_DEBUG}cd ${WRKSRC}; \ + for file in ${_pattern_}; do \ + if [ -f "$$file" ]; then \ + ${RM} -f $$file; \ + ${LN} -s ${PKGSRCDIR}/mk/gnu-config/config.rpath \ + $$file; \ + fi; \ + done +. endfor +. endif .endif PKGCONFIG_OVERRIDE_SED= \ @@ -2668,6 +2725,93 @@ check-shlibs: fi .endif # NO_PKG_REGISTER +# CHECK_FILES_SKIP is a list of file names that will be skipped when +# analyzing file lists in the check-files target. This is useful to +# avoid getting errors triggered by changes in directories not really +# handled by pkgsrc. +# +# We have to do this here, i.e., quite late in bsd.pkg.mk parsing, so +# that the variables used in them are defined. Otherwise we may get +# problems with the 'for' expressions. +.if defined(INFO_DIR) +CHECK_FILES_SKIP+= ${PREFIX}/${INFO_DIR}/dir +.endif +CHECK_FILES_SKIP+= ${PREFIX}/emul/linux/proc + +.for e c in ${CONF_FILES} ${SUPPORT_FILES} +CHECK_FILES_SKIP+= ${c}/.pkgsrc +.endfor +.for e c o g m in ${CONF_FILES_PERMS} ${SUPPORT_FILES_PERMS} +CHECK_FILES_SKIP+= ${c}/.pkgsrc +.endfor +.for d in ${MAKE_DIRS} ${OWN_DIRS} +CHECK_FILES_SKIP+= ${d} +.endfor +.for d o g m in ${MAKE_DIRS_PERMS} ${OWN_DIRS_PERMS} +CHECK_FILES_SKIP+= ${d} +.endfor +.undef e c d o g m + +CHECK_FILES_SKIP_CMD= +.for name in ${CHECK_FILES_SKIP} +CHECK_FILES_SKIP_CMD+= | ${GREP} -v ${name} +.endfor +.undef name + +# Check if the generated PLIST matches the list of really installed files. +# +.PHONY: check-files +check-files: +.if !defined(NO_PKG_REGISTER) + ${_PKG_SILENT}${_PKG_DEBUG} \ + errors=0; \ + diff -u ${WRKDIR}/.prefix.pre ${WRKDIR}/.prefix.post \ + >${WRKDIR}/.files.diff || ${TRUE}; \ + ${GREP} '^+/' ${WRKDIR}/.files.diff | ${SED} "s|^+||" | ${SORT} \ + >${WRKDIR}/.files.added; \ + ${GREP} '^-/' ${WRKDIR}/.files.diff | ${SED} "s|^-||" | ${SORT} \ + >${WRKDIR}/.files.deleted; \ + if ${TEST} `${WC} -l ${WRKDIR}/.files.deleted | \ + ${AWK} '{ print $$1; }'` -gt 0; \ + then \ + echo "*** The following files have been deleted from" \ + "${PREFIX}!"; \ + ${SED} "s|^| |" <${WRKDIR}/.files.deleted; \ + errors=1; \ + fi; \ + ${GREP} '^[A-Za-z]' ${PLIST} | ${SED} "s|^|${PREFIX}/|" | \ + ${SORT} >${WRKDIR}/.files.expected; \ + if ! ${CMP} -s ${WRKDIR}/.files.expected ${WRKDIR}/.files.added; then \ + echo "*** The PLIST does not match installed files!"; \ + echo " The following files were not expected in ${PREFIX}:";\ + diff -u ${WRKDIR}/.files.expected ${WRKDIR}/.files.added | \ + ${GREP} '^+[^+]' | ${SED} "s|^+| |"; \ + errors=1; \ + fi; \ + if [ ${CHECK_FILES_STRICT} = "YES" ] && \ + ! ${CMP} -s ${WRKDIR}/.sysconfdir.pre ${WRKDIR}/.sysconfdir.post; \ + then \ + echo "*** The package has modified ${PKG_SYSCONFDIR}" \ + "contents directly!"; \ + echo " The offending files/directories are:"; \ + diff -u ${WRKDIR}/.sysconfdir.pre ${WRKDIR}/.sysconfdir.post | \ + ${GREP} '^+[^+]' | ${SED} "s|^+| |"; \ + errors=1; \ + fi; \ + if [ ${CHECK_FILES_STRICT} = "YES" ] && \ + ! ${CMP} -s ${WRKDIR}/.varbase.pre ${WRKDIR}/.varbase.post; then \ + echo "*** The package has modified ${VARBASE} contents" \ + "directly!"; \ + echo " The offending files/directories are:"; \ + diff -u ${WRKDIR}/.varbase.pre ${WRKDIR}/.varbase.post |\ + ${GREP} '^+[^+]' | ${SED} "s|^+| |"; \ + errors=1; \ + fi; \ + ${RM} -f ${WRKDIR}/.files.added ${WRKDIR}/.files.deleted \ + ${WRKDIR}/.files.diff ${WRKDIR}/.files.expected; \ + ${TEST} $$errors -eq 0 +.endif + LOCKFILE= ${WRKDIR}/.lockfile .for targ in ${_PKG_PHASES_WRKDIR} .PHONY: acquire-${targ}-lock release-${targ}-lock @@ -2892,7 +3036,7 @@ ${DDIR}: ${DLIST} ${DLIST}: ${WRKDIR} ${_PKG_SILENT}${_PKG_DEBUG} \ { ${PKG_DELETE} -n "${PKGWILDCARD}" 2>&1 | \ - ${GREP} '^ ' | \ + ${GREP} '^ ' | \ ${AWK} '{ l[NR]=$$0 } END { for (i=NR;i>0;--i) print l[i] }' \ || ${TRUE}; } > ${DLIST} @@ -2902,7 +3046,7 @@ tarup: .if ${PKG_INSTALLATION_TYPE} == "overwrite" ${_PKG_SILENT}${_PKG_DEBUG} \ ${RM} -f ${PACKAGES}/All/${PKGNAME}${PKG_SUFX}; \ - ${SETENV} PKG_DBDIR=${_PKG_DBDIR} PKG_SUFX=${PKG_SUFX} \ + ${SETENV} PKG_DBDIR=${_PKG_DBDIR} PKG_SUFX=${PKG_SUFX} \ PKGREPOSITORY=${PACKAGES}/All \ ${LOCALBASE}/bin/pkg_tarup ${PKGNAME}; \ for CATEGORY in ${CATEGORIES}; do \ @@ -3077,7 +3221,7 @@ real-su-bin-install: bin-install: @${ECHO_MSG} "${_PKGSRC_IN}> Binary install for ${PKGNAME}" ${_PKG_SILENT}${_PKG_DEBUG} \ - realtarget="real-su-bin-install"; \ + realtarget="real-su-bin-install"; \ action="binary install"; \ ${_SU_TARGET}