fix xpi extraction
[dports.git] / Mk / bsd.pkgng.mk
1 #-*- tab-width: 4; -*-
2 # ex:ts=4
3 #
4 # $FreeBSD$
5 #
6
7 .if defined(_POSTMKINCLUDED)
8 PKGNG_Include_MAINTAINER=       portmgr@FreeBSD.org
9
10 METADIR=                ${WRKDIR}/.metadir
11 MANIFESTF=              ${METADIR}/+MANIFEST
12
13 PKGPREINSTALL?=         ${PKGDIR}/pkg-pre-install
14 PKGPOSTINSTALL?=        ${PKGDIR}/pkg-post-install
15 PKGPREDEINSTALL?=       ${PKGDIR}/pkg-pre-deinstall
16 PKGPOSTDEINSTALL?=      ${PKGDIR}/pkg-post-deinstall
17 PKGPREUPGRADE?=         ${PKGDIR}/pkg-pre-upgrade
18 PKGPOSTUPGRADE?=        ${PKGDIR}/pkg-post-upgrade
19 PKGUPGRADE?=            ${PKGDIR}/pkg-upgrade
20 _FORCE_POST_PATTERNS=   rmdir kldxref mkfontscale mkfontdir fc-cache \
21                                                 fonts.dir fonts.scale gtk-update-icon-cache \
22                                                 gio-querymodules \
23                                                 gtk-query-immodules \
24                                                 ldconfig \
25                                                 load-octave-pkg \
26                                                 ocamlfind \
27                                                 update-desktop-database update-mime-database \
28                                                 gdk-pixbuf-query-loaders catalog.ports \
29                                                 glib-compile-schemas \
30                                                 ccache-update-links
31
32 PLIST_REINPLACE:=       ${PLIST_REINPLACE:Ndirrmtry}
33 PLIST_REINPLACE:=       ${PLIST_REINPLACE:Nstopdaemon}
34
35 ACTUAL-PACKAGE-DEPENDS?= \
36         if [ "${_LIB_RUN_DEPENDS}" != "  " ]; then \
37                 ${PKG_QUERY} "%n: {origin: %o, version: \"%v\"}" " " ${_LIB_RUN_DEPENDS:C,[^:]*:([^:]*):?.*,\1,:C,${PORTSDIR}/,,} 2>/dev/null || : ; \
38         fi
39
40 create-manifest:
41         @${MKDIR} ${METADIR}
42         @${ECHO_CMD} "name: ${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}" > ${MANIFESTF} 
43         @${ECHO_CMD} "version: ${PKGVERSION}" >> ${MANIFESTF}
44         @${ECHO_CMD} "origin: ${PKGORIGIN}" >> ${MANIFESTF}
45         @${ECHO_CMD} "comment: |" >> ${MANIFESTF}
46         @${ECHO_CMD} "  "${COMMENT:Q} >> ${MANIFESTF}
47         @${ECHO_CMD} "maintainer: ${MAINTAINER}" >> ${MANIFESTF}
48         @${ECHO_CMD} "prefix: ${PREFIX}" >> ${MANIFESTF}
49 #.if defined(NO_ARCH)
50 #       @${ECHO_CMD} "arch: `${PKG_BIN} config abi | ${CUT} -d: -f1,2`:*" >> ${MANIFESTF}
51 #.endif
52 .if defined(WWW)
53         @${ECHO_CMD} "www: ${WWW}" >> ${MANIFESTF}
54 .endif
55         @${ECHO_CMD} "deps: " >> ${MANIFESTF}
56         @${ACTUAL-PACKAGE-DEPENDS} | ${GREP} -v -E ${PKG_IGNORE_DEPENDS} | ${SORT} -u | ${SED} 's/^/  /' >> ${MANIFESTF}
57         @${ECHO_CMD} -n "categories: [" >> ${MANIFESTF}
58 .for cat in ${CATEGORIES:u}
59         @${ECHO_CMD} -n "${cat}," >> ${MANIFESTF}
60 .endfor
61         @${ECHO_CMD} "]" >> ${MANIFESTF}
62 .if defined(LICENSE_COMB)
63         @${ECHO_CMD} "licenselogic: ${LICENSE_COMB}" >> ${MANIFESTF}
64 .else
65         @${ECHO_CMD} "licenselogic: single" >> ${MANIFESTF}
66 .endif
67         @${ECHO_CMD} -n "licenses: [" >> ${MANIFESTF}
68 .for lic in ${LICENSE:u}
69         @${ECHO_CMD} -n "${lic}," >> ${MANIFESTF}
70 .endfor
71         @${ECHO_CMD} "]" >> ${MANIFESTF}
72         @${ECHO_CMD} -n "users: [" >> ${MANIFESTF}
73 .for user in ${USERS:u}
74         @${ECHO_CMD} -n "${user}, " >> ${MANIFESTF}
75 .endfor
76         @${ECHO_CMD} "]" >> ${MANIFESTF}
77         @${ECHO_CMD} -n "groups: [" >> ${MANIFESTF}
78 .for group in ${GROUPS:u}
79         @${ECHO_CMD} -n "${group}, " >> ${MANIFESTF}
80 .endfor
81         @${ECHO_CMD} "]" >> ${MANIFESTF}
82         @${ECHO_CMD} -n "options: {" >> ${MANIFESTF}
83 .for opt in ${COMPLETE_OPTIONS_LIST}
84         @[ -z "${PORT_OPTIONS:M${opt}}" ] || match="on" ; ${ECHO_MSG} -n " ${opt}: $${match:-off}," >> ${MANIFESTF}
85 .endfor
86         @${ECHO_CMD} "}" >> ${MANIFESTF}
87 .if defined(PKG_NOTES)
88         @${ECHO_CMD} -n "annotations: {" >> ${MANIFESTF}
89 .for note in ${PKG_NOTES}
90         @${ECHO_CMD} -n ' ${note}: "${PKG_NOTE_${note}:S/"/\"/g}",' >> ${MANIFESTF}
91 .endfor
92         @${ECHO_CMD} " }" >> ${MANIFESTF}
93 .endif
94         @[ -f ${PKGINSTALL} ] && ${CP} ${PKGINSTALL} ${METADIR}/+INSTALL; \
95         ${RM} -f ${METADIR}/+PRE_INSTALL ; \
96         for a in ${PKGPREINSTALL}; do \
97                 [ -f $$a ] && ${CAT} $$a >> ${METADIR}/+PRE_INSTALL ; \
98         done ; \
99         ${RM} -f ${METADIR}/+POST_INSTALL ; \
100         for a in ${PKGPOSTINSTALL}; do \
101                 [ -f $$a ] && ${CAT} $$a >> ${METADIR}/+POST_INSTALL ; \
102         done ; \
103         [ -f ${PKGDEINSTALL} ] && ${CP} ${PKGDEINSTALL} ${METADIR}/+DEINSTALL; \
104         ${RM} -f ${METADIR}/+PRE_DEINSTALL ; \
105         for a in ${PKGPREDEINSTALL}; do \
106                 [ -f $$a ] && ${CAT} $$a >> ${METADIR}/+PRE_DEINSTALL ; \
107         done ; \
108         ${RM} -f ${METADIR}/+POST_DEINSTALL ; \
109         for a in ${PKGPOSTDEINSTALL}; do \
110                 [ -f $$a ] && ${CAT} $$a >> ${METADIR}/+POST_DEINSTALL ; \
111         done ; \
112         [ -f ${PKGPOSTDEINSTALL} ] && ${CP} ${PKGPOSTDEINSTALL} ${METADIR}/+POST_DEINSTALL; \
113         [ -f ${PKGUPGRADE} ] && ${CP} ${PKGUPGRADE} ${METADIR}/+UPGRADE; \
114         [ -f ${PKGPREUPGRADE} ] && ${CP} ${PKGPREUPGRADE} ${METADIR}/+PRE_UPGRADE; \
115         [ -f ${PKGPOSTUPGRADE} ] && ${CP} ${PKGPOSTUPGRADE} ${METADIR}/+POST_UPGRADE; \
116         ${CP} ${DESCR} ${METADIR}/+DESC; \
117         [ -f ${PKGMESSAGE} ] && ${CP} ${PKGMESSAGE} ${METADIR}/+DISPLAY || return 0
118 .if !defined(NO_MTREE)
119         @[ -f ${MTREE_FILE} ] && ${CP} ${MTREE_FILE} ${METADIR}/+MTREE_DIRS || return 0
120 .endif
121
122
123 .if !target(fake-pkg)
124 .if defined(NO_STAGE)
125 STAGE_ARGS=             -l
126 .else
127 STAGE_ARGS=             -i ${STAGEDIR}
128 .endif
129
130 .if !defined(NO_PKG_REGISTER)
131 fake-pkg: create-manifest
132 .if defined(INSTALLS_DEPENDS)
133         @${ECHO_MSG} "===>   Registering installation for ${PKGNAME} as automatic"
134 .else
135         @${ECHO_MSG} "===>   Registering installation for ${PKGNAME}"
136 .endif
137 .if defined(INSTALLS_DEPENDS)
138         @${SETENV} ${PKG_ENV} FORCE_POST="${_FORCE_POST_PATTERNS}" ${PKG_CMD} -d ${STAGE_ARGS} -m ${METADIR} -f ${TMPPLIST}
139 .else
140         @${SETENV} ${PKG_ENV} FORCE_POST="${_FORCE_POST_PATTERNS}" ${PKG_CMD} ${STAGE_ARGS} -m ${METADIR} -f ${TMPPLIST}
141 .endif
142         @${RM} -rf ${METADIR}
143 .endif
144 .endif
145
146 .if !target(check-build-conflicts)
147 check-build-conflicts:
148 .if ( defined(CONFLICTS) || defined(CONFLICTS_BUILD) ) && !defined(DISABLE_CONFLICTS) && !defined(DEFER_CONFLICTS_CHECK)
149         @conflicts_with=$$( \
150         { ${PKG_QUERY} -g "%n-%v %p %o" ${CONFLICTS:C/.+/'&'/} ${CONFLICTS_BUILD:C/.+/'&'/} 2>/dev/null || : ; } \
151                 | while read pkgname prfx orgn; do \
152                 if [ "/${PREFIX}" = "/$${prfx}" -a "/${PKGORIGIN}" != "/$${orgn}" ]; then \
153                         ${ECHO_CMD} -n " $${pkgname}"; \
154                 fi; \
155         done); \
156         if [ -n "$${conflicts_with}" ]; then \
157                 ${ECHO_MSG}; \
158                 ${ECHO_MSG} "===>  ${PKGNAME} conflicts with installed package(s): "; \
159                 for entry in $${conflicts_with}; do \
160                         ${ECHO_MSG} "      $${entry}"; \
161                 done; \
162                 ${ECHO_MSG}; \
163                 ${ECHO_MSG} "      They will not build together."; \
164                 ${ECHO_MSG} "      Please remove them first with pkg delete."; \
165                 exit 1;\
166         fi
167 .endif
168 .endif
169
170 .if !target(identify-install-conflicts)
171 identify-install-conflicts:
172 .if ( defined(CONFLICTS) || defined(CONFLICTS_INSTALL) ) && !defined(DISABLE_CONFLICTS)
173         @conflicts_with=$$( \
174         { ${PKG_QUERY} -g "%n-%v %p %o" ${CONFLICTS:C/.+/'&'/} ${CONFLICTS_INSTALL:C/.+/'&'/} 2>/dev/null || : ; } \
175                 | while read pkgname prfx orgn; do \
176                 if [ "/${PREFIX}" = "/$${prfx}" -a "/${PKGORIGIN}" != "/$${orgn}" ]; then \
177                         ${ECHO_CMD} -n " $${pkgname}"; \
178                 fi; \
179         done); \
180         if [ -n "$${conflicts_with}" ]; then \
181                 ${ECHO_MSG}; \
182                 ${ECHO_MSG} "===>  ${PKGNAME} conflicts with installed package(s): "; \
183                 for entry in $${conflicts_with}; do \
184                         ${ECHO_MSG} "      $${entry}"; \
185                 done; \
186                 ${ECHO_MSG}; \
187                 ${ECHO_MSG} "      They install files into the same place."; \
188                 ${ECHO_MSG} "      You may want to stop build with Ctrl + C."; \
189                 sleep 10; \
190         fi
191 .endif
192 .endif
193
194 .if !target(check-install-conflicts)
195 check-install-conflicts:
196 .if ( defined(CONFLICTS) || defined(CONFLICTS_INSTALL) || ( defined(CONFLICTS_BUILD) && defined(DEFER_CONFLICTS_CHECK) ) ) && !defined(DISABLE_CONFLICTS) 
197 .if defined(DEFER_CONFLICTS_CHECK)
198         @conflicts_with=$$( \
199         { ${PKG_QUERY} -g "%n-%v %p %o" ${CONFLICTS:C/.+/'&'/} ${CONFLICTS_BUILD:C/.+/'&'/} ${CONFLICTS_INSTALL:C/.+/'&'/} 2>/dev/null || : ; } \
200                 | while read pkgname prfx orgn; do \
201                 if [ "/${PREFIX}" = "/$${prfx}" -a "/${PKGORIGIN}" != "/$${orgn}" ]; then \
202                         ${ECHO_CMD} -n " $${pkgname}"; \
203                 fi; \
204         done); \
205         if [ -n "$${conflicts_with}" ]; then \
206                 ${ECHO_MSG}; \
207                 ${ECHO_MSG} "===>  ${PKGNAME} conflicts with installed package(s): "; \
208                 for entry in $${conflicts_with}; do \
209                         ${ECHO_MSG} "      $${entry}"; \
210                 done; \
211                 ${ECHO_MSG}; \
212                 ${ECHO_MSG} "      Please remove them first with pkg delete."; \
213                 exit 1; \
214         fi
215 .else
216         @conflicts_with=$$( \
217         { ${PKG_QUERY} -g "%n-%v %p %o" ${CONFLICTS:C/.+/'&'/} ${CONFLICTS_INSTALL:C/.+/'&'/} 2>/dev/null || : ; } \
218                 | while read pkgname prfx orgn; do \
219                 if [ "/${PREFIX}" = "/$${prfx}" -a "/${PKGORIGIN}" != "/$${orgn}" ]; then \
220                         ${ECHO_CMD} -n " $${pkgname}"; \
221                 fi; \
222         done); \
223         if [ -n "$${conflicts_with}" ]; then \
224                 ${ECHO_MSG}; \
225                 ${ECHO_MSG} "===>  ${PKGNAME} conflicts with installed package(s): "; \
226                 for entry in $${conflicts_with}; do \
227                         ${ECHO_MSG} "      $${entry}"; \
228                 done; \
229                 ${ECHO_MSG}; \
230                 ${ECHO_MSG} "      They install files into the same place."; \
231                 ${ECHO_MSG} "      Please remove them first with pkg delete."; \
232                 exit 1; \
233         fi
234 .endif # defined(DEFER_CONFLICTS_CHECK)
235 .endif
236 .endif
237
238 .if !target(do-package)
239 .if !defined(NO_STAGE)
240 PKG_CREATE_ARGS=        -r ${STAGEDIR} -m ${METADIR} -p ${TMPPLIST}
241 do-package: create-manifest
242 .endif
243 do-package: ${TMPPLIST}
244         @if [ -d ${PACKAGES} ]; then \
245                 if [ ! -d ${PKGREPOSITORY} ]; then \
246                         if ! ${MKDIR} ${PKGREPOSITORY}; then \
247                                 ${ECHO_MSG} "=> Can't create directory ${PKGREPOSITORY}."; \
248                                 exit 1; \
249                         fi; \
250                 fi; \
251         fi
252         @for cat in ${CATEGORIES}; do \
253                 ${RM} -f ${PACKAGES}/$$cat/${PKGNAMEPREFIX}${PORTNAME}*${PKG_SUFX} ; \
254         done
255         @${MKDIR} ${WRKDIR}/pkg
256         @if ${SETENV} ${PKG_ENV} FORCE_POST="${_FORCE_POST_PATTERNS}" ${PKG_CREATE} ${PKG_CREATE_ARGS} -o ${WRKDIR}/pkg ${PKGNAME}; then \
257                 if [ -d ${PKGREPOSITORY} -a -w ${PKGREPOSITORY} ]; then \
258                         ${LN} -f ${WRKDIR}/pkg/${PKGNAME}${PKG_SUFX} ${PKGFILE} 2>/dev/null \
259                                 || ${CP} -af ${WRKDIR}/pkg/${PKGNAME}${PKG_SUFX} ${PKGFILE}; \
260                         if [ "${PKGORIGIN}" = "ports-mgmt/pkg" -o "${PKGORIGIN}" = "ports-mgmt/pkg-devel" ]; then \
261                                 if [ ! -d ${PKGLATESTREPOSITORY} ]; then \
262                                         if ! ${MKDIR} ${PKGLATESTREPOSITORY}; then \
263                                                 ${ECHO_MSG} "=> Can't create directory ${PKGLATESTREPOSITORY}."; \
264                                                 exit 1; \
265                                         fi; \
266                                 fi ; \
267                                 ${LN} -sf ../${PKGREPOSITORYSUBDIR}/${PKGNAME}${PKG_SUFX} ${PKGLATESTFILE} ; \
268                         fi; \
269                 fi; \
270         else \
271                 cd ${.CURDIR} && eval ${MAKE} delete-package; \
272                 exit 1; \
273         fi
274 .endif
275
276 .if !target(check-already-installed)
277 .if !defined(NO_PKG_REGISTER) && !defined(FORCE_PKG_REGISTER)
278 check-already-installed:
279                 @${ECHO_MSG} "===>  Checking if ${PKGORIGIN} already installed"; \
280                 pkgname=`${PKG_INFO} -q -O ${PKGORIGIN}`; \
281                 if [ -n "$${pkgname}" ]; then \
282                         v=`${PKG_VERSION} -t $${pkgname} ${PKGNAME}`; \
283                         if [ "$${v}" = "<" ]; then \
284                                 ${ECHO_CMD} "===>   An older version of ${PKGORIGIN} is already installed ($${pkgname})"; \
285                         else \
286                                 ${ECHO_CMD} "===>   ${PKGNAME} is already installed"; \
287                         fi; \
288                         ${ECHO_MSG} "      You may wish to \`\`make deinstall'' and install this port again"; \
289                         ${ECHO_MSG} "      by \`\`make reinstall'' to upgrade it properly."; \
290                         ${ECHO_MSG} "      If you really wish to overwrite the old port of ${PKGORIGIN}"; \
291                         ${ECHO_MSG} "      without deleting it first, set the variable \"FORCE_PKG_REGISTER\""; \
292                         ${ECHO_MSG} "      in your environment or the \"make install\" command line."; \
293                         exit 1; \
294                 fi
295 .endif
296 .endif
297
298
299 .if !target(deinstall)
300 deinstall:
301 .if defined(UID) && ${UID} != 0 && !defined(INSTALL_AS_USER)
302         @${ECHO_MSG} "===>  Switching to root credentials for '${.TARGET}' target"
303         @cd ${.CURDIR} && \
304                 ${SU_CMD} "${MAKE} ${.TARGET}"
305         @${ECHO_MSG} "===>  Returning to user credentials"
306 .else
307         @${ECHO_MSG} "===>  Deinstalling for ${PKGORIGIN}"
308         @if ${PKG_INFO} -e ${PKGORIGIN}; then \
309                 p=`${PKG_INFO} -q ${PKGORIGIN}`; \
310                 ${ECHO_MSG} "===>   Deinstalling $${p}"; \
311                 ${PKG_DELETE} -f ${PKGORIGIN} ; \
312         else \
313                 ${ECHO_MSG} "===>   ${PKGBASE} not installed, skipping"; \
314         fi
315         @${RM} -f ${INSTALL_COOKIE} ${PACKAGE_COOKIE}
316 .endif
317 .endif
318
319 .endif # defined(_POSTMKINCLUDED)