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

Contents of /eclass/ruby-fakegem.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.30 - (hide annotations) (download)
Mon Aug 22 04:46:32 2011 UTC (3 years, 3 months ago) by vapier
Branch: MAIN
Changes since 1.29: +6 -9 lines
fix random bugs in eclass documentation, and convert to new @AUTHOR tag

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

  ViewVC Help
Powered by ViewVC 1.1.20