add macro to dial with directory trees

Stanislav Sedov ssedov at mbsd.msk.ru
Fri Jul 28 18:32:15 UTC 2006


>Submitter-Id:	current-users
>Originator:	Stanislav Sedov
>Organization:	MBSD labs, Inc.
>Confidential:	no 
>Synopsis:	add macro to dial with directory trees
>Severity:	non-critical
>Priority:	medium
>Category:	ports
>Class:		change-request
>Release:	FreeBSD 7.0-CURRENT i386
>Environment:
System: FreeBSD fonon.realnet 7.0-CURRENT FreeBSD 7.0-CURRENT #7: Sun Jun 18 20:51:36 MSD 2006 root at fonon.realnet:/work/src/fbsd-cur/src/sys/i386/compile/FONON i386


	
>Description:
        We have a lot of ports (thousands, actually), that need
        to copy entire directory trees to specific location,
        e.g. when installing examples for port one could issue:

        @${TAR} -cf - -C ${WRKSRC} copyfs cryptfs gzipfs uuencodefs tests | \
                       ${TAR} -xf - -C ${EXAMPLESDIR}
        @${FIND} ${EXAMPLESDIR} -type f -exec ${CHMOD} ${SHAREMODE} {} \;
        @${FIND} ${EXAMPLESDIR} -exec ${CHOWN} ${SHAREOWN} {} \;

        There are many other solutions (e.g. using PAX, FIND, CPIO combinations)
        , buth every require one important step - set up permissions for
        installed files, since this files are not processed by INSTALL_XXX
        program.

        A lot of ports usually forget to do this - I began to fix some
        of them - but it's tedios and giant work...

        The macros introduced allows to dial with such tree ierarchies
        in handy and efficient way. For previos example one can use:

        cd ${WRKSRC} && ${COPYTREE_SHARE} "copyfs cryptfs gzipfs uuencodefs test
        s" "${EXAMPLESDIR}"

        and that's all.

        I decided to use CPIO (though I don't like it)  since it can be used
        with find program, that allows to manipulate on file sets with a great
        power. Additional commands to FIND program might be passed by third
        argument to macro, e.g. to eclude 'Makefile" file we can use:
        cd ${WRKSRC} && ${COPYTREE_BIN} docs "${DOCSDIR}" "! -name Makefile"
	
        Thus, this macro allows to use the whole power of FIND program.

	Also, I've used "-l" swith in CPIO to speed-up copies in some
	cases. That's why I've redirected cpio output to /dev/null ;-)

        It would be nice to have you comments/suggestions here. Thanks!

>How-To-Repeat:
	
>Fix:

	

--- portmk.diff begins here ---
--- bsd.port.mk.orig	Fri Jul 28 22:09:42 2006
+++ bsd.port.mk	Fri Jul 28 22:13:32 2006
@@ -1970,6 +1970,18 @@
 REINPLACE_ARGS?=	-i.bak
 REINPLACE_CMD?=	${SED} ${REINPLACE_ARGS}
 
+# Macro for coping entire directory tree with correct permissions
+COPYTREE_BIN=	${SH} -c '(${FIND} -d $$0 $$2 | ${CPIO} -dumpl $$1 >/dev/null \
+					2>&1) && \
+					${CHOWN} -R ${BINOWN}:${BINGRP} $$1 && \
+					${FIND} $$1 -type d -exec chmod 755 {} \; && \
+					${FIND} $$1 -type f -exec chmod ${BINMODE} {} \;' --
+COPYTREE_SHARE=	${SH} -c '(${FIND} -d $$0 $$2 | ${CPIO} -dumpl $$1 >/dev/null \
+					2>&1) && \
+					${CHOWN} -R ${SHAREOWN}:${SHAREGRP} $$1 && \
+					${FIND} $$1 -type d -exec chmod 755 {} \; && \
+					${FIND} $$1 -type f -exec chmod ${SHAREMODE} {} \;' --
+
 # Names of cookies used to skip already completed stages
 EXTRACT_COOKIE?=	${WRKDIR}/.extract_done.${PORTNAME}.${PREFIX:S/\//_/g}
 CONFIGURE_COOKIE?=	${WRKDIR}/.configure_done.${PORTNAME}.${PREFIX:S/\//_/g}
--- portmk.diff ends here ---




More information about the freebsd-ports mailing list