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

Contents of /eclass/ruby-fakegem.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.32 - (show 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 # Copyright 1999-2011 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.31 2011/10/21 06:32:29 graaff Exp $
4
5 # @ECLASS: ruby-fakegem.eclass
6 # @MAINTAINER:
7 # Ruby herd <ruby@gentoo.org>
8 # @AUTHOR:
9 # 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 # RUBY_FAKEGEM_TASK_DOC="rdoc"
32
33 # @ECLASS-VARIABLE: RUBY_FAKEGEM_TASK_TEST
34 # @DESCRIPTION:
35 # Specify the rake(1) task used for executing tests.
36 # 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
49 # @ECLASS-VARIABLE: RUBY_FAKEGEM_BINWRAP
50 # @DESCRIPTION:
51 # Binaries to wrap around (relative to the bin/ directory)
52 # RUBY_FAKEGEM_BINWRAP="*"
53
54 # @ECLASS-VARIABLE: RUBY_FAKEGEM_REQUIRE_PATHS
55 # @DESCRIPTION:
56 # Extra require paths (beside lib) to add to the specification
57 # RUBY_FAKEGEM_REQUIRE_PATHS=""
58
59 # @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 # @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 RUBY_FAKEGEM_NAME="${RUBY_FAKEGEM_NAME:-${PN}}"
72 RUBY_FAKEGEM_VERSION="${RUBY_FAKEGEM_VERSION:-${PV/_pre/.pre}}"
73 RUBY_FAKEGEM_SUFFIX="${RUBY_FAKEGEM_SUFFIX:-}"
74
75 RUBY_FAKEGEM_TASK_DOC="${RUBY_FAKEGEM_TASK_DOC-rdoc}"
76 RUBY_FAKEGEM_TASK_TEST="${RUBY_FAKEGEM_TASK_TEST-test}"
77
78 RUBY_FAKEGEM_BINWRAP="${RUBY_FAKEGEM_BINWRAP-*}"
79
80 if [[ ${RUBY_FAKEGEM_TASK_DOC} != "" ]]; then
81 IUSE="$IUSE doc"
82 ruby_add_bdepend "doc? ( dev-ruby/rake )"
83 fi
84
85 if [[ -n ${RUBY_FAKEGEM_DOCDIR} ]]; then
86 IUSE="$IUSE doc"
87 fi
88
89 if [[ ${RUBY_FAKEGEM_TASK_TEST} != "" ]]; then
90 IUSE="$IUSE test"
91 ruby_add_bdepend "test? ( dev-ruby/rake )"
92 fi
93
94 SRC_URI="mirror://rubygems/${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}${RUBY_FAKEGEM_SUFFIX:+-${RUBY_FAKEGEM_SUFFIX}}.gem"
95
96 ruby_add_bdepend virtual/rubygems
97 ruby_add_rdepend virtual/rubygems
98
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 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
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 # @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 ) || die "Unable to generate gemspec file."
169
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 # @FUNCTION: ruby_fakegem_genspec
195 # @USAGE: output-gemspec
196 # @DESCRIPTION:
197 # Generates a gemspec for the package and places it into the "specifications"
198 # directory of RubyGems.
199 # 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 # 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 # See RUBY_FAKEGEM_REQUIRE_PATHS for setting extra require paths.
207 ruby_fakegem_genspec() {
208 local required_paths="'lib'"
209 for path in ${RUBY_FAKEGEM_REQUIRE_PATHS}; do
210 required_paths="${required_paths}, '${path}'"
211 done
212
213 # 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 # generated by ruby-fakegem.eclass $Revision: 1.31 $
220 Gem::Specification.new do |s|
221 s.name = "${RUBY_FAKEGEM_NAME}"
222 s.version = "${RUBY_FAKEGEM_VERSION}"
223 s.summary = "${quoted_description}"
224 s.homepage = "${HOMEPAGE}"
225 s.require_paths = [${required_paths}]
226 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 local relativegembinary=${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}/bin/${gembinary}
240 local binpath=$(dirname $newbinary)
241 [[ ${binpath} = . ]] && binpath=/usr/bin
242
243 # 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 rubycmd="$(ruby_implementation_command ${implementation})"
256 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 cat - > "${T}"/gembin-wrapper-${gembinary} <<EOF
266 #!${rubycmd}
267 # This is a simplified version of the RubyGems wrapper
268 #
269 # Generated by ruby-fakegem.eclass $Revision: 1.31 $
270
271 require 'rubygems'
272
273 load Gem::default_path[-1] + "/gems/${relativegembinary}"
274
275 EOF
276
277 exeinto ${binpath:-/usr/bin}
278 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 for archive in ${A}; do
300 case "${archive}" in
301 *.gem)
302 # Make sure that we're not running unpack for more than
303 # 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 ebegin "Uncompressing metadata"
311 gunzip metadata.gz || die
312 eend $?
313
314 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
321 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 done
336 }
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 ${RUBY} ${rubyflags} -S rake ${RUBY_FAKEGEM_TASK_TEST} || die "tests failed"
351 }
352
353 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
362 # @FUNCTION: each_fakegem_install
363 # @DESCRIPTION:
364 # Install the package for each ruby target.
365 each_fakegem_install() {
366 ruby_fakegem_install_gemspec
367
368 local _gemlibdirs="${RUBY_FAKEGEM_EXTRAINSTALL}"
369 for directory in bin lib; do
370 [[ -d ${directory} ]] && _gemlibdirs="${_gemlibdirs} ${directory}"
371 done
372
373 [[ -n ${_gemlibdirs} ]] && \
374 ruby_fakegem_doins -r ${_gemlibdirs}
375 }
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 if [[ -n ${RUBY_FAKEGEM_DOCDIR} ]] && use doc; then
389 for dir in ${RUBY_FAKEGEM_DOCDIR}; do
390 [[ -d ${dir} ]] || continue
391
392 pushd ${dir} &>/dev/null
393 dohtml -r * || die "failed to install documentation"
394 popd &>/dev/null
395 done
396 fi
397
398 if [[ -n ${RUBY_FAKEGEM_EXTRADOC} ]]; then
399 dodoc ${RUBY_FAKEGEM_EXTRADOC} || die "failed to install further documentation"
400 fi
401
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 pushd "${bindir}" &>/dev/null
409 local binaries=$(eval ls ${RUBY_FAKEGEM_BINWRAP})
410 for binary in $binaries; do
411 ruby_fakegem_binwrapper $binary
412 done
413 popd &>/dev/null
414 fi
415 fi
416 }
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