Fri Apr 23 03:57:16 2021 UTC ()
Rework the PLIST handling to support executable-only packages

It was a long-standing issue that Haskell packages which didn't contain a
library could not be correctly handled.

There are fewer substitutions in PLIST_SUBST now. As a result existing
PLIST files will all be considered as outdated and should be updated
either by setting HS_UPDATE_PLIST=yes or by manually running print-PLIST.
They will be ignored until that.


(pho)
diff -r1.28 -r1.29 pkgsrc/mk/haskell.mk

cvs diff -r1.28 -r1.29 pkgsrc/mk/haskell.mk (expand / switch to unified diff)

--- pkgsrc/mk/haskell.mk 2021/03/14 08:19:24 1.28
+++ pkgsrc/mk/haskell.mk 2021/04/23 03:57:16 1.29
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1# $NetBSD: haskell.mk,v 1.28 2021/03/14 08:19:24 pho Exp $ 1# $NetBSD: haskell.mk,v 1.29 2021/04/23 03:57:16 pho Exp $
2# 2#
3# This Makefile fragment handles Haskell Cabal packages. 3# This Makefile fragment handles Haskell Cabal packages.
4# Package configuration, building, installation, registration and 4# Package configuration, building, installation, registration and
5# unregistration are fully automated. 5# unregistration are fully automated.
6# See https://www.haskell.org/cabal/. 6# See https://www.haskell.org/cabal/.
7# 7#
8# Package-settable variables: 8# Package-settable variables:
9# 9#
10# PKGNAME 10# PKGNAME
11# Defaults to hs-${DISTNAME}. 11# Defaults to hs-${DISTNAME}.
12# 12#
13# HOMEPAGE 13# HOMEPAGE
14# MASTER_SITES 14# MASTER_SITES
@@ -75,26 +75,31 @@ _DEF_VARS.haskell= \ @@ -75,26 +75,31 @@ _DEF_VARS.haskell= \
75 INSTALL_TEMPLATES \ 75 INSTALL_TEMPLATES \
76 DEINSTALL_TEMPLATES \ 76 DEINSTALL_TEMPLATES \
77 _HASKELL_VERSION_CMD \ 77 _HASKELL_VERSION_CMD \
78 _HASKELL_BIN \ 78 _HASKELL_BIN \
79 _HASKELL_PKG_BIN \ 79 _HASKELL_PKG_BIN \
80 _HASKELL_PKG_DESCR_FILE \ 80 _HASKELL_PKG_DESCR_FILE \
81 _HASKELL_PKG_ID_FILE \ 81 _HASKELL_PKG_ID_FILE \
82 _HASKELL_VERSION 82 _HASKELL_VERSION
83_USE_VARS.haskell= \ 83_USE_VARS.haskell= \
84 PKG_VERBOSE \ 84 PKG_VERBOSE \
85 BUILDLINK_PREFIX.ghc \ 85 BUILDLINK_PREFIX.ghc \
86 PKGDIR DESTDIR \ 86 PKGDIR DESTDIR \
87 WRKSRC 87 WRKSRC
 88_LISTED_VARS.haskell= \
 89 CONFIGURE_ARGS \
 90 PLIST_SUBST \
 91 PRINT_PLIST_AWK \
 92 FILES_SUBST
