Fri Apr 18 13:42:59 2014 UTC ()
Some improvements and changes for Haskell Cabal support.
* HASKELL_ENABLE_LIBRARY_PROFILING and HASKELL_ENABLE_HADDOCK_DOCUMENTATION
  are "User-settable variables", not "Package-settable variables".
* Change to HASKELL_ENABLE_HADDOCK_DOCUMENTATION=yes by default.
* Add HASKELL_ENABLE_SHARED_LIBRARY("yes" by default), to enable shlib support.
* Add support for dynamically conditional PLIST entries handling for
  HASKELL_ENABLE_SHARED_LIBRARY and HASKELL_ENABLE_LIBRARY_PROFILING.

discussed with pho@ and szptvlfn@.


(obache)
diff -r1.1 -r1.2 pkgsrc/mk/haskell.mk
diff -r0 -r1.1 pkgsrc/mk/plist/plist-haskell.awk

cvs diff -r1.1 -r1.2 pkgsrc/mk/haskell.mk (expand / switch to unified diff)

--- pkgsrc/mk/haskell.mk 2014/02/05 07:02:30 1.1
+++ pkgsrc/mk/haskell.mk 2014/04/18 13:42:59 1.2
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1# $NetBSD: haskell.mk,v 1.1 2014/02/05 07:02:30 obache Exp $ 1# $NetBSD: haskell.mk,v 1.2 2014/04/18 13:42:59 obache Exp $
2# 2#
3# This Makefile fragment handles Haskell Cabal packages. 3# This Makefile fragment handles Haskell Cabal packages.
4# See: http://www.haskell.org/cabal/ 4# See: http://www.haskell.org/cabal/
5# 5#
6# Note to users: 6# Note to users:
7# 7#
8# * Users choose one favourite Haskell compiler. Though the only 8# * Users choose one favourite Haskell compiler. Though the only
9# compiler currently supported is GHC. 9# compiler currently supported is GHC.
10# 10#
11# * You can't install a cabal package for more than one compilers 11# * You can't install a cabal package for more than one compilers
12# simultaneously. In the future, this limitation can possibly be 12# simultaneously. In the future, this limitation can possibly be
13# eliminated using the method used by 13# eliminated using the method used by
14# "../../lang/python/pyversion.mk". 14# "../../lang/python/pyversion.mk".
@@ -46,148 +46,188 @@ @@ -46,148 +46,188 @@
46# package B was compiled. So the installed package B is 46# package B was compiled. So the installed package B is
47# completely broken at this time. 47# completely broken at this time.
48# 48#
49# User-settable variables: 49# User-settable variables:
50# 50#
51# HASKELL_COMPILER 51# HASKELL_COMPILER
52# Description: 52# Description:
53# The user's favourite Haskell compiler. 53# The user's favourite Haskell compiler.
54# Possible values: 54# Possible values:
55# ghc 55# ghc
56# Default value: 56# Default value:
57# ghc 57# ghc
58# 58#
59# Package-settable variables: 59# HASKELL_ENABLE_SHARED_LIBRARY
 60# Description:
 61# Whether shared library should be built or not.
 62# Possible values:
 63# yes, no
 64# Default value:
 65# yes
60# 66#
61# HASKELL_ENABLE_LIBRARY_PROFILING 67# HASKELL_ENABLE_LIBRARY_PROFILING
62# Description: 68# Description:
63# Whether profiling library should be built or not. 69# Whether profiling library should be built or not.
64# Possible values: 70# Possible values:
65# yes, no 71# yes, no
66# Default value: 72# Default value:
67# yes 73# yes
68# 74#
69# HASKELL_ENABLE_HADDOCK_DOCUMENTATION 75# HASKELL_ENABLE_HADDOCK_DOCUMENTATION
70# Description: 76# Description:
71# Whether haddock documentation should be built or not. 77# Whether haddock documentation should be built or not.
72# Possible values: 78# Possible values:
73# yes, no 79# yes, no
74# Default value: 80# Default value:
75# no 81# yes
76 82
77.if !defined(HASKELL_MK) 83.if !defined(HASKELL_MK)
78HASKELL_MK= # defined 84HASKELL_MK= # defined
79 85
80.include "../../mk/bsd.fast.prefs.mk" 86.include "../../mk/bsd.fast.prefs.mk"
81 87
82 88
83# Declare HASKELL_COMPILER as one of BUILD_DEFS variables. See 89# Declare HASKELL_COMPILER as one of BUILD_DEFS variables. See
84# ../../mk/misc/show.mk 90# ../../mk/misc/show.mk
85BUILD_DEFS+= HASKELL_COMPILER 91BUILD_DEFS+= HASKELL_COMPILER
 92BUILD_DEFS+= HASKELL_ENABLE_SHARED_LIBRARY
 93BUILD_DEFS+= HASKELL_ENABLE_LIBRARY_PROFILING
 94BUILD_DEFS+= HASKELL_ENABLE_HADDOCK_DOCUMENTATION
