3 # Make files or directories 'unique', by adding a prefix or suffix.
6 # Usage: USES=uniquefiles or USES=uniquefiles:ARGS
9 # dirs: The port needs a prefix (and only a prefix) based on
10 # UNIQUE_PREFIX for the standard directories
11 # DOCSDIR, EXAMPLESDIR, DATADIR, WWWDIR, ETCDIR
13 # Variables for ports:
15 # UNIQUE_PREFIX - The prefix to be used for directories and files.
16 # Default: ${PKGNAMEPREFIX}.
17 # UNIQUE_PREFIX_FILES - A list of files that need to be prefixed.
19 # UNIQUE_SUFFIX - The suffix to be used for files.
20 # Default: ${PKGNAMESUFFIX}.
21 # UNIQUE_SUFFIX_FILES - A list of files that need to be suffixed.
24 # Variables for the ports framework, but NOT individual ports:
26 # UNIQUE_DEFAULT_LINKS - When set to "yes", symlinks of the original
27 # filenames are also created pointing to their
28 # UNIQUE_* counterparts.
29 # This is useful for supporting multiple logical
30 # instances from a single physical port, but where
31 # you want to mark only *one* of those instances to
32 # provide original filenames.
34 # category/py-foo, installed as:
36 # py27-foo for Python 2.7 (DEFAULT_VERSION)
37 # py33-foo for Python 3.3
42 # bin/foo-2.7 (UNIQUE_SUFFIX)
43 # bin/foo -> bin/foo-2.7 (symlinked original filename)
45 # bin/foo-3.3 (UNIQUE_SUFFIX)
49 # UNIQUE_FIND_PREFIX_FILES - A shell command to be executed to find files for
50 # the specific port. This has to return a
51 # list of files to be iterated over.
54 # UNIQUE_FIND_SUFFIX_FILES - A shell command to be executed to find files for
55 # the specific port. This has to return a
56 # list of files to be iterated over.
59 # NOTE: multiple logical instances are not supported by pkg and the original
60 # pkg_tools at the moment.
62 # MAINTAINER: portmgr@FreeBSD.org
64 .if !defined(_INCLUDE_USES_UNIQUEFILES_MK)
65 _INCLUDE_USES_UNIQUEFILES_MK= yes
67 UNIQUE_PREFIX?= ${PKGNAMEPREFIX}
68 UNIQUE_SUFFIX?= ${PKGNAMESUFFIX}
69 UNIQUE_PREFIX_FILES?= # empty
70 UNIQUE_SUFFIX_FILES?= # empty
72 .if ${uniquefiles_ARGS:Mdirs}
73 DOCSDIR= ${PREFIX}/share/doc/${UNIQUE_PREFIX}${PORTNAME}
74 EXAMPLESDIR= ${PREFIX}/share/examples/${UNIQUE_PREFIX}${PORTNAME}
75 DATADIR= ${PREFIX}/share/${UNIQUE_PREFIX}${PORTNAME}
76 WWWDIR= ${PREFIX}/www/${UNIQUE_PREFIX}${PORTNAME}
77 ETCDIR= ${PREFIX}/etc/${UNIQUE_PREFIX}${PORTNAME}
80 UNIQUE_DEFAULT_LINKS?= no
81 UNIQUE_FIND_PREFIX_FILES?= # empty
82 UNIQUE_FIND_SUFFIX_FILES?= # empty
84 _USES_POST+= uniquefiles
85 .endif # _INCLUDE_USES_UNIQUEFILES_MK
87 .if defined(_POSTMKINCLUDED) && !defined(_INCLUDE_USES_UNIQUEFILES_POST_MK)
88 _INCLUDE_USES_UNIQUEFILES_POST_MK= yes
90 _UNIQUEPKGLIST= ${WRKDIR}/.PLIST.uniquefiles
92 .if ${UNIQUE_DEFAULT_LINKS} == yes
93 _DO_CONDITIONAL_SYMLINK= \
94 if [ ! -e ${STAGEDIR}${PREFIX}/$${fname} -a ! -L ${STAGEDIR}${PREFIX}/$${fname} ]; then \
95 ${ECHO_MSG} "Link: @$${fname} --> $${newf}"; \
96 ${LN} -s ${PREFIX}/$${newf} ${STAGEDIR}${PREFIX}/$${fname}; \
97 ${ECHO_CMD} LINKED:$${newf}:$${fname} >> ${_UNIQUEPKGLIST}; \
100 # We are not symlinking the renamed binary.
101 _DO_CONDITIONAL_SYMLINK= ${DO_NADA}
104 _USES_stage+= 775:move-uniquefiles
106 .if ${UNIQUE_PREFIX_FILES} || ${UNIQUE_FIND_PREFIX_FILES}
107 @${ECHO_MSG} "===> Creating unique files: Move files needing PREFIX";
109 .for entry in ${UNIQUE_PREFIX_FILES}
111 if [ -e ${STAGEDIR}${PREFIX}/$${fname} -o -L ${STAGEDIR}${PREFIX}/$${fname} ]; then \
112 newf=$${fname%/*}/${UNIQUE_PREFIX}$${fname##*/} ; \
113 ${ECHO_MSG} "Move: $${fname} --> $${newf}" ; \
114 ${MV} ${STAGEDIR}${PREFIX}/$${fname} ${STAGEDIR}${PREFIX}/$${newf}; \
115 ${ECHO_CMD} MOVED:$${fname}:$${newf} >> ${_UNIQUEPKGLIST}; \
116 ${_DO_CONDITIONAL_SYMLINK}; \
118 ${ECHO_MSG} "Makefile error: UNIQUE (prefix): $${fname} not found"; \
122 .if ${UNIQUE_FIND_PREFIX_FILES}
123 @for fname in `${UNIQUE_FIND_PREFIX_FILES}`; do \
124 if [ -e ${STAGEDIR}${PREFIX}/$${fname} -o -L ${STAGEDIR}${PREFIX}/$${fname} ]; then \
125 newf=$${fname%/*}/${UNIQUE_PREFIX}$${fname##*/} ; \
126 ${ECHO_MSG} "Move: $${fname} --> $${newf}" ; \
127 ${MV} ${STAGEDIR}${PREFIX}/$${fname} ${STAGEDIR}${PREFIX}/$${newf}; \
128 ${ECHO_CMD} MOVED:$${fname}:$${newf} >> ${_UNIQUEPKGLIST}; \
129 ${_DO_CONDITIONAL_SYMLINK}; \
131 ${ECHO_MSG} "Makefile error: UNIQUE (prefix): $${fname} not found"; \
137 .if ${UNIQUE_SUFFIX_FILES} || ${UNIQUE_FIND_SUFFIX_FILES}
138 @${ECHO_MSG} "===> Creating unique files: Move files needing SUFFIX";
140 .for entry in ${UNIQUE_SUFFIX_FILES}
142 if [ -e ${STAGEDIR}${PREFIX}/$${fname} -o -L ${STAGEDIR}${PREFIX}/$${fname} ]; then \
143 newf=$${fname%/*}/$${fname##*/}${UNIQUE_SUFFIX}; \
144 ${ECHO_MSG} "Move: $${fname} --> $${newf}"; \
145 ${MV} ${STAGEDIR}${PREFIX}/$${fname} ${STAGEDIR}${PREFIX}/$${newf}; \
146 ${ECHO_CMD} MOVED:$${fname}:$${newf} >> ${_UNIQUEPKGLIST}; \
147 ${_DO_CONDITIONAL_SYMLINK}; \
149 ${ECHO_MSG} "Makefile error: UNIQUE (suffix): $${fname} not found"; \
153 .if ${UNIQUE_FIND_SUFFIX_FILES}
154 @for fname in `${UNIQUE_FIND_SUFFIX_FILES}`; do \
155 if [ -e ${STAGEDIR}${PREFIX}/$${fname} -o -L ${STAGEDIR}${PREFIX}/$${fname} ]; then \
156 newf=$${fname%/*}/$${fname##*/}${UNIQUE_SUFFIX}; \
157 ${ECHO_MSG} "Move: $${fname} --> $${newf}"; \
158 ${MV} ${STAGEDIR}${PREFIX}/$${fname} ${STAGEDIR}${PREFIX}/$${newf}; \
159 ${ECHO_CMD} MOVED:$${fname}:$${newf} >> ${_UNIQUEPKGLIST}; \
160 ${_DO_CONDITIONAL_SYMLINK}; \
162 ${ECHO_MSG} "Makefile error: UNIQUE (suffix): $${fname} not found"; \
168 # Using .if exists(${_UNIQUEPKGPLIST} below instead of the sh test
169 # does not work in poudriere. It works fine on the CLI, though...
170 _USES_stage+= 950:move-uniquefiles-plist
171 move-uniquefiles-plist:
172 @if [ -e ${_UNIQUEPKGLIST} ]; then \
173 orgIFS=$$IFS; IFS=":"; while read command entry newentry; do \
175 case $${command} in \
177 ${REINPLACE_CMD} -e "s|^$${entry}$$|$${newentry}|" ${TMPPLIST}; \
180 ${AWK} '$$0 ~ pe { print; print ne ;next }1' \
181 pe="$${entry}" ne="$${newentry}" \
182 ${TMPPLIST} > ${TMPPLIST}.uniquefilestmp; \
183 ${MV} ${TMPPLIST}.uniquefilestmp ${TMPPLIST}; \
188 done < ${_UNIQUEPKGLIST}; \
191 .endif # defined(_POSTMKINCLUDED)