| @@ -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 | |
91 | PKGNAME?= hs-${DISTNAME} | | 96 | PKGNAME?= hs-${DISTNAME} |
92 | MASTER_SITES?= ${MASTER_SITE_HASKELL_HACKAGE:=${DISTNAME}/} | | 97 | MASTER_SITES?= ${MASTER_SITE_HASKELL_HACKAGE:=${DISTNAME}/} |
93 | HOMEPAGE?= http://hackage.haskell.org/package/${DISTNAME:C/-[^-]*$//} | | 98 | HOMEPAGE?= 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)) |
97 | USE_TOOLS+= pkg-config | | 102 | USE_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. |
100 | UNLIMIT_RESOURCES+= datasize virtualsize | | 105 | UNLIMIT_RESOURCES+= datasize virtualsize |
| @@ -140,67 +145,65 @@ CONFIGURE_ARGS+= --enable-library-profil | | | @@ -140,67 +145,65 @@ CONFIGURE_ARGS+= --enable-library-profil |
140 | CONFIGURE_ARGS+= --disable-library-profiling | | 145 | CONFIGURE_ARGS+= --disable-library-profiling |
141 | .endif | | 146 | .endif |
142 | | | 147 | |
143 | .if ${HASKELL_ENABLE_HADDOCK_DOCUMENTATION} == "yes" | | 148 | .if ${HASKELL_ENABLE_HADDOCK_DOCUMENTATION} == "yes" |
144 | CONFIGURE_ARGS+= --with-haddock=${BUILDLINK_PREFIX.ghc:Q}/bin/haddock | | 149 | CONFIGURE_ARGS+= --with-haddock=${BUILDLINK_PREFIX.ghc:Q}/bin/haddock |
145 | .endif | | 150 | .endif |
146 | | | 151 | |
147 | CONFIGURE_ARGS+= -O${HASKELL_OPTIMIZATION_LEVEL} | | 152 | CONFIGURE_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} | | 186 | PLIST_SUBST+= HS_PLATFORM=${_HS_PLIST.platform} |
182 | _HS_PLIST_SUBST+= HS_PKGID=${_HASKELL_PL_PKGID} | | 187 | PLIST_SUBST+= HS_VERSION=${_HASKELL_VERSION} |
183 | _HS_PLIST_SUBST+= HS_VER=${_HASKELL_PL_VER} | | 188 | PLIST_SUBST+= HS_VER=${_HS_PLIST.short-ver} |
184 | PLIST_SUBST+= ${exists(${DESTDIR}${_HASKELL_PKG_DESCR_FILE}):?${_HS_PLIST_SUBST}:} | | 189 | _HS_PLIST_SUBST.lib= HS_PKGID=${_HS_PLIST.lib.pkg-id} |
185 | | | 190 | PLIST_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}") } | | 192 | PRINT_PLIST_AWK+= { gsub("${_HS_PLIST.platform}", "$${HS_PLATFORM}") } |
188 | _HS_PRINT_PLIST_AWK+= { sub("^${_HASKELL_PL_DOCS}", "$${HS_DOCS}") } | | 193 | PRINT_PLIST_AWK+= { gsub("${_HASKELL_VERSION}", "$${HS_VERSION}" ) } |
189 | _HS_PRINT_PLIST_AWK+= { sub("/${_HASKELL_PL_PLATFORM}/", "/$${HS_PLATFORM}/") } | | 194 | PRINT_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}") } | | 196 | PRINT_PLIST_AWK+= ${!empty(_HS_PLIST.lib.pkg-id):?${_HS_PRINT_PLIST_AWK.lib}:} |
192 | PRINT_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 |
197 | GENERATE_PLIST+= ${MAKE} print-PLIST > ${PKGDIR}/PLIST; | | 200 | GENERATE_PLIST+= ${MAKE} print-PLIST > ${PKGDIR}/PLIST; |
198 | . endif | | 201 | . endif |
199 | GENERATE_PLIST+= \ | | 202 | GENERATE_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}; |
202 | PLIST_SRC= # none | | 205 | PLIST_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 |
206 | WARNINGS+= "[haskell.mk] The PLIST format is outdated." | | 209 | WARNINGS+= "[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 |
241 | do-install: | | 244 | do-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. |
256 | do-test: | | 264 | do-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. |
261 | FILES_SUBST+= HASKELL_PKG_BIN=${_HASKELL_PKG_BIN} | | 269 | FILES_SUBST+= HASKELL_PKG_BIN=${_HASKELL_PKG_BIN} |
262 | FILES_SUBST+= HASKELL_PKG_DESCR_FILE=${_HASKELL_PKG_DESCR_FILE} | | 270 | FILES_SUBST+= HASKELL_PKG_DESCR_FILE=${_HASKELL_PKG_DESCR_FILE} |
263 | FILES_SUBST+= HASKELL_PKG_ID_FILE=${_HASKELL_PKG_ID_FILE} | | 271 | FILES_SUBST+= HASKELL_PKG_ID_FILE=${_HASKELL_PKG_ID_FILE} |
264 | | | 272 | |
265 | INSTALL_TEMPLATES+= ../../mk/haskell/INSTALL.in | | 273 | INSTALL_TEMPLATES+= ../../mk/haskell/INSTALL.in |
266 | DEINSTALL_TEMPLATES+= ../../mk/haskell/DEINSTALL.in | | 274 | DEINSTALL_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 |