86 95
87 96
88# Declarations for ../../mk/misc/show.mk 97# Declarations for ../../mk/misc/show.mk
89_VARGROUPS+= haskell 98_VARGROUPS+= haskell
90_DEF_VARS.haskell= \ 99_DEF_VARS.haskell= \
91 _DISTBASE \ 100 _DISTBASE \
92 _DISTVERSION \ 101 _DISTVERSION \
93 _GHC_BIN \ 102 _GHC_BIN \
94 _GHC_PKG_BIN \ 103 _GHC_PKG_BIN \
95 _GHC_VERSION \ 104 _GHC_VERSION \
96 _GHC_VERSION_CMD \ 105 _GHC_VERSION_CMD \
97 _GHC_VERSION_FULL \ 106 _GHC_VERSION_FULL \
 107 _GHC_VERSION_SUFFIX \
98 _HASKELL_BIN \ 108 _HASKELL_BIN \
99 _HASKELL_PKG_BIN \ 109 _HASKELL_PKG_BIN \
100 _HASKELL_PKG_DESCR_FILE \ 110 _HASKELL_PKG_DESCR_FILE \
101 _HASKELL_VERSION 111 _HASKELL_VERSION \
102_PKG_VARS.haskell= \ 112 _HASKELL_VERSION_SUFFIX
 113_USER_VARS.haskell= \
 114 HASKELL_ENABLE_SHARED_LIBRARY \
