/[gentoo-x86]/eclass/ghc-package.eclass
Gentoo

Contents of /eclass/ghc-package.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.30 - (hide annotations) (download)
Sun May 8 15:00:43 2011 UTC (2 years, 11 months ago) by slyfox
Branch: MAIN
Changes since 1.29: +15 -16 lines
speed up package deregistration, add 'ghc-supports-shared-libraries' helper

- 'pkg_prerm' could take up to minute in a loop of checking protected packages.
  We don't need to protect anything on modern ghc (6.12+)

- ghc-supports-shared-libraries returns success if installed ghc is able to
  build shared objects

1 slyfox 1.29 # Copyright 1999-2011 Gentoo Foundation
2 kosmikus 1.1 # Distributed under the terms of the GNU General Public License v2
3 slyfox 1.29 # $Header: /var/cvsroot/gentoo-x86/eclass/ghc-package.eclass,v 1.9 2005/04/08 01:13:39 araujo Exp $
4 kosmikus 1.1 #
5 slyfox 1.29 # @ECLASS: ghc-package.eclass
6     # @MAINTAINER:
7     # "Gentoo's Haskell Language team" <haskell@gentoo.org>
8 kosmikus 1.1 #
9 slyfox 1.29 # Original Author: Andres Loeh <kosmikus@gentoo.org>
10     #
11     # @BLURB: This eclass helps with the Glasgow Haskell Compiler's package configuration utility.
12     # @DESCRIPTION:
13     # Helper eclass to handle ghc installation/upgrade/deinstallation process.
14 kosmikus 1.1
15 kosmikus 1.6 inherit versionator
16    
17 slyfox 1.29 # @FUNCTION: ghc-getghc
18     # @DESCRIPTION:
19 kosmikus 1.1 # returns the name of the ghc executable
20     ghc-getghc() {
21 kosmikus 1.22 type -P ghc
22 kosmikus 1.1 }
23    
24 slyfox 1.29 # @FUNCTION: ghc-getghcpkg
25     # @DESCRIPTION:
26     # Internal function determines returns the name of the ghc-pkg executable
27 kosmikus 1.1 ghc-getghcpkg() {
28 kosmikus 1.22 type -P ghc-pkg
29 kosmikus 1.1 }
30    
31 slyfox 1.29 # @FUNCTION: ghc-getghcpkgbin
32     # @DESCRIPTION:
33 kosmikus 1.1 # returns the name of the ghc-pkg binary (ghc-pkg
34     # itself usually is a shell script, and we have to
35 kosmikus 1.6 # bypass the script under certain circumstances);
36 kosmikus 1.15 # for Cabal, we add an empty global package config file,
37     # because for some reason the global package file
38     # must be specified
39 kosmikus 1.1 ghc-getghcpkgbin() {
40 kolmodin 1.27 if version_is_at_least "6.10" "$(ghc-version)"; then
41     # the ghc-pkg executable changed name in ghc 6.10, as it no longer needs
42     # the wrapper script with the static flags
43     echo '[]' > "${T}/empty.conf"
44     echo "$(ghc-libdir)/ghc-pkg" "--global-conf=${T}/empty.conf"
45     elif ghc-cabal; then
46 kosmikus 1.15 echo '[]' > "${T}/empty.conf"
47     echo "$(ghc-libdir)/ghc-pkg.bin" "--global-conf=${T}/empty.conf"
48 kosmikus 1.6 else
49 kosmikus 1.15 echo "$(ghc-libdir)/ghc-pkg.bin"
50 kosmikus 1.6 fi
51 kosmikus 1.1 }
52    
53 slyfox 1.29 # @FUNCTION: ghc-version
54     # @DESCRIPTION:
55 kosmikus 1.1 # returns the version of ghc
56 kosmikus 1.6 _GHC_VERSION_CACHE=""
57 kosmikus 1.1 ghc-version() {
58 kosmikus 1.6 if [[ -z "${_GHC_VERSION_CACHE}" ]]; then
59 dcoutts 1.16 _GHC_VERSION_CACHE="$($(ghc-getghc) --numeric-version)"
60 kosmikus 1.6 fi
61     echo "${_GHC_VERSION_CACHE}"
62     }
63    
64 slyfox 1.29 # @FUNCTION: ghc-cabal
65     # @DESCRIPTION:
66 kosmikus 1.15 # this function can be used to determine if ghc itself
67     # uses the Cabal package format; it has nothing to do
68     # with the Cabal libraries ... ghc uses the Cabal package
69     # format since version 6.4
70 kosmikus 1.6 ghc-cabal() {
71     version_is_at_least "6.4" "$(ghc-version)"
72 kosmikus 1.1 }
73    
74 slyfox 1.29 # @FUNCTION: ghc-bestcabalversion
75     # @DESCRIPTION:
76 kosmikus 1.15 # return the best version of the Cabal library that is available
77     ghc-bestcabalversion() {
78     local cabalversion
79     if ghc-cabal; then
80 dcoutts 1.19 # We ask portage, not ghc, so that we only pick up
81     # portage-installed cabal versions.
82 dcoutts 1.23 cabalversion="$(ghc-extractportageversion dev-haskell/cabal)"
83 kosmikus 1.15 echo "Cabal-${cabalversion}"
84     else
85     # older ghc's don't support package versioning
86     echo Cabal
87     fi
88     }
89    
90 slyfox 1.29 # @FUNCTION: ghc-sanecabal
91     # @DESCRIPTION:
92 kosmikus 1.15 # check if a standalone Cabal version is available for the
93     # currently used ghc; takes minimal version of Cabal as
94     # an optional argument
95     ghc-sanecabal() {
96     local f
97     local version
98     if [[ -z "$1" ]]; then version="1.0.1"; else version="$1"; fi
99     for f in $(ghc-confdir)/cabal-*; do
100     [[ -f "${f}" ]] && version_is_at_least "${version}" "${f#*cabal-}" && return
101     done
102     return 1
103     }
104    
105 slyfox 1.29 # @FUNCTION: ghc-saneghc
106     # @DESCRIPTION:
107 dcoutts 1.23 # checks if ghc and ghc-bin are installed in the same version
108 swegener 1.26 # (if they're both installed); if this is not the case, we
109 dcoutts 1.23 # unfortunately cannot trust portage's dependency resolution
110     ghc-saneghc() {
111     local ghcversion
112     local ghcbinversion
113     if [[ "${PN}" == "ghc" || "${PN}" == "ghc-bin" ]]; then
114     return
115     fi
116     if has_version dev-lang/ghc && has_version dev-lang/ghc-bin; then
117     ghcversion="$(ghc-extractportageversion dev-lang/ghc)"
118     ghcbinversion="$(ghc-extractportageversion dev-lang/ghc-bin)"
119     if [[ "${ghcversion}" != "${ghcbinversion}" ]]; then
120     return 1
121     fi
122     fi
123     return
124     }
125    
126 slyfox 1.30 # @FUNCTION: ghc-supports-shared-libraries
127     # @DESCRIPTION:
128     # checks if ghc is built with support for building
129     # shared libraries (aka '-dynamic' option)
130     ghc-supports-shared-libraries() {
131     $(ghc-getghc) --info | grep "RTS ways" | grep -q "dyn"
132     }
133    
134 slyfox 1.29 # @FUNCTION: ghc-extractportageversion
135     # @DESCRIPTION:
136 dcoutts 1.23 # extract the version of a portage-installed package
137     ghc-extractportageversion() {
138     local pkg
139     local version
140     pkg="$(best_version $1)"
141     version="${pkg#$1-}"
142     version="${version%-r*}"
143     version="${version%_pre*}"
144     echo "${version}"
145     }
146    
147 slyfox 1.29 # @FUNCTION: ghc-libdir
148     # @DESCRIPTION:
149 kosmikus 1.1 # returns the library directory
150 kosmikus 1.6 _GHC_LIBDIR_CACHE=""
151 kosmikus 1.1 ghc-libdir() {
152 kosmikus 1.6 if [[ -z "${_GHC_LIBDIR_CACHE}" ]]; then
153     _GHC_LIBDIR_CACHE="$($(ghc-getghc) --print-libdir)"
154     fi
155     echo "${_GHC_LIBDIR_CACHE}"
156 kosmikus 1.1 }
157    
158 slyfox 1.29 # @FUNCTION: ghc-confdir
159     # @DESCRIPTION:
160 kosmikus 1.1 # returns the (Gentoo) library configuration directory
161     ghc-confdir() {
162 kosmikus 1.15 echo "$(ghc-libdir)/gentoo"
163 kosmikus 1.1 }
164    
165 slyfox 1.29 # @FUNCTION: ghc-localpkgconf
166     # @DESCRIPTION:
167 kosmikus 1.1 # returns the name of the local (package-specific)
168     # package configuration file
169     ghc-localpkgconf() {
170     echo "${PF}.conf"
171     }
172    
173 slyfox 1.29 # @FUNCTION: ghc-makeghcilib
174     # @DESCRIPTION:
175 kosmikus 1.3 # make a ghci foo.o file from a libfoo.a file
176     ghc-makeghcilib() {
177     local outfile
178     outfile="$(dirname $1)/$(basename $1 | sed 's:^lib\?\(.*\)\.a$:\1.o:')"
179 kosmikus 1.15 ld --relocatable --discard-all --output="${outfile}" --whole-archive "$1"
180     }
181    
182 slyfox 1.29 # @FUNCTION: ghc-makeghcilib
183     # @DESCRIPTION:
184 kosmikus 1.15 # tests if a ghc package exists
185     ghc-package-exists() {
186 kolmodin 1.27 local describe_flag
187     if version_is_at_least "6.4" "$(ghc-version)"; then
188     describe_flag="describe"
189     else
190     describe_flag="--show-package"
191     fi
192    
193     $(ghc-getghcpkg) "${describe_flag}" "$1" > /dev/null 2>&1
194 kosmikus 1.3 }
195    
196 slyfox 1.29 # @FUNCTION: ghc-setup-pkg
197     # @DESCRIPTION:
198 kosmikus 1.3 # creates a local (package-specific) package
199     # configuration file; the arguments should be
200     # uninstalled package description files, each
201     # containing a single package description; if
202     # no arguments are given, the resulting file is
203     # empty
204 kosmikus 1.1 ghc-setup-pkg() {
205 kosmikus 1.3 local localpkgconf
206     localpkgconf="${S}/$(ghc-localpkgconf)"
207 kosmikus 1.15 echo '[]' > "${localpkgconf}"
208 kolmodin 1.27 local update_flag
209     if version_is_at_least "6.4" "$(ghc-version)"; then
210     update_flag="update -"
211     else
212     update_flag="--update-package"
213     fi
214 dcoutts 1.10 for pkg in $*; do
215 kolmodin 1.27 $(ghc-getghcpkgbin) -f "${localpkgconf}" ${update_flag} --force \
216 kosmikus 1.15 < "${pkg}" || die "failed to register ${pkg}"
217 kosmikus 1.3 done
218 kosmikus 1.1 }
219    
220 slyfox 1.29 # @FUNCTION: ghc-fixlibpath
221     # @DESCRIPTION:
222 araujo 1.9 # fixes the library and import directories path
223     # of the package configuration file
224     ghc-fixlibpath() {
225 kosmikus 1.15 sed -i "s|$1|$(ghc-libdir)|g" "${S}/$(ghc-localpkgconf)"
226 araujo 1.9 if [[ -n "$2" ]]; then
227 kosmikus 1.15 sed -i "s|$2|$(ghc-libdir)/imports|g" "${S}/$(ghc-localpkgconf)"
228 araujo 1.9 fi
229     }
230    
231 slyfox 1.29 # @FUNCTION: ghc-install-pkg
232     # @DESCRIPTION:
233 kosmikus 1.1 # moves the local (package-specific) package configuration
234     # file to its final destination
235     ghc-install-pkg() {
236 kosmikus 1.15 mkdir -p "${D}/$(ghc-confdir)"
237     cat "${S}/$(ghc-localpkgconf)" | sed "s|${D}||g" \
238     > "${D}/$(ghc-confdir)/$(ghc-localpkgconf)"
239 kosmikus 1.1 }
240    
241 slyfox 1.29 # @FUNCTION: ghc-register-pkg
242     # @DESCRIPTION:
243 kosmikus 1.1 # registers all packages in the local (package-specific)
244     # package configuration file
245     ghc-register-pkg() {
246     local localpkgconf
247 kosmikus 1.3 localpkgconf="$(ghc-confdir)/$1"
248 kolmodin 1.27 local update_flag
249     local describe_flag
250     if version_is_at_least "6.4" "$(ghc-version)"; then
251     update_flag="update -"
252     describe_flag="describe"
253     else
254     update_flag="--update-package"
255     describe_flag="--show-package"
256     fi
257 kosmikus 1.15 if [[ -f "${localpkgconf}" ]]; then
258     for pkg in $(ghc-listpkg "${localpkgconf}"); do
259 kosmikus 1.8 ebegin "Registering ${pkg} "
260 kolmodin 1.27 $(ghc-getghcpkgbin) -f "${localpkgconf}" "${describe_flag}" "${pkg}" \
261     | $(ghc-getghcpkg) ${update_flag} --force > /dev/null
262 kosmikus 1.8 eend $?
263 kosmikus 1.7 done
264     fi
265 kosmikus 1.1 }
266    
267 slyfox 1.29 # @FUNCTION: ghc-reregister
268     # @DESCRIPTION:
269 kosmikus 1.1 # re-adds all available .conf files to the global
270     # package conf file, to be used on a ghc reinstallation
271     ghc-reregister() {
272 slyfox 1.29 has "${EAPI:-0}" 0 1 2 && ! use prefix && EPREFIX=
273 kosmikus 1.15 einfo "Re-adding packages (may cause several harmless warnings) ..."
274 slyfox 1.29 PATH="${EPREFIX}/usr/bin:${PATH}" CONFDIR="$(ghc-confdir)"
275 kolmodin 1.27 if [ -d "${CONFDIR}" ]; then
276     pushd "${CONFDIR}" > /dev/null
277 kosmikus 1.5 for conf in *.conf; do
278 slyfox 1.29 PATH="${EPREFIX}/usr/bin:${PATH}" ghc-register-pkg "${conf}"
279 kosmikus 1.5 done
280 kosmikus 1.8 popd > /dev/null
281 kosmikus 1.5 fi
282 kosmikus 1.1 }
283    
284 slyfox 1.29 # @FUNCTION: ghc-unregister-pkg
285     # @DESCRIPTION:
286 kosmikus 1.15 # unregisters a package configuration file
287     # protected are all packages that are still contained in
288     # another package configuration file
289 kosmikus 1.1 ghc-unregister-pkg() {
290     local localpkgconf
291 kosmikus 1.15 local i
292     local pkg
293 kolmodin 1.27 local unregister_flag
294 kosmikus 1.3 localpkgconf="$(ghc-confdir)/$1"
295 kosmikus 1.15
296 kolmodin 1.27 if version_is_at_least "6.4" "$(ghc-version)"; then
297     unregister_flag="unregister"
298     else
299     unregister_flag="--remove-package"
300     fi
301    
302 kosmikus 1.15 if [[ -f "${localpkgconf}" ]]; then
303 kosmikus 1.7 for pkg in $(ghc-reverse "$(ghc-listpkg ${localpkgconf})"); do
304 slyfox 1.30 if ! ghc-package-exists "${pkg}"; then
305     einfo "Package ${pkg} is not installed for ghc-$(ghc-version)."
306     else
307     ebegin "Unregistering ${pkg} "
308     $(ghc-getghcpkg) "${unregister_flag}" "${pkg}" --force > /dev/null
309     eend $?
310     fi
311 kosmikus 1.7 done
312     fi
313 kosmikus 1.1 }
314    
315 slyfox 1.29 # @FUNCTION: ghc-reverse
316     # @DESCRIPTION:
317 kosmikus 1.1 # help-function: reverse a list
318     ghc-reverse() {
319     local result
320 kosmikus 1.15 local i
321 kosmikus 1.1 for i in $1; do
322     result="${i} ${result}"
323     done
324 kosmikus 1.15 echo "${result}"
325     }
326    
327 slyfox 1.29 # @FUNCTION: ghc-elem
328     # @DESCRIPTION:
329 kosmikus 1.15 # help-function: element-check
330     ghc-elem() {
331     local i
332     for i in $2; do
333     [[ "$1" == "${i}" ]] && return 0
334     done
335     return 1
336 kosmikus 1.1 }
337    
338 slyfox 1.29 # @FUNCTION: ghc-listpkg
339     # @DESCRIPTION:
340 kosmikus 1.1 # show the packages in a package configuration file
341     ghc-listpkg() {
342 kosmikus 1.6 local ghcpkgcall
343 kosmikus 1.15 local i
344 kolmodin 1.28 local extra_flags
345     if version_is_at_least '6.12.3' "$(ghc-version)"; then
346     extra_flags="${extra_flags} -v0"
347     fi
348 kosmikus 1.15 for i in $*; do
349     if ghc-cabal; then
350 kolmodin 1.28 echo $($(ghc-getghcpkg) list ${extra_flags} -f "${i}") \
351 kosmikus 1.15 | sed \
352     -e "s|^.*${i}:\([^:]*\).*$|\1|" \
353     -e "s|/.*$||" \
354 dcoutts 1.25 -e "s|,| |g" -e "s|[(){}]||g"
355 kosmikus 1.15 else
356     echo $($(ghc-getghcpkgbin) -l -f "${i}") \
357     | cut -f2 -d':' \
358     | sed 's:,: :g'
359     fi
360     done
361 kosmikus 1.1 }
362    
363 slyfox 1.29 # @FUNCTION: ghc-package_pkg_setup
364     # @DESCRIPTION:
365 kolmodin 1.21 # exported function: check if we have a consistent ghc installation
366     ghc-package_pkg_setup() {
367 dcoutts 1.23 if ! ghc-saneghc; then
368     eerror "You have inconsistent versions of dev-lang/ghc and dev-lang/ghc-bin"
369     eerror "installed. Portage currently cannot work correctly with this setup."
370     eerror "There are several possibilities to work around this problem:"
371     eerror "(1) Up/downgrade ghc-bin to the same version as ghc."
372     eerror "(2) Unmerge ghc-bin."
373     eerror "(3) Unmerge ghc."
374     eerror "You probably want option 1 or 2."
375     die "Inconsistent versions of ghc and ghc-bin."
376     fi
377 kolmodin 1.21 }
378    
379 slyfox 1.29 # @FUNCTION: ghc-package_pkg_postinst
380     # @DESCRIPTION:
381 kosmikus 1.1 # exported function: registers the package-specific package
382     # configuration file
383     ghc-package_pkg_postinst() {
384 kosmikus 1.15 ghc-register-pkg "$(ghc-localpkgconf)"
385 kosmikus 1.1 }
386    
387 slyfox 1.29 # @FUNCTION: ghc-package_pkg_prerm
388     # @DESCRIPTION:
389 kosmikus 1.15 # exported function: unregisters the package-specific package
390     # configuration file; a package contained therein is unregistered
391     # only if it the same package is not also contained in another
392     # package configuration file ...
393 kosmikus 1.1 ghc-package_pkg_prerm() {
394 kosmikus 1.15 ghc-unregister-pkg "$(ghc-localpkgconf)"
395 kosmikus 1.1 }
396    
397 kolmodin 1.21 EXPORT_FUNCTIONS pkg_setup pkg_postinst pkg_prerm

  ViewVC Help
Powered by ViewVC 1.1.20