/[gentoo-x86]/eclass/ruby-fakegem.eclass
Gentoo

Contents of /eclass/ruby-fakegem.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.27 - (hide annotations) (download)
Tue Dec 28 12:07:15 2010 UTC (3 years, 7 months ago) by graaff
Branch: MAIN
Changes since 1.26: +76 -19 lines
Try to install the normal upstream gemspec file from either the gem metadata or the source gemspec file and use our own version only as a fallback.

1 a3li 1.1 # Copyright 1999-2009 Gentoo Foundation
2     # Distributed under the terms of the GNU General Public License v2
3 graaff 1.27 # $Header: /var/cvsroot/gentoo-x86/eclass/ruby-fakegem.eclass,v 1.26 2010/12/18 09:57:24 graaff Exp $
4 a3li 1.1 #
5     # @ECLASS: ruby-fakegem.eclass
6     # @MAINTAINER:
7     # Ruby herd <ruby@gentoo.org>
8     #
9     # Author: Diego E. Pettenò <flameeyes@gentoo.org>
10     #
11     # Author: Alex Legler <a3li@gentoo.org>
12     #
13     # @BLURB: An eclass for installing Ruby packages to behave like RubyGems.
14     # @DESCRIPTION:
15     # This eclass allows to install arbitrary Ruby libraries (including Gems),
16     # providing integration into the RubyGems system even for "regular" packages.
17     #
18    
19     inherit ruby-ng
20    
21     # @ECLASS-VARIABLE: RUBY_FAKEGEM_NAME
22     # @DESCRIPTION:
23     # Sets the Gem name for the generated fake gemspec.
24     # RUBY_FAKEGEM_NAME="${PN}"
25    
26     # @ECLASS-VARIABLE: RUBY_FAKEGEM_VERSION
27     # @DESCRIPTION:
28     # Sets the Gem version for the generated fake gemspec.
29     # RUBY_FAKEGEM_VERSION="${PV}"
30    
31     # @ECLASS-VARIABLE: RUBY_FAKEGEM_TASK_DOC
32     # @DESCRIPTION:
33     # Specify the rake(1) task to run to generate documentation.
34 flameeyes 1.4 # RUBY_FAKEGEM_TASK_DOC="rdoc"
35 a3li 1.1
36     # @ECLASS-VARIABLE: RUBY_FAKEGEM_TASK_TEST
37     # @DESCRIPTION:
38     # Specify the rake(1) task used for executing tests.
39 flameeyes 1.4 # RUBY_FAKEGEM_TASK_TEST="test"
40    
41     # @ECLASS-VARIABLE: RUBY_FAKEGEM_DOCDIR
42     # @DESCRIPTION:
43     # Specify the directory under which the documentation is built;
44     # if empty no documentation will be installed automatically.
45     # RUBY_FAKEGEM_DOCDIR=""
46    
47     # @ECLASS-VARIABLE: RUBY_FAKEGEM_EXTRADOC
48     # @DESCRIPTION:
49     # Extra documentation to install (readme, changelogs, …).
50     # RUBY_FAKEGEM_EXTRADOC=""
51 a3li 1.1
52 flameeyes 1.6 # @ECLASS-VARIABLE: RUBY_FAKEGEM_BINWRAP
53     # @DESCRIPTION:
54     # Binaries to wrap around (relative to the bin/ directory)
55     # RUBY_FAKEGEM_BINWRAP="*"
56    
57 flameeyes 1.8 # @ECLASS-VARIABLE: RUBY_FAKEGEM_REQUIRE_PATHS
58     # @DESCRIPTION:
59     # Extra require paths (beside lib) to add to the specification
60 flameeyes 1.10 # RUBY_FAKEGEM_REQUIRE_PATHS=""
61 flameeyes 1.8
62 graaff 1.27 # @ECLASS-VARIABLE: RUBY_FAKEGEM_GEMSPEC
63     # @DESCRIPTION:
64     # Filename of .gemspec file to install instead of generating a generic one.
65     # RUBY_FAKEGEM_GEMSPEC=""
66    
67 a3li 1.1 RUBY_FAKEGEM_NAME="${RUBY_FAKEGEM_NAME:-${PN}}"
68 flameeyes 1.15 RUBY_FAKEGEM_VERSION="${RUBY_FAKEGEM_VERSION:-${PV/_pre/.pre}}"
69     RUBY_FAKEGEM_SUFFIX="${RUBY_FAKEGEM_SUFFIX:-}"
70 a3li 1.1
71     RUBY_FAKEGEM_TASK_DOC="${RUBY_FAKEGEM_TASK_DOC-rdoc}"
72     RUBY_FAKEGEM_TASK_TEST="${RUBY_FAKEGEM_TASK_TEST-test}"
73    
74 flameeyes 1.6 RUBY_FAKEGEM_BINWRAP="${RUBY_FAKEGEM_BINWRAP-*}"
75    
76 a3li 1.1 if [[ ${RUBY_FAKEGEM_TASK_DOC} != "" ]]; then
77     IUSE="$IUSE doc"
78 flameeyes 1.18 ruby_add_bdepend "doc? ( dev-ruby/rake )"
79 a3li 1.1 fi
80    
81 flameeyes 1.21 if [[ -n ${RUBY_FAKEGEM_DOCDIR} ]]; then
82     IUSE="$IUSE doc"
83     fi
84    
85 a3li 1.1 if [[ ${RUBY_FAKEGEM_TASK_TEST} != "" ]]; then
86     IUSE="$IUSE test"
87 flameeyes 1.18 ruby_add_bdepend "test? ( dev-ruby/rake )"
88 a3li 1.1 fi
89    
90 flameeyes 1.15 SRC_URI="mirror://rubygems/${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}${RUBY_FAKEGEM_SUFFIX:+-${RUBY_FAKEGEM_SUFFIX}}.gem"
91 flameeyes 1.3
92 graaff 1.27 ruby_add_bdepend dev-ruby/rubygems
93 graaff 1.25 ruby_add_rdepend dev-ruby/rubygems
94 a3li 1.1
95     # @FUNCTION: ruby_fakegem_gemsdir
96     # @RETURN: Returns the gem data directory
97     # @DESCRIPTION:
98     # This function returns the gems data directory for the ruby
99     # implementation in question.
100     ruby_fakegem_gemsdir() {
101 grobian 1.24 has "${EAPI}" 2 && ! use prefix && EPREFIX=
102    
103     local _gemsitedir=$(ruby_rbconfig_value 'sitelibdir')
104     _gemsitedir=${_gemsitedir//site_ruby/gems}
105     _gemsitedir=${_gemsitedir#${EPREFIX}}
106 a3li 1.1
107     [[ -z ${_gemsitedir} ]] && {
108     eerror "Unable to find the gems dir"
109     die "Unable to find the gems dir"
110     }
111    
112     echo "${_gemsitedir}"
113     }
114    
115     # @FUNCTION: ruby_fakegem_doins
116     # @USAGE: file [file...]
117     # @DESCRIPTION:
118     # Installs the specified file(s) into the gems directory.
119     ruby_fakegem_doins() {
120     (
121     insinto $(ruby_fakegem_gemsdir)/gems/${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}
122     doins "$@"
123     ) || die "failed $0 $@"
124     }
125    
126     # @FUNCTION: ruby_fakegem_newsins()
127     # @USAGE: file filename
128     # @DESCRIPTION:
129     # Installs the specified file into the gems directory using the provided filename.
130     ruby_fakegem_newins() {
131     (
132     # Since newins does not accept full paths but just basenames
133     # for the target file, we want to extend it here.
134     local newdirname=/$(dirname "$2")
135     [[ ${newdirname} == "/." ]] && newdirname=
136    
137     local newbasename=$(basename "$2")
138    
139     insinto $(ruby_fakegem_gemsdir)/gems/${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}${newdirname}
140     newins "$1" ${newbasename}
141     ) || die "failed $0 $@"
142     }
143    
144 graaff 1.27 # @FUNCTION: ruby_fakegem_install_gemspec
145     # @DESCRIPTION:
146     # Install a .gemspec file for this package. Either use the file indicated
147     # by the RUBY_FAKEGEM_GEMSPEC variable, or generate one using
148     # ruby_fakegem_genspec.
149     ruby_fakegem_install_gemspec() {
150     local gemspec="${T}"/${RUBY_FAKEGEM_NAME}-${_ruby_implementation}
151    
152     (
153     if [[ ${RUBY_FAKEGEM_GEMSPEC} != "" ]]; then
154     ruby_fakegem_gemspec_gemspec ${RUBY_FAKEGEM_GEMSPEC} ${gemspec}
155     else
156     local metadata="${WORKDIR}"/${_ruby_implementation}/metadata
157    
158     if [[ -e ${metadata} ]]; then
159     ruby_fakegem_metadata_gemspec ${metadata} ${gemspec}
160     else
161     ruby_fakegem_genspec ${gemspec}
162     fi
163     fi
164     ) || "Unable to generate gemspec file."
165    
166     insinto $(ruby_fakegem_gemsdir)/specifications
167     newins ${gemspec} ${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}.gemspec || die "Unable to install gemspec file."
168     }
169    
170     # @FUNCTION: ruby_fakegem_gemspec_gemspec
171     # @USAGE: gemspec-input gemspec-output
172     # @DESCRIPTION:
173     # Generates an installable version of the specification indicated by
174     # RUBY_FAKEGEM_GEMSPEC. This file is eval'ed to produce a final specification
175     # in a way similar to packaging the gemspec file.
176     ruby_fakegem_gemspec_gemspec() {
177     ${RUBY} -e "puts eval(File::open('$1').read).to_ruby" > $2
178     }
179    
180     # @FUNCTION: ruby_fakegem_metadata_gemspec
181     # @USAGE: gemspec-metadata gemspec-output
182     # @DESCRIPTION:
183     # Generates an installable version of the specification indicated by
184     # the metadata distributed by the gem itself. This is similar to how
185     # rubygems creates an installation from a .gem file.
186     ruby_fakegem_metadata_gemspec() {
187     ${RUBY} -r yaml -e "puts Gem::Specification.from_yaml(File::open('$1').read).to_ruby" > $2
188     }
189    
190 a3li 1.1 # @FUNCTION: ruby_fakegem_genspec
191 graaff 1.27 # @USAGE: output-gemspec
192 a3li 1.1 # @DESCRIPTION:
193     # Generates a gemspec for the package and places it into the "specifications"
194     # directory of RubyGems.
195 graaff 1.27 # If the metadata normally distributed with a gem is present then that is
196     # used to generate the gemspec file.
197     #
198     # As a fallback we can generate our own version.
199 a3li 1.1 # In the gemspec, the following values are set: name, version, summary,
200     # homepage, and require_paths=["lib"].
201     # See RUBY_FAKEGEM_NAME and RUBY_FAKEGEM_VERSION for setting name and version.
202 flameeyes 1.8 # See RUBY_FAKEGEM_REQUIRE_PATHS for setting extra require paths.
203 a3li 1.1 ruby_fakegem_genspec() {
204 graaff 1.27 local required_paths="'lib'"
205     for path in ${RUBY_FAKEGEM_REQUIRE_PATHS}; do
206     required_paths="${required_paths}, '${path}'"
207     done
208 flameeyes 1.8
209 graaff 1.27 # We use the _ruby_implementation variable to avoid having stray
210     # copies with different implementations; while for now we're using
211     # the same exact content, we might have differences in the future,
212     # so better taking this into consideration.
213     local quoted_description=${DESCRIPTION//\"/\\\"}
214     cat - > $1 <<EOF
215     # generated by ruby-fakegem.eclass $Revision: 1.26 $
216 a3li 1.1 Gem::Specification.new do |s|
217     s.name = "${RUBY_FAKEGEM_NAME}"
218     s.version = "${RUBY_FAKEGEM_VERSION}"
219 graaff 1.14 s.summary = "${quoted_description}"
220 a3li 1.1 s.homepage = "${HOMEPAGE}"
221 flameeyes 1.8 s.require_paths = [${required_paths}]
222 a3li 1.1 end
223     EOF
224     }
225    
226     # @FUNCTION: ruby_fakegem_binwrapper
227     # @USAGE: command [path]
228     # @DESCRIPTION:
229     # Creates a new binary wrapper for a command installed by the RubyGem.
230     # path defaults to /usr/bin/$command
231     ruby_fakegem_binwrapper() {
232     (
233     local gembinary=$1
234     local newbinary=${2:-/usr/bin/$gembinary}
235 flameeyes 1.5 local relativegembinary=${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}/bin/${gembinary}
236 flameeyes 1.12 local binpath=$(dirname $newbinary)
237     [[ ${binpath} = . ]] && binpath=/usr/bin
238 a3li 1.1
239 flameeyes 1.16 # Try to find out whether the package is going to install for
240     # one or multiple implementations; if we're installing for a
241     # *single* implementation, no need to use “/usr/bin/env ruby”
242     # in the shebang, and we can actually avoid errors when
243     # calling the script by default (see for instance the
244     # JRuby-specific commands).
245     local rubycmd=
246     for implementation in ${USE_RUBY}; do
247     # ignore non-enabled implementations
248     use ruby_targets_${implementation} || continue
249     if [ -z $rubycmd ]; then
250     # if no other implementation was set before, set it.
251 flameeyes 1.23 rubycmd="$(ruby_implementation_command ${implementation})"
252 flameeyes 1.16 else
253     # if another implementation already arrived, then make
254     # it generic and break out of the loop. This ensures
255     # that we do at most two iterations.
256     rubycmd="/usr/bin/env ruby"
257     break
258     fi
259     done
260    
261 a3li 1.1 cat - > "${T}"/gembin-wrapper-${gembinary} <<EOF
262 flameeyes 1.16 #!${rubycmd}
263 a3li 1.1 # This is a simplified version of the RubyGems wrapper
264     #
265 graaff 1.27 # Generated by ruby-fakegem.eclass $Revision: 1.26 $
266 a3li 1.1
267     require 'rubygems'
268    
269 flameeyes 1.5 load Gem::default_path[-1] + "/gems/${relativegembinary}"
270 a3li 1.1
271     EOF
272    
273 flameeyes 1.12 exeinto ${binpath:-/usr/bin}
274 a3li 1.1 newexe "${T}"/gembin-wrapper-${gembinary} $(basename $newbinary)
275     ) || die "Unable to create fakegem wrapper"
276     }
277    
278     # @FUNCTION: all_fakegem_compile
279     # @DESCRIPTION:
280     # Build documentation for the package if indicated by the doc USE flag
281     # and if there is a documetation task defined.
282     all_fakegem_compile() {
283     if [[ ${RUBY_FAKEGEM_TASK_DOC} != "" ]] && use doc; then
284     rake ${RUBY_FAKEGEM_TASK_DOC} || die "failed to (re)build documentation"
285     fi
286     }
287    
288     # @FUNCTION: all_ruby_unpack
289     # @DESCRIPTION:
290     # Unpack the source archive, including support for unpacking gems.
291     all_ruby_unpack() {
292     # Special support for extracting .gem files; the file need to be
293     # extracted twice and the mtime from the archive _has_ to be
294     # ignored (it's always set to epoch 0).
295 flameeyes 1.19 for archive in ${A}; do
296 flameeyes 1.22 case "${archive}" in
297     *.gem)
298     # Make sure that we're not running unoack for more than
299     # one .gem file, since we won't support that at all.
300     [[ -d "${S}" ]] && die "Unable to unpack ${archive}, ${S} exists"
301    
302     ebegin "Unpacking .gem file..."
303     tar -mxf ${DISTDIR}/${archive} || die
304     eend $?
305    
306 graaff 1.27 ebegin "Uncompressing metadata"
307     gunzip metadata.gz || die
308     eend $?
309    
310 flameeyes 1.22 mkdir "${S}"
311     pushd "${S}" &>/dev/null
312    
313     ebegin "Unpacking data.tar.gz"
314     tar -mxf "${my_WORKDIR}"/data.tar.gz || die
315     eend $?
316 graaff 1.27
317 flameeyes 1.22 popd &>/dev/null
318     ;;
319     *.patch.bz2)
320     # We apply the patches with RUBY_PATCHES directly from DISTDIR,
321     # as the WORKDIR variable changes value between the global-scope
322     # and the time all_ruby_unpack/_prepare are called. Since we can
323     # simply decompress them when applying, this is much easier to
324     # deal with for us.
325     einfo "Keeping ${archive} as-is"
326     ;;
327     *)
328     unpack ${archive}
329     ;;
330     esac
331 flameeyes 1.19 done
332 a3li 1.1 }
333    
334     # @FUNCTION: all_ruby_compile
335     # @DESCRIPTION:
336     # Compile the package.
337     all_ruby_compile() {
338     all_fakegem_compile
339     }
340    
341     # @FUNCTION: each_fakegem_test
342     # @DESCRIPTION:
343     # Run tests for the package for each ruby target if the test task is defined.
344     each_fakegem_test() {
345     local rubyflags=
346 flameeyes 1.13 ${RUBY} ${rubyflags} -S rake ${RUBY_FAKEGEM_TASK_TEST} || die "tests failed"
347 a3li 1.1 }
348    
349 flameeyes 1.13 if [[ ${RUBY_FAKEGEM_TASK_TEST} != "" ]]; then
350     # @FUNCTION: each_ruby_test
351     # @DESCRIPTION:
352     # Run the tests for this package.
353     each_ruby_test() {
354     each_fakegem_test
355     }
356     fi
357 a3li 1.1
358     # @FUNCTION: each_fakegem_install
359     # @DESCRIPTION:
360     # Install the package for each ruby target.
361     each_fakegem_install() {
362 graaff 1.27 ruby_fakegem_install_gemspec
363 a3li 1.1
364 flameeyes 1.11 local _gemlibdirs="${RUBY_FAKEGEM_EXTRAINSTALL}"
365     for directory in bin lib; do
366 a3li 1.1 [[ -d ${directory} ]] && _gemlibdirs="${_gemlibdirs} ${directory}"
367     done
368    
369 flameeyes 1.9 [[ -n ${_gemlibdirs} ]] && \
370     ruby_fakegem_doins -r ${_gemlibdirs}
371 a3li 1.1 }
372    
373     # @FUNCTION: each_ruby_install
374     # @DESCRIPTION:
375     # Install the package for each target.
376     each_ruby_install() {
377     each_fakegem_install
378     }
379    
380     # @FUNCTION: all_fakegem_install
381     # @DESCRIPTION:
382     # Install files common to all ruby targets.
383     all_fakegem_install() {
384 flameeyes 1.20 if [[ -n ${RUBY_FAKEGEM_DOCDIR} ]] && use doc; then
385 flameeyes 1.7 for dir in ${RUBY_FAKEGEM_DOCDIR}; do
386 flameeyes 1.20 [[ -d ${dir} ]] || continue
387    
388 flameeyes 1.11 pushd ${dir} &>/dev/null
389 flameeyes 1.7 dohtml -r * || die "failed to install documentation"
390 flameeyes 1.11 popd &>/dev/null
391 flameeyes 1.7 done
392 a3li 1.1 fi
393    
394     if [[ -n ${RUBY_FAKEGEM_EXTRADOC} ]]; then
395     dodoc ${RUBY_FAKEGEM_EXTRADOC} || die "failed to install further documentation"
396     fi
397 flameeyes 1.6
398     # binary wrappers; we assume that all the implementations get the
399     # same binaries, or something is wrong anyway, so...
400     if [[ -n ${RUBY_FAKEGEM_BINWRAP} ]]; then
401     local bindir=$(find "${D}" -type d -path "*/gems/${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}/bin" -print -quit)
402    
403     if [[ -d "${bindir}" ]]; then
404 flameeyes 1.11 pushd "${bindir}" &>/dev/null
405 flameeyes 1.6 local binaries=$(eval ls ${RUBY_FAKEGEM_BINWRAP})
406     for binary in $binaries; do
407     ruby_fakegem_binwrapper $binary
408     done
409 flameeyes 1.11 popd &>/dev/null
410 flameeyes 1.6 fi
411     fi
412 a3li 1.1 }
413    
414     # @FUNCTION: all_ruby_install
415     # @DESCRIPTION:
416     # Install files common to all ruby targets.
417     all_ruby_install() {
418     all_fakegem_install
419     }

  ViewVC Help
Powered by ViewVC 1.1.20