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

Contents of /eclass/ruby-fakegem.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.32 - (hide annotations) (download)
Mon Dec 5 12:24:33 2011 UTC (2 years, 9 months ago) by graaff
Branch: MAIN
Changes since 1.31: +10 -3 lines
Add documentation for RUBY_FAKEGEM_EXTRAINSTALL.

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

  ViewVC Help
Powered by ViewVC 1.1.20