Proposal: mechanism for local patches
N.J. Mann
njm at njm.me.uk
Sat Dec 13 04:05:25 PST 2008
In message <20081213105545.GA40560 at titania.njm.me.uk>,
N.J. Mann (njm at njm.me.uk) wrote:
> In message <20081212102516.GB7422 at hades.panopticon>,
> Dmitry Marakasov (amdmi3 at amdmi3.ru) wrote:
> > * N.J. Mann (njm at njm.me.uk) wrote:
> >
> > > > I suppose that check was done to help to detect patching failures, so it
> > > > may be removed.
> > >
> > > I've just been trying out your patch and I think from an organisational
> > > point of view it is very good. What I mean by this is that with the
> > > patch I am now able to keep my local patches completely separate from
> > > the official, FreeBSD patches. No more backing up the whole of
> > > /usr/ports just in case I have a private patch in there somewhere. Now
> > > I just need to backup /usr/ports.localpatchdir (which is what I called
> > > the directory LOCAPATCHDIR points to).
> >
> > Nice to hear that it's useful :)
>
> I found that it was not quite enough. For one port I am developing
> local patches for I found I either needed to modify the ports' FreeBSD
> Makefile or add a post-extract script. Since I no longer want to have
> locally modified files in /usr/ports I needed to have a local
> post-extract script. So, I have modified your change to support both
> patch files and script files.
I spoke too soon. :-(
I found I needed LOCALPATCHDIR and LOCALSCRIPTDIR in the environment
passed to the my script and so had to change my patch.
%%%%%
--- bsd.port.mk.orig
+++ bsd.port.mk
@@ -591,6 +591,13 @@
# Default: ${MASTERDIR}/files
# PKGDIR - A directory containing any package creation files.
# Default: ${MASTERDIR}
+# LOCALDIRPREFIX
+# - Root of local patches and scripts tree.
+# LOCALPATCHDIR - An optional directory for storing local patches.
+# Default: ${LOCALDIRPREFIX}/${CATEGORY}/${PORT}/files
+# LOCALSCRIPTDIR
+# - An optional directory for storing local scripts.
+# Default: ${LOCALDIRPREFIX}/${CATEGORY}/${PORT}/scripts
#
# Variables that serve as convenient "aliases" for your *-install targets.
# Use these like: "${INSTALL_PROGRAM} ${WRKSRC}/prog ${PREFIX}/bin".
@@ -1371,6 +1378,11 @@
SCRIPTDIR?= ${MASTERDIR}/scripts
PKGDIR?= ${MASTERDIR}
+.if defined(LOCALDIRPREFIX)
+LOCALPATCHDIR?= ${LOCALDIRPREFIX}/${.CURDIR:C/^.*\/([^\/]+\/[^\/]+)$/\\1/}/files
+LOCALSCRIPTDIR?= ${LOCALDIRPREFIX}/${.CURDIR:C/^.*\/([^\/]+\/[^\/]+)$/\\1/}/scripts
+.endif
+
.if defined(USE_IMAKE) && !defined(USE_X_PREFIX)
USE_X_PREFIX= yes
.endif
@@ -2887,6 +2899,14 @@
SCRIPTS_ENV+= BATCH=yes
.endif
+.if defined(LOCALPATCHDIR)
+SCRIPTS_ENV+= LOCALPATCHDIR=${LOCALPATCHDIR}
+.endif
+
+.if defined(LOCALSCRIPTDIR)
+SCRIPTS_ENV+= LOCALSCRIPTDIR=${LOCALSCRIPTDIR}
+.endif
+
.if ${PREFIX} == /usr
MANPREFIX?= /usr/share
.else
@@ -3604,6 +3624,35 @@
done; \
fi; \
fi
+.if defined(LOCALPATCHDIR)
+ @if [ -d ${LOCALPATCHDIR} ]; then \
+ if [ "`${ECHO_CMD} ${LOCALPATCHDIR}/patch-*`" != "${LOCALPATCHDIR}/patch-*" ]; then \
+ ${ECHO_MSG} "===> Applying local patches for ${PKGNAME}" ; \
+ PATCHES_APPLIED="" ; \
+ for i in ${LOCALPATCHDIR}/patch-*; do \
+ case $$i in \
+ *.orig|*.rej|*~|*,v) \
+ ${ECHO_MSG} "===> Ignoring patchfile $$i" ; \
+ ;; \
+ *) \
+ if [ ${PATCH_DEBUG_TMP} = yes ]; then \
+ ${ECHO_MSG} "===> Applying local patch $$i" ; \
+ fi; \
+ if ${PATCH} ${PATCH_ARGS} < $$i ; then \
+ PATCHES_APPLIED="$$PATCHES_APPLIED $$i" ; \
+ else \
+ ${ECHO_MSG} `${ECHO_CMD} "=> Local patch $$i failed to apply cleanly." | ${SED} "s|${LOCALPATCHDIR}/||"` ; \
+ if [ x"$$PATCHES_APPLIED" != x"" ]; then \
+ ${ECHO_MSG} `${ECHO_CMD} "=> Local patch(es) $$PATCHES_APPLIED applied cleanly." | ${SED} "s|${LOCALPATCHDIR}/||g"` ; \
+ fi; \
+ ${FALSE} ; \
+ fi; \
+ ;; \
+ esac; \
+ done; \
+ fi; \
+ fi
+.endif
.endif
.if !target(run-autotools)
@@ -4248,6 +4297,12 @@
cd ${.CURDIR} && ${SETENV} ${SCRIPTS_ENV} ${SH} \
${SCRIPTDIR}/${.TARGET:S/-script$//}; \
fi
+.if defined(LOCALSCRIPTDIR)
+ @if [ -f ${LOCALSCRIPTDIR}/${.TARGET:S/-script$//} ]; then \
+ cd ${.CURDIR} && ${SETENV} ${SCRIPTS_ENV} ${SH} \
+ ${LOCALSCRIPTDIR}/${.TARGET:S/-script$//}; \
+ fi
+.endif
.endif
.endfor
%%%%%
Cheers,
Nick.
--
More information about the freebsd-ports
mailing list