aboutsummaryrefslogtreecommitdiffstats
path: root/Mk/Uses/uniquefiles.mk
diff options
context:
space:
mode:
Diffstat (limited to 'Mk/Uses/uniquefiles.mk')
-rw-r--r--Mk/Uses/uniquefiles.mk199
1 files changed, 199 insertions, 0 deletions
diff --git a/Mk/Uses/uniquefiles.mk b/Mk/Uses/uniquefiles.mk
new file mode 100644
index 000000000000..0a9d038d4537
--- /dev/null
+++ b/Mk/Uses/uniquefiles.mk
@@ -0,0 +1,199 @@
+# -*- tab-width: 4; -*-
+# ex: ts=4
+#
+# $FreeBSD$
+#
+# Make files or directories 'unique', by adding a prefix or suffix.
+#
+# MAINTAINER: portmgr@FreeBSD.org
+#
+# Feature: uniquefiles
+# Usage: USES=uniquefiles or USES=uniquefiles:ARGS
+# Valid ARGS: dirs
+#
+# dirs: The port needs a prefix (and only a prefix) based on
+# UNIQUE_PREFIX for the standard directories
+# DOCSDIR, EXAMPLESDIR, DATADIR, WWWDIR, ETCDIR
+#
+# Variables for ports:
+#
+# UNIQUE_PREFIX - The prefix to be used for directories and files.
+# Default: ${PKGNAMEPREFIX}.
+# UNIQUE_PREFIX_FILES - A list of files that need to be prefixed.
+# Default: empty
+# UNIQUE_SUFFIX - The suffix to be used for files.
+# Default: ${PKGNAMESUFFIX}.
+# UNIQUE_SUFFIX_FILES - A list of files that need to be suffixed.
+# Default: empty
+#
+# Variables for the ports framework, but NOT individual ports:
+#
+# UNIQUE_DEFAULT_LINKS - When set to "yes", symlinks of the original
+# filenames are also created pointing to their
+# UNIQUE_* counterparts.
+# This is useful for supporting multiple logical
+# instances from a single physical port, but where
+# you want to mark only *one* of those instances to
+# provide original filenames.
+#
+# category/py-foo, installed as:
+#
+# py27-foo for Python 2.7 (DEFAULT_VERSION)
+# py33-foo for Python 3.3
+#
+# Results in:
+#
+# py27-foo
+# bin/foo-2.7 (UNIQUE_SUFFIX)
+# bin/foo -> bin/foo-2.7 (symlinked original filename)
+# py33-foo creates:
+# bin/foo-3.3 (UNIQUE_SUFFIX)
+#
+# Default: no
+#
+# UNIQUE_FIND_PREFIX_FILES - A shell command to be executed to find files for
+# the specific port. This has to return a
+# list of files to be iterated over.
+# Default: empty
+#
+# UNIQUE_FIND_SUFFIX_FILES - A shell command to be executed to find files for
+# the specific port. This has to return a
+# list of files to be iterated over.
+# Default: empty
+#
+# NOTE: multiple logical instances are not supported by pkg and the original
+# pkg_tools at the moment.
+#
+
+.if !defined(_INCLUDE_USES_UNIQUEFILES_MK)
+_INCLUDE_USES_UNIQUEFILES_MK= yes
+
+.if defined(NO_STAGE)
+BROKEN= uniquefiles USES can only be used for stage-safe ports
+.endif
+
+.if !defined(uniquefiles_ARGS)
+uniquefiles_ARGS= #empty
+.endif
+
+UNIQUE_PREFIX?= ${PKGNAMEPREFIX}
+UNIQUE_SUFFIX?= ${PKGNAMESUFFIX}
+UNIQUE_PREFIX_FILES?= # empty
+UNIQUE_SUFFIX_FILES?= # empty
+
+.if ${uniquefiles_ARGS:Mdirs}
+DOCSDIR= ${PREFIX}/share/doc/${UNIQUE_PREFIX}${PORTNAME}
+EXAMPLESDIR=${PREFIX}/share/examples/${UNIQUE_PREFIX}${PORTNAME}
+DATADIR= ${PREFIX}/share/${UNIQUE_PREFIX}${PORTNAME}
+WWWDIR= ${PREFIX}/www/${UNIQUE_PREFIX}${PORTNAME}
+ETCDIR= ${PREFIX}/etc/${UNIQUE_PREFIX}${PORTNAME}
+.endif
+
+UNIQUE_DEFAULT_LINKS?= no
+UNIQUE_FIND_PREFIX_FILES?= # empty
+UNIQUE_FIND_SUFFIX_FILES?= # empty
+
+.if defined(_POSTMKINCLUDED) && !defined(_INCLUDE_USES_UNIQUEFILES_POST_MK)
+_INCLUDE_USES_UNIQUEFILES_POST_MK= yes
+
+_UNIQUEPKGLIST= ${WRKDIR}/.PLIST.uniquefiles
+
+.if ${UNIQUE_DEFAULT_LINKS} == yes
+_DO_CONDITIONAL_SYMLINK= \
+ if [ ! -e ${STAGEDIR}${PREFIX}/$${fname} ]; then \
+ ${ECHO_MSG} " $${newf} --> @$${fname}"; \
+ ${LN} -s ${PREFIX}/$${newf} ${STAGEDIR}${PREFIX}/$${fname}; \
+ ${ECHO_CMD} LINKED:$${newf}:$${fname} >> ${_UNIQUEPKGLIST}; \
+ fi
+.else
+# We are not symlinking the renamed binary.
+_DO_CONDITIONAL_SYMLINK= ${DO_NADA}
+.endif
+
+move-uniquefiles:
+.if ${UNIQUE_PREFIX_FILES} || ${UNIQUE_FIND_PREFIX_FILES}
+ @${ECHO_MSG} "===> Moving prefixed files around";
+.endif
+.for entry in ${UNIQUE_PREFIX_FILES}
+ @fname=${entry}; \
+ if [ -e ${STAGEDIR}${PREFIX}/$${fname} ]; then \
+ newf=$${fname%/*}/${UNIQUE_PREFIX}$${fname##*/} ; \
+ ${ECHO_MSG} " $${fname} --> $${newf}" ; \
+ ${MV} ${STAGEDIR}${PREFIX}/$${fname} ${STAGEDIR}${PREFIX}/$${newf}; \
+ ${ECHO_CMD} MOVED:$${fname}:$${newf} >> ${_UNIQUEPKGLIST}; \
+ ${_DO_CONDITIONAL_SYMLINK}; \
+ else \
+ ${ECHO_MSG} "Makefile error: UNIQUE (prefix): $${fname} not found"; \
+ ${FALSE}; \
+ fi;
+.endfor
+.if ${UNIQUE_FIND_PREFIX_FILES}
+ @for fname in `${UNIQUE_FIND_PREFIX_FILES}`; do \
+ if [ -e ${STAGEDIR}${PREFIX}/$${fname} ]; then \
+ newf=$${fname%/*}/${UNIQUE_PREFIX}$${fname##*/} ; \
+ ${ECHO_MSG} " $${fname} --> $${newf}" ; \
+ ${MV} ${STAGEDIR}${PREFIX}/$${fname} ${STAGEDIR}${PREFIX}/$${newf}; \
+ ${ECHO_CMD} MOVED:$${fname}:$${newf} >> ${_UNIQUEPKGLIST}; \
+ ${_DO_CONDITIONAL_SYMLINK}; \
+ else \
+ ${ECHO_MSG} "Makefile error: UNIQUE (prefix): $${fname} not found"; \
+ ${FALSE}; \
+ fi; \
+ done;
+.endif
+
+.if ${UNIQUE_SUFFIX_FILES} || ${UNIQUE_FIND_SUFFIX_FILES}
+ @${ECHO_MSG} "===> Moving suffixed files around";
+.endif
+.for entry in ${UNIQUE_SUFFIX_FILES}
+ @fname=${entry}; \
+ if [ -e ${STAGEDIR}${PREFIX}/$${fname} ]; then \
+ newf=$${fname%/*}/$${fname##*/}${UNIQUE_SUFFIX}; \
+ ${ECHO_MSG} " $${fname} --> $${newf}"; \
+ ${MV} ${STAGEDIR}${PREFIX}/$${fname} ${STAGEDIR}${PREFIX}/$${newf}; \
+ ${ECHO_CMD} MOVED:$${fname}:$${newf} >> ${_UNIQUEPKGLIST}; \
+ ${_DO_CONDITIONAL_SYMLINK}; \
+ else \
+ ${ECHO_MSG} "Makefile error: UNIQUE (suffix): $${fname} not found"; \
+ ${FALSE}; \
+ fi;
+.endfor
+.if ${UNIQUE_FIND_SUFFIX_FILES}
+ @for fname in `${UNIQUE_FIND_SUFFIX_FILES}`; do \
+ if [ -e ${STAGEDIR}${PREFIX}/$${fname} ]; then \
+ newf=$${fname%/*}/$${fname##*/}${UNIQUE_SUFFIX}; \
+ ${ECHO_MSG} " $${fname} --> $${newf}"; \
+ ${MV} ${STAGEDIR}${PREFIX}/$${fname} ${STAGEDIR}${PREFIX}/$${newf}; \
+ ${ECHO_CMD} MOVED:$${fname}:$${newf} >> ${_UNIQUEPKGLIST}; \
+ ${_DO_CONDITIONAL_SYMLINK}; \
+ else \
+ ${ECHO_MSG} "Makefile error: UNIQUE (suffix): $${fname} not found"; \
+ ${FALSE}; \
+ fi; \
+ done;
+.endif
+
+# Using .if exists(${_UNIQUEPKGPLIST} below instead of the sh test
+# does not work in poudriere. It works fine on the CLI, though...
+move-uniquefiles-plist:
+ @if [ -e ${_UNIQUEPKGLIST} ]; then \
+ orgIFS=$$IFS; IFS=":"; while read command entry newentry; do \
+ IFS=$$orgIFS; \
+ case $${command} in \
+ MOVED) \
+ ${REINPLACE_CMD} -e "s|^$${entry}$$|$${newentry}|" ${TMPPLIST}; \
+ ;; \
+ LINKED) \
+ ${AWK} '$$0 ~ pe { print; print ne ;next }1' \
+ pe="$${entry}" ne="$${newentry}" \
+ ${TMPPLIST} > ${TMPPLIST}.uniquefilestmp; \
+ ${MV} ${TMPPLIST}.uniquefilestmp ${TMPPLIST}; \
+ ;; \
+ *) ;; \
+ esac; \
+ IFS=":"; \
+ done < ${_UNIQUEPKGLIST}; \
+ fi
+
+.endif # defined(_POSTMKINCLUDED)
+.endif # _INCLUDE_USES_UNIQUEFILES_MK