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

Contents of /eclass/ruby-fakegem.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.27 - (show annotations) (download)
Tue Dec 28 12:07:15 2010 UTC (3 years, 6 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 # Copyright 1999-2009 Gentoo Foundation
2 # Distributed under the terms of the GNU General Public License v2
3 # $Header: /var/cvsroot/gentoo-x86/eclass/ruby-fakegem.eclass,v 1.26 2010/12/18 09:57:24 graaff Exp $
4 #
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 # RUBY_FAKEGEM_TASK_DOC="rdoc"
35
36 # @ECLASS-VARIABLE: RUBY_FAKEGEM_TASK_TEST
37 # @DESCRIPTION:
38 # Specify the rake(1) task used for executing tests.
39 # 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
52 # @ECLASS-VARIABLE: RUBY_FAKEGEM_BINWRAP
53 # @DESCRIPTION:
54 # Binaries to wrap around (relative to the bin/ directory)
55 # RUBY_FAKEGEM_BINWRAP="*"
56
57 # @ECLASS-VARIABLE: RUBY_FAKEGEM_REQUIRE_PATHS
58 # @DESCRIPTION:
59 # Extra require paths (beside lib) to add to the specification
60 # RUBY_FAKEGEM_REQUIRE_PATHS=""
61
62 # @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 RUBY_FAKEGEM_NAME="${RUBY_FAKEGEM_NAME:-${PN}}"
68 RUBY_FAKEGEM_VERSION="${RUBY_FAKEGEM_VERSION:-${PV/_pre/.pre}}"
69 RUBY_FAKEGEM_SUFFIX="${RUBY_FAKEGEM_SUFFIX:-}"
70
71 RUBY_FAKEGEM_TASK_DOC="${RUBY_FAKEGEM_TASK_DOC-rdoc}"
72 RUBY_FAKEGEM_TASK_TEST="${RUBY_FAKEGEM_TASK_TEST-test}"
73
74 RUBY_FAKEGEM_BINWRAP="${RUBY_FAKEGEM_BINWRAP-*}"
75
76 if [[ ${RUBY_FAKEGEM_TASK_DOC} != "" ]]; then
77 IUSE="$IUSE doc"
78 ruby_add_bdepend "doc? ( dev-ruby/rake )"
79 fi
80
81 if [[ -n ${RUBY_FAKEGEM_DOCDIR} ]]; then
82 IUSE="$IUSE doc"
83 fi
84
85 if [[ ${RUBY_FAKEGEM_TASK_TEST} != "" ]]; then
86 IUSE="$IUSE test"
87 ruby_add_bdepend "test? ( dev-ruby/rake )"
88 fi
89
90 SRC_URI="mirror://rubygems/${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}${RUBY_FAKEGEM_SUFFIX:+-${RUBY_FAKEGEM_SUFFIX}}.gem"
91
92 ruby_add_bdepend dev-ruby/rubygems
93 ruby_add_rdepend dev-ruby/rubygems
94
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 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
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 # @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 # @FUNCTION: ruby_fakegem_genspec
191 # @USAGE: output-gemspec
192 # @DESCRIPTION:
193 # Generates a gemspec for the package and places it into the "specifications"
194 # directory of RubyGems.
195 # 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 # 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 # See RUBY_FAKEGEM_REQUIRE_PATHS for setting extra require paths.
203 ruby_fakegem_genspec() {
204 local required_paths="'lib'"
205 for path in ${RUBY_FAKEGEM_REQUIRE_PATHS}; do
206 required_paths="${required_paths}, '${path}'"
207 done
208
209 # 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 Gem::Specification.new do |s|
217 s.name = "${RUBY_FAKEGEM_NAME}"
218 s.version = "${RUBY_FAKEGEM_VERSION}"
219 s.summary = "${quoted_description}"
220 s.homepage = "${HOMEPAGE}"
221 s.require_paths = [${required_paths}]
222 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 local relativegembinary=${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}/bin/${gembinary}
236 local binpath=$(dirname $newbinary)
237 [[ ${binpath} = . ]] && binpath=/usr/bin
238
239 # 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 rubycmd="$(ruby_implementation_command ${implementation})"
252 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 cat - > "${T}"/gembin-wrapper-${gembinary} <<EOF
262 #!${rubycmd}
263 # This is a simplified version of the RubyGems wrapper
264 #
265 # Generated by ruby-fakegem.eclass $Revision: 1.26 $
266
267 require 'rubygems'
268
269 load Gem::default_path[-1] + "/gems/${relativegembinary}"
270
271 EOF
272
273 exeinto ${binpath:-/usr/bin}
274 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 for archive in ${A}; do
296 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 ebegin "Uncompressing metadata"
307 gunzip metadata.gz || die
308 eend $?
309
310 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
317 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 done
332 }
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 ${RUBY} ${rubyflags} -S rake ${RUBY_FAKEGEM_TASK_TEST} || die "tests failed"
347 }
348
349 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
358 # @FUNCTION: each_fakegem_install
359 # @DESCRIPTION:
360 # Install the package for each ruby target.
361 each_fakegem_install() {
362 ruby_fakegem_install_gemspec
363
364 local _gemlibdirs="${RUBY_FAKEGEM_EXTRAINSTALL}"
365 for directory in bin lib; do
366 [[ -d ${directory} ]] && _gemlibdirs="${_gemlibdirs} ${directory}"
367 done
368
369 [[ -n ${_gemlibdirs} ]] && \
370 ruby_fakegem_doins -r ${_gemlibdirs}
371 }
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 if [[ -n ${RUBY_FAKEGEM_DOCDIR} ]] && use doc; then
385 for dir in ${RUBY_FAKEGEM_DOCDIR}; do
386 [[ -d ${dir} ]] || continue
387
388 pushd ${dir} &>/dev/null
389 dohtml -r * || die "failed to install documentation"
390 popd &>/dev/null
391 done
392 fi
393
394 if [[ -n ${RUBY_FAKEGEM_EXTRADOC} ]]; then
395 dodoc ${RUBY_FAKEGEM_EXTRADOC} || die "failed to install further documentation"
396 fi
397
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 pushd "${bindir}" &>/dev/null
405 local binaries=$(eval ls ${RUBY_FAKEGEM_BINWRAP})
406 for binary in $binaries; do
407 ruby_fakegem_binwrapper $binary
408 done
409 popd &>/dev/null
410 fi
411 fi
412 }
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