Sync Mk with ports
[dports.git] / Mk / Uses / uniquefiles.mk
1 # $FreeBSD$
2 #
3 # Make files or directories 'unique', by adding a prefix or suffix.
4 #
5 # Feature:              uniquefiles
6 # Usage:                USES=uniquefiles or USES=uniquefiles:ARGS
7 # Valid ARGS:   dirs
8 #
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
12 #
13 # Variables for ports:
14 #
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.
18 #                         Default: empty
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.
22 #                         Default: empty
23 #
24 # Variables for the ports framework, but NOT individual ports:
25 #
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.
33 #
34 #                         category/py-foo, installed as:
35 #
36 #                       py27-foo for Python 2.7 (DEFAULT_VERSION)
37 #                       py33-foo for Python 3.3
38 #
39 #                         Results in:
40 #
41 #                       py27-foo
42 #                       bin/foo-2.7             (UNIQUE_SUFFIX)
43 #                       bin/foo -> bin/foo-2.7  (symlinked original filename)
44 #                       py33-foo creates:
45 #                       bin/foo-3.3             (UNIQUE_SUFFIX)
46 #
47 #                         Default: no
48 #
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.
52 #                                 Default: empty
53 #
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.
57 #                                 Default: empty
58 #
59 # NOTE: multiple logical instances are not supported by pkg and the original
60 # pkg_tools at the moment.
61 #
62 # MAINTAINER:   portmgr@FreeBSD.org
63
64 .if !defined(_INCLUDE_USES_UNIQUEFILES_MK)
65 _INCLUDE_USES_UNIQUEFILES_MK=   yes
66
67 UNIQUE_PREFIX?=         ${PKGNAMEPREFIX}
68 UNIQUE_SUFFIX?=         ${PKGNAMESUFFIX}
69 UNIQUE_PREFIX_FILES?=   # empty
70 UNIQUE_SUFFIX_FILES?=   # empty
71
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}
78 .endif
79
80 UNIQUE_DEFAULT_LINKS?=          no
81 UNIQUE_FIND_PREFIX_FILES?=      # empty
82 UNIQUE_FIND_SUFFIX_FILES?=      # empty
83
84 _USES_POST+=    uniquefiles
85 .endif # _INCLUDE_USES_UNIQUEFILES_MK
86
87 .if defined(_POSTMKINCLUDED) && !defined(_INCLUDE_USES_UNIQUEFILES_POST_MK)
88 _INCLUDE_USES_UNIQUEFILES_POST_MK=     yes
89
90 _UNIQUEPKGLIST=         ${WRKDIR}/.PLIST.uniquefiles
91
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}; \
98         fi
99 .else
100 # We are not symlinking the renamed binary.
101 _DO_CONDITIONAL_SYMLINK=        ${DO_NADA}
102 .endif
103
104 _USES_stage+=   775:move-uniquefiles
105 move-uniquefiles:
106 .if ${UNIQUE_PREFIX_FILES} || ${UNIQUE_FIND_PREFIX_FILES}
107         @${ECHO_MSG} "===> Creating unique files: Move files needing PREFIX";
108 .endif
109 .for entry in ${UNIQUE_PREFIX_FILES}
110         @fname=${entry}; \
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}; \
117         else \
118                 ${ECHO_MSG} "Makefile error: UNIQUE (prefix): $${fname} not found"; \
119                 ${FALSE}; \
120         fi;
121 .endfor
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}; \
130                 else \
131                         ${ECHO_MSG} "Makefile error: UNIQUE (prefix): $${fname} not found"; \
132                         ${FALSE}; \
133                 fi; \
134         done;
135 .endif
136
137 .if ${UNIQUE_SUFFIX_FILES} || ${UNIQUE_FIND_SUFFIX_FILES}
138         @${ECHO_MSG} "===> Creating unique files: Move files needing SUFFIX";
139 .endif
140 .for entry in ${UNIQUE_SUFFIX_FILES}
141         @fname=${entry}; \
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}; \
148         else \
149                 ${ECHO_MSG} "Makefile error: UNIQUE (suffix): $${fname} not found"; \
150                 ${FALSE}; \
151         fi;
152 .endfor
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}; \
161                 else \
162                         ${ECHO_MSG} "Makefile error: UNIQUE (suffix): $${fname} not found"; \
163                         ${FALSE}; \
164                 fi; \
165         done;
166 .endif
167
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 \
174                         IFS=$$orgIFS; \
175                         case $${command} in \
176                         MOVED) \
177                                 ${REINPLACE_CMD} -e "s|^$${entry}$$|$${newentry}|" ${TMPPLIST}; \
178                                 ;; \
179                         LINKED) \
180                                 ${AWK} '$$0 ~ pe { print; print ne ;next }1' \
181                                         pe="$${entry}" ne="$${newentry}" \
182                                         ${TMPPLIST} > ${TMPPLIST}.uniquefilestmp; \
183                                 ${MV} ${TMPPLIST}.uniquefilestmp ${TMPPLIST}; \
184                                 ;; \
185                         *) ;; \
186                         esac; \
187                         IFS=":"; \
188                 done < ${_UNIQUEPKGLIST}; \
189         fi
190
191 .endif # defined(_POSTMKINCLUDED)