88_IGN_VARS.haskell= \ 93_IGN_VARS.haskell= \
89 USE_TOOLS CONFIGURE_ENV MAKE_ENV WARNINGS _* 94 USE_TOOLS CONFIGURE_ENV MAKE_ENV WARNINGS _*
90 95
91PKGNAME?= hs-${DISTNAME} 96PKGNAME?= hs-${DISTNAME}
92MASTER_SITES?= ${MASTER_SITE_HASKELL_HACKAGE:=${DISTNAME}/} 97MASTER_SITES?= ${MASTER_SITE_HASKELL_HACKAGE:=${DISTNAME}/}
93HOMEPAGE?= http://hackage.haskell.org/package/${DISTNAME:C/-[^-]*$//} 98HOMEPAGE?= http://hackage.haskell.org/package/${DISTNAME:C/-[^-]*$//}
94 99
95# Cabal packages may use pkg-config, but url2pkg can't detect 100# Cabal packages may use pkg-config, but url2pkg can't detect
96# that. (PHO: I think that should be handled by url2pkg (2009-05-20)) 101# that. (PHO: I think that should be handled by url2pkg (2009-05-20))
97USE_TOOLS+= pkg-config 102USE_TOOLS+= pkg-config
98 103
99# GHC can be a memory hog, so don't apply regular limits. 104# GHC can be a memory hog, so don't apply regular limits.
100UNLIMIT_RESOURCES+= datasize virtualsize 105UNLIMIT_RESOURCES+= datasize virtualsize
@@ -140,67 +145,65 @@ CONFIGURE_ARGS+= --enable-library-profil @@ -140,67 +145,65 @@ CONFIGURE_ARGS+= --enable-library-profil
140CONFIGURE_ARGS+= --disable-library-profiling 145CONFIGURE_ARGS+= --disable-library-profiling
141.endif 146.endif
142 147
143.if ${HASKELL_ENABLE_HADDOCK_DOCUMENTATION} == "yes" 148.if ${HASKELL_ENABLE_HADDOCK_DOCUMENTATION} == "yes"
144CONFIGURE_ARGS+= --with-haddock=${BUILDLINK_PREFIX.ghc:Q}/bin/haddock 149CONFIGURE_ARGS+= --with-haddock=${BUILDLINK_PREFIX.ghc:Q}/bin/haddock
145.endif 150.endif
146 151
147CONFIGURE_ARGS+= -O${HASKELL_OPTIMIZATION_LEVEL} 152CONFIGURE_ARGS+= -O${HASKELL_OPTIMIZATION_LEVEL}
148 153
149.if !exists(${PKGDIR}/PLIST) 154.if !exists(${PKGDIR}/PLIST)
150_HS_PLIST_STATUS= missing 155_HS_PLIST_STATUS= missing
151.elif !${${GREP} "." ${PKGDIR}/PLIST || ${TRUE}:L:sh} 156.elif !${${GREP} "." ${PKGDIR}/PLIST || ${TRUE}:L:sh}
152_HS_PLIST_STATUS= missing 157_HS_PLIST_STATUS= missing
153.elif ${${GREP} HS_INTF ${PKGDIR}/PLIST || ${TRUE}:L:sh} 158.elif ${${GREP} HS_VERSION ${PKGDIR}/PLIST || ${TRUE}:L:sh}
154_HS_PLIST_STATUS= lib-ok 159_HS_PLIST_STATUS= ok
155.elif !${${GREP} "/package-description" ${PKGDIR}/PLIST || ${TRUE}:L:sh} 160.elif !${${GREP} "/package-description" ${PKGDIR}/PLIST || ${TRUE}:L:sh}
156_HS_PLIST_STATUS= plain 161_HS_PLIST_STATUS= ok
157.else 162.else
158_HS_PLIST_STATUS= outdated 163_HS_PLIST_STATUS= outdated
159.endif 164.endif
160 165
161# Starting from GHC 7.10 (or 7.8?), packages are installed in directories 166# Starting from GHC 7.10 (or 7.8?), packages are installed in directories
162# with a hashed name, which makes it a bit more complicated to generate 167# with a hashed name, which makes it a bit more complicated to generate
163# the PLIST. 168# the PLIST.
164# 169#
165.if ${_HS_PLIST_STATUS} == lib-ok || ${_HS_PLIST_STATUS} == missing 170
166_HASKELL_PL_INTF= ${_HASKELL_PKG_ID_FILE:H:S,^${PREFIX}/,,} 171# There is no easy way to obtain a platform string such as
167_HASKELL_PL_IMPL_AWK= prev == "import-dirs:" { dir = $$1; exit } 172# "x86_64-netbsd-ghc-9.0.1". If the package contains a library we
168_HASKELL_PL_IMPL_AWK+= { prev = $$0 } 173# could extract it from the description file, but if it's
169_HASKELL_PL_IMPL_AWK+= END { print(dir ? dir : "never_match_this") } 174# executable-only there's no such file. As a workaround we read the
170_HASKELL_PL_IMPL_CMD= ${AWK} '${_HASKELL_PL_IMPL_AWK}' ${DESTDIR}${_HASKELL_PKG_DESCR_FILE} 175# description of "base" (which always exists) and extract the platform
171_HASKELL_PL_IMPL= ${_HASKELL_PL_IMPL_CMD:sh:S,^${PREFIX}/,,} 176# from it.
172_HASKELL_PL_DOCS= ${_HASKELL_PL_IMPL:S,^lib,share/doc,:C,-[A-Za-z0-9]*$,,} 177_HS_PLIST.platform.cmd= ${_HASKELL_PKG_BIN} --simple-output field base data-dir
173_HASKELL_PL_PLATFORM= ${_HASKELL_PL_IMPL:H:T:S,^.$,never_match_this,} 178_HS_PLIST.platform= ${_HS_PLIST.platform.cmd:sh:H:T}
174_HASKELL_PL_PKGID_CMD= ${CAT} ${DESTDIR}${_HASKELL_PKG_ID_FILE} 179# Package ID formatted as "{name}-{version}-{hash}": this only exists
175_HASKELL_PL_PKGID= ${_HASKELL_PL_PKGID_CMD:sh} 180# if the package contains a library.
176_HASKELL_PL_VER= ${_HASKELL_VERSION:S,-,,} 181_HS_PLIST.lib.pkg-id.cmd= ${CAT} ${DESTDIR}${_HASKELL_PKG_ID_FILE}
177 182_HS_PLIST.lib.pkg-id= ${exists(${DESTDIR}${_HASKELL_PKG_ID_FILE}):?${_HS_PLIST.lib.pkg-id.cmd:sh}:}
178_HS_PLIST_SUBST+= HS_INTF=${_HASKELL_PL_INTF} 183# Abbreviated compiler version. Used for shared libraries.
179_HS_PLIST_SUBST+= HS_IMPL=${_HASKELL_PL_IMPL} 184_HS_PLIST.short-ver= ${_HASKELL_VERSION:S,-,,}
180_HS_PLIST_SUBST+= HS_DOCS=${_HASKELL_PL_DOCS} 185
181_HS_PLIST_SUBST+= HS_PLATFORM=${_HASKELL_PL_PLATFORM} 186PLIST_SUBST+= HS_PLATFORM=${_HS_PLIST.platform}
182_HS_PLIST_SUBST+= HS_PKGID=${_HASKELL_PL_PKGID} 187PLIST_SUBST+= HS_VERSION=${_HASKELL_VERSION}
183_HS_PLIST_SUBST+= HS_VER=${_HASKELL_PL_VER} 188PLIST_SUBST+= HS_VER=${_HS_PLIST.short-ver}
184PLIST_SUBST+= ${exists(${DESTDIR}${_HASKELL_PKG_DESCR_FILE}):?${_HS_PLIST_SUBST}:} 189_HS_PLIST_SUBST.lib= HS_PKGID=${_HS_PLIST.lib.pkg-id}
185 190PLIST_SUBST+= ${!empty(_HS_PLIST.lib.pkg-id):?${_HS_PLIST_SUBST.lib}:}
186_HS_PRINT_PLIST_AWK+= { sub("^${_HASKELL_PL_INTF}", "$${HS_INTF}") } 191
187_HS_PRINT_PLIST_AWK+= { sub("^${_HASKELL_PL_IMPL}", "$${HS_IMPL}") } 192PRINT_PLIST_AWK+= { gsub("${_HS_PLIST.platform}", "$${HS_PLATFORM}") }
188_HS_PRINT_PLIST_AWK+= { sub("^${_HASKELL_PL_DOCS}", "$${HS_DOCS}") } 193PRINT_PLIST_AWK+= { gsub("${_HASKELL_VERSION}", "$${HS_VERSION}" ) }
189_HS_PRINT_PLIST_AWK+= { sub("/${_HASKELL_PL_PLATFORM}/", "/$${HS_PLATFORM}/") } 194PRINT_PLIST_AWK+= { gsub("${_HS_PLIST.short-ver}", "$${HS_VER}" ) }
190_HS_PRINT_PLIST_AWK+= { sub( "${_HASKELL_PL_PKGID}", "$${HS_PKGID}") } 195_HS_PRINT_PLIST_AWK.lib={ gsub("${_HS_PLIST.lib.pkg-id}", "$${HS_PKGID}" ) }
191_HS_PRINT_PLIST_AWK+= { sub( "${_HASKELL_PL_VER}", "$${HS_VER}") } 196PRINT_PLIST_AWK+= ${!empty(_HS_PLIST.lib.pkg-id):?${_HS_PRINT_PLIST_AWK.lib}:}
192PRINT_PLIST_AWK+= ${exists(${DESTDIR}${_HASKELL_PKG_DESCR_FILE}):?${_HS_PRINT_PLIST_AWK}:} 
193.endif 
194 197
195.if ${_HS_PLIST_STATUS} == missing || ${_HS_PLIST_STATUS} == outdated 198.if ${_HS_PLIST_STATUS} == missing || ${_HS_PLIST_STATUS} == outdated
196. if ${HS_UPDATE_PLIST} == yes 199. if ${HS_UPDATE_PLIST} == yes
197GENERATE_PLIST+= ${MAKE} print-PLIST > ${PKGDIR}/PLIST; 200GENERATE_PLIST+= ${MAKE} print-PLIST > ${PKGDIR}/PLIST;
198. endif 201. endif
199GENERATE_PLIST+= \ 202GENERATE_PLIST+= \
200 cd ${DESTDIR:Q}${PREFIX:Q} && \ 203 cd ${DESTDIR:Q}${PREFIX:Q} && \
201 ${FIND} * \( -type f -o -type l \) | ${SORT}; 204 ${FIND} * \( -type f -o -type l \) | ${SORT};
202PLIST_SRC= # none 205PLIST_SRC= # none
203.endif 206.endif
204 207
205.if ${_HS_PLIST_STATUS} == outdated && ${HS_UPDATE_PLIST} == no 208.if ${_HS_PLIST_STATUS} == outdated && ${HS_UPDATE_PLIST} == no
206WARNINGS+= "[haskell.mk] The PLIST format is outdated." 209WARNINGS+= "[haskell.mk] The PLIST format is outdated."
@@ -241,40 +244,39 @@ INSTALLATION_DIRS+= ${_HASKELL_PKG_DESC @@ -241,40 +244,39 @@ INSTALLATION_DIRS+= ${_HASKELL_PKG_DESC
241do-install: 244do-install:
242 ${RUN} ${_ULIMIT_CMD} cd ${WRKSRC} && \ 245 ${RUN} ${_ULIMIT_CMD} cd ${WRKSRC} && \
243 ./Setup register ${PKG_VERBOSE:D-v} \ 246 ./Setup register ${PKG_VERBOSE:D-v} \
244 --gen-pkg-config=dist/package-description \ 247 --gen-pkg-config=dist/package-description \
245 --print-ipid \ 248 --print-ipid \
246 > dist/package-id && \ 249 > dist/package-id && \
247 ./Setup copy ${PKG_VERBOSE:D-v} --destdir=${DESTDIR:Q} && \ 250 ./Setup copy ${PKG_VERBOSE:D-v} --destdir=${DESTDIR:Q} && \
248 if [ -f dist/package-description ]; then \ 251 if [ -f dist/package-description ]; then \
249 ${INSTALL_DATA} dist/package-description \ 252 ${INSTALL_DATA} dist/package-description \
250 ${DESTDIR:Q}${_HASKELL_PKG_DESCR_FILE:Q}; \ 253 ${DESTDIR:Q}${_HASKELL_PKG_DESCR_FILE:Q}; \
251 ${INSTALL_DATA} dist/package-id \ 254 ${INSTALL_DATA} dist/package-id \
252 ${DESTDIR:Q}${_HASKELL_PKG_ID_FILE:Q}; \ 255 ${DESTDIR:Q}${_HASKELL_PKG_ID_FILE:Q}; \
253 fi 256 fi
 257# Executable-only packages tend to create an empty directory tree in
 258# lib/ which results in useless @pkgdir in PLIST.
 259 ${RUN}${FIND} ${DESTDIR:Q}${PREFIX}/lib -type d | \
 260 ${TAIL} -n 1 | \
 261 ${XARGS} ${RMDIR} -p 2>/dev/null || ${TRUE}
254 262
255# Define test target. 263# Define test target.
256do-test: 264do-test:
257 ${RUN} ${_ULIMIT_CMD} cd ${WRKSRC} && \ 265 ${RUN} ${_ULIMIT_CMD} cd ${WRKSRC} && \
258 ./Setup test ${PKG_VERBOSE:D-v} 266 ./Setup test ${PKG_VERBOSE:D-v}
259 267
260# Substitutions for INSTALL and DEINSTALL. 268# Substitutions for INSTALL and DEINSTALL.
261FILES_SUBST+= HASKELL_PKG_BIN=${_HASKELL_PKG_BIN} 269FILES_SUBST+= HASKELL_PKG_BIN=${_HASKELL_PKG_BIN}
262FILES_SUBST+= HASKELL_PKG_DESCR_FILE=${_HASKELL_PKG_DESCR_FILE} 270FILES_SUBST+= HASKELL_PKG_DESCR_FILE=${_HASKELL_PKG_DESCR_FILE}
263FILES_SUBST+= HASKELL_PKG_ID_FILE=${_HASKELL_PKG_ID_FILE} 271FILES_SUBST+= HASKELL_PKG_ID_FILE=${_HASKELL_PKG_ID_FILE}
264 272
265INSTALL_TEMPLATES+= ../../mk/haskell/INSTALL.in 273INSTALL_TEMPLATES+= ../../mk/haskell/INSTALL.in
266DEINSTALL_TEMPLATES+= ../../mk/haskell/DEINSTALL.in 274DEINSTALL_TEMPLATES+= ../../mk/haskell/DEINSTALL.in
267 275
268# Only present these variables if the definitions can be extracted 276# Only present these variables if the definitions can be extracted
269# from the files in DESTDIR. 277# from the files in DESTDIR.
270_HS_DESTDIR_DEF_VARS= PLIST_SUBST PRINT_PLIST_AWK 278_DEF_VARS.haskell+= _HS_PLIST.platform
271_HS_DESTDIR_DEF_VARS+= _HASKELL_PL_INTF 279_DEF_VARS.haskell+= _HS_PLIST.short-ver
272_HS_DESTDIR_DEF_VARS+= _HASKELL_PL_IMPL 280_DEF_VARS.haskell+= ${!empty(_HS_PLIST.lib.pkg-id):?_HS_PLIST.lib.pkg-id:}
273_HS_DESTDIR_DEF_VARS+= _HASKELL_PL_DOCS 
274_HS_DESTDIR_DEF_VARS+= _HASKELL_PL_PLATFORM 
275_HS_DESTDIR_DEF_VARS+= _HASKELL_PL_PKGID 
276_HS_DESTDIR_DEF_VARS+= _HASKELL_PL_VER 
277_DEF_VARS.haskell+= ${exists(${DESTDIR}${_HASKELL_PKG_DESCR_FILE}) :? ${_HS_DESTDIR_DEF_VARS} :} 
278_LISTED_VARS.haskell+= PLIST_SUBST PRINT_PLIST_AWK 
279 281
280.endif # HASKELL_MK 282.endif # HASKELL_MK