freebsd-ports/Mk/Uses/uniquefiles.mk
Mathieu Arnold bf406b4d24 Enhance USES=uniquefiles to be more generic.
This allows to have more complex renaming schemes.  Until now, it could
only add a prefix or a suffix, but this was not working at all for man
pages, because it would give man/man1/pyfoo.1.gz-2.7 or
man/man1/pyfoo-1-2.7.gz.  With this change, a man page will be correctly
renamed to man/man1/pyfoo-2.7.1.gz.

Unfix ports that were already handling man pages.

PR:		220214
Submitted by:	Fukang Chen (previous patch)
Exp-run by:	antoine
Sponsored by:	Absolight
Differential Revision:	https://reviews.freebsd.org/D13444
2017-12-19 16:23:48 +00:00

221 lines
8 KiB
Makefile

# $FreeBSD$
#
# Make files or directories 'unique', by adding a prefix or suffix.
#
# 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
#
# UNIQUE_SUFFIX_TYPES - A list of TAGS to defined more complex unique
# suffix handling. It can, for example, handle
# man pages by doing:
#
# UNIQUE_SUFFIX_TYPES+= SUFFIX_MAN
# UNIQUE_SUFFIX_MAN_WITH_EXT= .[1-9ln]
# UNIQUE_SUFFIX_MAN_EXTRA_EXT= .gz
# UNIQUE_FIND_SUFFIX_MAN_FILES= ${EGREP} -he '^man/man[1-9ln]/.*$$' ${TMPPLIST} 2>/dev/null
#
# The make(1) target that renames the files
# runs before the man pages are compressed,
# this is what the EXTRA_EXT bit is for.
#
# NOTE: multiple logical instances are not supported by pkg and the original
# pkg_tools at the moment.
#
# MAINTAINER: portmgr@FreeBSD.org
.if !defined(_INCLUDE_USES_UNIQUEFILES_MK)
_INCLUDE_USES_UNIQUEFILES_MK= yes
UNIQUE_PREFIX?= ${PKGNAMEPREFIX}
UNIQUE_SUFFIX?= ${PKGNAMESUFFIX}
UNIQUE_PREFIX_FILES?= # empty
UNIQUE_SUFFIX_FILES?= # empty
UNIQUE_SUFFIX_TYPES+= SUFFIX
.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
_USES_POST+= uniquefiles
.endif # _INCLUDE_USES_UNIQUEFILES_MK
.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} -a ! -L ${STAGEDIR}${PREFIX}/$${fname} ]; then \
${ECHO_MSG} "Link: @$${fname} --> $${newf}"; \
${RLN} ${STAGEDIR}${PREFIX}/$${newf} ${STAGEDIR}${PREFIX}/$${fname}; \
${ECHO_CMD} LINKED:$${newf}%%EXTRA_EXT%%:$${fname}%%EXTRA_EXT%% >> ${_UNIQUEPKGLIST}; \
fi
.else
# We are not symlinking the renamed binary.
_DO_CONDITIONAL_SYMLINK= ${DO_NADA}
.endif
_USES_stage+= 775:move-uniquefiles
move-uniquefiles:
.if ${UNIQUE_PREFIX_FILES} || ${UNIQUE_FIND_PREFIX_FILES}
@${ECHO_MSG} "===> Creating unique files: Move files needing PREFIX";
.endif
.for entry in ${UNIQUE_PREFIX_FILES}
@fname=${entry}; \
if [ -e ${STAGEDIR}${PREFIX}/$${fname} -o -L ${STAGEDIR}${PREFIX}/$${fname} ]; then \
newf=$${fname%/*}/${UNIQUE_PREFIX}$${fname##*/} ; \
${ECHO_MSG} "Move: $${fname} --> $${newf}" ; \
${MV} ${STAGEDIR}${PREFIX}/$${fname} ${STAGEDIR}${PREFIX}/$${newf}; \
${ECHO_CMD} MOVED:$${fname}:$${newf} >> ${_UNIQUEPKGLIST}; \
${_DO_CONDITIONAL_SYMLINK:S/%%EXTRA_EXT%%//g}; \
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} -o -L ${STAGEDIR}${PREFIX}/$${fname} ]; then \
newf=$${fname%/*}/${UNIQUE_PREFIX}$${fname##*/} ; \
${ECHO_MSG} "Move: $${fname} --> $${newf}" ; \
${MV} ${STAGEDIR}${PREFIX}/$${fname} ${STAGEDIR}${PREFIX}/$${newf}; \
${ECHO_CMD} MOVED:$${fname}:$${newf} >> ${_UNIQUEPKGLIST}; \
${_DO_CONDITIONAL_SYMLINK:S/%%EXTRA_EXT%%//g}; \
else \
${ECHO_MSG} "Makefile error: UNIQUE (prefix): $${fname} not found"; \
${FALSE}; \
fi; \
done;
.endif
.for sufxtype in ${UNIQUE_SUFFIX_TYPES}
. if (defined(UNIQUE_${sufxtype}_FILES) && ${UNIQUE_${sufxtype}_FILES}) || \
(defined(UNIQUE_FIND_${sufxtype}_FILES) && ${UNIQUE_FIND_${sufxtype}_FILES})
. if defined(UNIQUE_${sufxtype}_WITH_EXT) && ${UNIQUE_${sufxtype}_WITH_EXT}
@${ECHO_MSG} "===> Creating unique files: Move ${sufxtype:S|SUFFIX_||} files needing SUFFIX";
. else
@${ECHO_MSG} "===> Creating unique files: Move files needing SUFFIX";
. endif
. endif
. for entry in ${UNIQUE_${sufxtype}_FILES}
@fname=${entry}; \
if [ -n "${UNIQUE_${sufxtype}_EXTRA_EXT}" ]; then \
fname=$${fname%${UNIQUE_${sufxtype}_EXTRA_EXT}}; \
fi; \
if [ -e ${STAGEDIR}${PREFIX}/$${fname} -o -L ${STAGEDIR}${PREFIX}/$${fname} ]; then \
ofname=$${fname##*/}; \
newf=$${fname%/*}/$${ofname%${UNIQUE_${sufxtype}_WITH_EXT}}${UNIQUE_SUFFIX}$${ofname#$${ofname%${UNIQUE_${sufxtype}_WITH_EXT}}}; \
${ECHO_MSG} "Move: $${fname} --> $${newf}"; \
${MV} ${STAGEDIR}${PREFIX}/$${fname} ${STAGEDIR}${PREFIX}/$${newf}; \
${ECHO_CMD} MOVED:$${fname}${UNIQUE_${sufxtype}_EXTRA_EXT}:$${newf}${UNIQUE_${sufxtype}_EXTRA_EXT} >> ${_UNIQUEPKGLIST}; \
${_DO_CONDITIONAL_SYMLINK:S/%%EXTRA_EXT%%/${UNIQUE_${sufxtype}_EXTRA_EXT}/g}; \
else \
${ECHO_MSG} "Makefile error: UNIQUE (suffix): $${fname} not found"; \
${FALSE}; \
fi;
. endfor
. if defined(UNIQUE_FIND_${sufxtype}_FILES) && ${UNIQUE_FIND_${sufxtype}_FILES}
@for fname in `${UNIQUE_FIND_${sufxtype}_FILES}`; do \
if [ -n "${UNIQUE_${sufxtype}_EXTRA_EXT}" ]; then \
fname=$${fname%${UNIQUE_${sufxtype}_EXTRA_EXT}}; \
fi; \
if [ -e ${STAGEDIR}${PREFIX}/$${fname} -o -L ${STAGEDIR}${PREFIX}/$${fname} ]; then \
ofname=$${fname##*/}; \
newf=$${fname%/*}/$${ofname%${UNIQUE_${sufxtype}_WITH_EXT}}${UNIQUE_SUFFIX}$${ofname#$${ofname%${UNIQUE_${sufxtype}_WITH_EXT}}}; \
${ECHO_MSG} "Move: $${fname} --> $${newf}"; \
${MV} ${STAGEDIR}${PREFIX}/$${fname} ${STAGEDIR}${PREFIX}/$${newf}; \
${ECHO_CMD} MOVED:$${fname}${UNIQUE_${sufxtype}_EXTRA_EXT}:$${newf}${UNIQUE_${sufxtype}_EXTRA_EXT} >> ${_UNIQUEPKGLIST}; \
${_DO_CONDITIONAL_SYMLINK:S/%%EXTRA_EXT%%/${UNIQUE_${sufxtype}_EXTRA_EXT}/g}; \
else \
${ECHO_MSG} "Makefile error: UNIQUE (suffix): $${fname} not found"; \
${FALSE}; \
fi; \
done;
. endif
.endfor
# Using .if exists(${_UNIQUEPKGPLIST} below instead of the sh test
# does not work in poudriere. It works fine on the CLI, though...
_USES_stage+= 950:move-uniquefiles-plist
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)