103 HASKELL_ENABLE_LIBRARY_PROFILING \ 115 HASKELL_ENABLE_LIBRARY_PROFILING \
104 HASKELL_ENABLE_HADDOCK_DOCUMENTATION 116 HASKELL_ENABLE_HADDOCK_DOCUMENTATION
105 117
106# PKGNAME is usually named after DISTNAME. 118# PKGNAME is usually named after DISTNAME.
107PKGNAME?= hs-${DISTNAME} 119PKGNAME?= hs-${DISTNAME}
108 120
109# Default value of MASTER_SITES. 121# Default value of MASTER_SITES.
110_DISTBASE?= ${DISTNAME:C/-[^-]*$//} 122_DISTBASE?= ${DISTNAME:C/-[^-]*$//}
111_DISTVERSION?= ${DISTNAME:C/^.*-//} 123_DISTVERSION?= ${DISTNAME:C/^.*-//}
112MASTER_SITES?= ${MASTER_SITE_HASKELL_HACKAGE:=${DISTNAME}/} 124MASTER_SITES?= ${MASTER_SITE_HASKELL_HACKAGE:=${DISTNAME}/}
113 125
114# Default value of HOMEPAGE. 126# Default value of HOMEPAGE.
115HOMEPAGE?= http://hackage.haskell.org/cgi-bin/hackage-scripts/package/${_DISTBASE} 127HOMEPAGE?= http://hackage.haskell.org/cgi-bin/hackage-scripts/package/${_DISTBASE}
116 128
117# Cabal packages may use pkg-config, but url2pkg can't detect 129# Cabal packages may use pkg-config, but url2pkg can't detect
118# that. (PHO: I think that should be handled by url2pkg (2009-05-20)) 130# that. (PHO: I think that should be handled by url2pkg (2009-05-20))
119USE_TOOLS+= pkg-config 131USE_TOOLS+= pkg-config
120 132
 133# Default value of HASKELL_ENABLE_SHARED_LIBRARY
 134HASKELL_ENABLE_SHARED_LIBRARY?= yes
 135
121# Default value of HASKELL_ENABLE_LIBRARY_PROFILING 136# Default value of HASKELL_ENABLE_LIBRARY_PROFILING
122HASKELL_ENABLE_LIBRARY_PROFILING?= yes 137HASKELL_ENABLE_LIBRARY_PROFILING?= yes
123 138
124# Default value of HASKELL_ENABLE_HADDOCK_DOCUMENTATION 139# Default value of HASKELL_ENABLE_HADDOCK_DOCUMENTATION
125HASKELL_ENABLE_HADDOCK_DOCUMENTATION?= no 140HASKELL_ENABLE_HADDOCK_DOCUMENTATION?= yes
126 141
127# Compiler specific variables and targets. 142# Compiler specific variables and targets.
128.if ${HASKELL_COMPILER} == "ghc" 143.if ${HASKELL_COMPILER} == "ghc"
129 144
130# Add dependency to the GHC. 145# Add dependency to the GHC.
131.include "../../lang/ghc7/buildlink3.mk" 146.include "../../lang/ghc7/buildlink3.mk"
132 147
133# Tools 148# Tools
134_GHC_BIN= ${BUILDLINK_PREFIX.ghc}/bin/ghc 149_GHC_BIN= ${BUILDLINK_PREFIX.ghc}/bin/ghc
135_GHC_PKG_BIN= ${BUILDLINK_PREFIX.ghc}/bin/ghc-pkg 150_GHC_PKG_BIN= ${BUILDLINK_PREFIX.ghc}/bin/ghc-pkg
136_HASKELL_BIN= ${_GHC_BIN} # Expose to the outer scope. 151_HASKELL_BIN= ${_GHC_BIN} # Expose to the outer scope.
137_HASKELL_PKG_BIN= ${_GHC_PKG_BIN} # Expose to the outer scope. 152_HASKELL_PKG_BIN= ${_GHC_PKG_BIN} # Expose to the outer scope.
138 153
139# Determine GHC version. 154# Determine GHC version.
140_GHC_VERSION_CMD= ${_GHC_BIN} -V | ${CUT} -d ' ' -f 8 155_GHC_VERSION_CMD= ${_GHC_BIN} -V | ${CUT} -d ' ' -f 8
141_GHC_VERSION= ${_GHC_VERSION_CMD:sh} 156_GHC_VERSION= ${_GHC_VERSION_CMD:sh}
 157_GHC_VERSION_SUFFIX= ghc${_GHC_VERSION}
142_GHC_VERSION_FULL= ghc-${_GHC_VERSION} 158_GHC_VERSION_FULL= ghc-${_GHC_VERSION}
 159_HASKELL_VERSION_SUFFIX= ${_GHC_VERSION_SUFFIX}
143_HASKELL_VERSION= ${_GHC_VERSION_FULL} # Expose to the outer scope. 160_HASKELL_VERSION= ${_GHC_VERSION_FULL} # Expose to the outer scope.
144 161
 162# Determine GHC shlib suffix
 163_GHC_SHLIB_SUFFIX.dylib= dylib
 164_GHC_SHLIB_SUFFIX= ${_GHC_SHLIB_SUFFIX.${SHLIB_TYPE}:Uso}
 165_HASKELL_SHLIB_SUFFIX= ${_GHC_SHLIB_SUFFIX}
 166
145# GHC requires C compiler. 167# GHC requires C compiler.
146USE_LANGUAGES+= c 168USE_LANGUAGES+= c
147 169
148# Declarations for ../../mk/configure/configure.mk 170# Declarations for ../../mk/configure/configure.mk
149CONFIGURE_ARGS+= --ghc 171CONFIGURE_ARGS+= --ghc
150CONFIGURE_ARGS+= --with-compiler=${_GHC_BIN} 172CONFIGURE_ARGS+= --with-compiler=${_GHC_BIN}
151CONFIGURE_ARGS+= --with-hc-pkg=${_GHC_PKG_BIN} 173CONFIGURE_ARGS+= --with-hc-pkg=${_GHC_PKG_BIN}
152CONFIGURE_ARGS+= --prefix=${PREFIX} 174CONFIGURE_ARGS+= --prefix=${PREFIX}
153.endif # ${HASKELL_COMPILER} 175.endif # ${HASKELL_COMPILER}
154 176
 177# Shared libraries
 178.if ${HASKELL_ENABLE_SHARED_LIBRARY} == "yes"
 179CONFIGURE_ARGS+= --enable-shared --enable-executable-dynamic
 180CONFIGURE_ARGS+= "--ghc-option=-optl ${COMPILER_RPATH_FLAG}"
 181CONFIGURE_ARGS+= "--ghc-option=-optl ${PREFIX}/lib/${_GHC_VERSION_FULL}/${DISTNAME}"
 182.endif
 183
155# Library profiling 184# Library profiling
156PLIST_VARS+= prof 
157.if ${HASKELL_ENABLE_LIBRARY_PROFILING} == "yes" 185.if ${HASKELL_ENABLE_LIBRARY_PROFILING} == "yes"
158CONFIGURE_ARGS+= -p 186CONFIGURE_ARGS+= -p
159PLIST.prof= yes 
160.endif 187.endif
161 188
162 189
163# Haddock documentations 190# Haddock documentations
164PLIST_VARS+= doc 191PLIST_VARS+= doc
165.if ${HASKELL_ENABLE_HADDOCK_DOCUMENTATION} == "yes" 192.if ${HASKELL_ENABLE_HADDOCK_DOCUMENTATION} == "yes"
166CONFIGURE_ARGS+= --with-haddock=${BUILDLINK_PREFIX.ghc}/bin/haddock 193CONFIGURE_ARGS+= --with-haddock=${BUILDLINK_PREFIX.ghc}/bin/haddock
167PLIST.doc= yes 194PLIST.doc= yes
168.endif 195.endif
169 196
170# Optimization 197# Optimization
171CONFIGURE_ARGS+= -O2 198CONFIGURE_ARGS+= -O2
172 199
173# package.conf and package.conf.old should be ignored at all. 200# package.conf and package.conf.old should be ignored at all.
174PRINT_PLIST_AWK+= \ 201PRINT_PLIST_AWK+= \
175 /\/package\.conf(\.old)?$$/ { next; } 202 /\/package\.conf(\.old)?$$/ { next; }
176 203
177# _HASKELL_VERSION should be substituted in PLIST. 204# _HASKELL_VERSION should be substituted in PLIST.
178PLIST_SUBST+= HASKELL_VERSION=${_HASKELL_VERSION} 205PLIST_SUBST+= HASKELL_VERSION=${_HASKELL_VERSION}
 206PLIST_SUBST+= HASKELL_VERSION_SUFFIX=${_HASKELL_VERSION_SUFFIX}
179PRINT_PLIST_AWK+= \ 207PRINT_PLIST_AWK+= \
 208 ($$0 ~ /-${_HASKELL_VERSION_SUFFIX}\.${_HASKELL_SHLIB_SUFFIX}$$/) { next; } \
 209 ($$0 ~ /lib\/.*_p\.a$$/) { next; } \
 210 ($$0 ~ /\.dyn_hi$$/) { next; } \
 211 ($$0 ~ /\.p_hi$$/) { next; } \
 212 ($$0 ~ /^share\/doc\/${DISTNAME}\/html\//) \
 213 { $$0 = "$${PLIST.doc}" $$0; } \
 214 { gsub(/${_HASKELL_VERSION_SUFFIX}/, "$${HASKELL_VERSION_SUFFIX}"); } \
180 { gsub(/${_HASKELL_VERSION}/, "$${HASKELL_VERSION}"); } 215 { gsub(/${_HASKELL_VERSION}/, "$${HASKELL_VERSION}"); }
 216PLIST_AWK+= -f ${PKGSRCDIR}/mk/plist/plist-haskell.awk
 217PLIST_AWK_ENV+= HASKELL_VERSION_SUFFIX=${_HASKELL_VERSION_SUFFIX}
 218PLIST_AWK_ENV+= HASKELL_SHLIB_SUFFIX=${_HASKELL_SHLIB_SUFFIX}
 219PLIST_AWK_ENV+= HASKELL_ENABLE_SHARED_LIBRARY=${HASKELL_ENABLE_SHARED_LIBRARY}
 220PLIST_AWK_ENV+= HASKELL_ENABLE_LIBRARY_PROFILING=${HASKELL_ENABLE_LIBRARY_PROFILING}
181 221
182# We might not have any working Haskell interpreter so compile 222# We might not have any working Haskell interpreter so compile
183# Setup.?hs to a binary. 223# Setup.?hs to a binary.
184pre-configure: ${WRKSRC}/Setup 224pre-configure: ${WRKSRC}/Setup
185 225
186${WRKSRC}/Setup: 226${WRKSRC}/Setup:
187 ${RUN} cd ${WRKSRC} && \ 227 ${RUN} cd ${WRKSRC} && \
188 ${_HASKELL_BIN} --make Setup 228 ${_HASKELL_BIN} --make Setup
189 229
190# Define configure target. 230# Define configure target.
191do-configure: 231do-configure:
192 ${RUN} cd ${WRKSRC} && \ 232 ${RUN} cd ${WRKSRC} && \
193 ${SETENV} ${CONFIGURE_ENV} \ 233 ${SETENV} ${CONFIGURE_ENV} \

File Added: pkgsrc/mk/plist/plist-haskell.awk
# $NetBSD: plist-haskell.awk,v 1.1 2014/04/18 13:42:59 obache Exp $
#
# Copyright (c) 2014 The NetBSD Foundation, Inc.
# All rights reserved.
#
# This code is derived from software contributed to The NetBSD Foundation
# by Jonathan Perkin
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

### This awk script handles haskell related entries in PLISTs.  This script
### requires the following scripts to be included:
###
###     plist-functions.awk (print_entry)
###
### Certain environment variables must be set prior to running this script:
###
###   HASKELL_VERSION_SUFFIX is the haskell shlib version suffix.
###   HASKELL_SHLIB_SUFFIX is the haskell shlib suffix.
###   HASKELL_ENABLE_SHARED_LIBRARY is a yes/no variable indicating whether
###	shared library should be built or not.
###   HASKELL_ENABLE_LIBRARY_PROFILING is a yes/no variable indicating whether
###	profiling library should be built or not.
###
BEGIN {
	HASKELL_VERSION_SUFFIX = ENVIRON["HASKELL_VERSION_SUFFIX"]
	HASKELL_SHLIB_SUFFIX = ENVIRON["HASKELL_SHLIB_SUFFIX"]
	HASKELL_ENABLE_SHARED_LIBRARY = ENVIRON["HASKELL_ENABLE_SHARED_LIBRARY"]
	HASKELL_ENABLE_LIBRARY_PROFILING = ENVIRON["HASKELL_ENABLE_LIBRARY_PROFILING"]
}

###
### Convert .hi
###
/^[^@]/ && \
/^lib\/.*\.hi$/ {
	if (HASKELL_ENABLE_SHARED_LIBRARY ~ /[yY][eE][sS]/) {
		dyn_hi = $0;
		sub(/\.hi$/, ".dyn_hi", dyn_hi);
		print_entry(dyn_hi);
	}
	if (HASKELL_ENABLE_LIBRARY_PROFILING ~ /[yY][eE][sS]/) {
		p_hi = $0;
		sub(/\.hi$/, ".p_hi", p_hi);
		print_entry(p_hi);
	}
}

###
### Convert .a
###
/^[^@]/ && \
/^lib\/.*\/lib[^\/]*\.a$/ {
	if (HASKELL_ENABLE_SHARED_LIBRARY ~ /[yY][eE][sS]/) {
		dyn_ar = $0;
		sub(/\.a$/, "-" HASKELL_VERSION_SUFFIX "." HASKELL_SHLIB_SUFFIX, dyn_ar);
		print_entry(dyn_ar);
	}
	if (HASKELL_ENABLE_LIBRARY_PROFILING ~ /[yY][eE][sS]/) {
		p_ar = $0;
		sub(/\.a$/, "_p.a", p_ar);
		print_entry(p_ar);
	}
}