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

Contents of /eclass/ruby-fakegem.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.30 - (show 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 # 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.29 2011/04/25 08:36:51 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 RUBY_FAKEGEM_NAME="${RUBY_FAKEGEM_NAME:-${PN}}"
65 RUBY_FAKEGEM_VERSION="${RUBY_FAKEGEM_VERSION:-${PV/_pre/.pre}}"
66 RUBY_FAKEGEM_SUFFIX="${RUBY_FAKEGEM_SUFFIX:-}"
67
68 RUBY_FAKEGEM_TASK_DOC="${RUBY_FAKEGEM_TASK_DOC-rdoc}"
69 RUBY_FAKEGEM_TASK_TEST="${RUBY_FAKEGEM_TASK_TEST-test}"
70
71 RUBY_FAKEGEM_BINWRAP="${RUBY_FAKEGEM_BINWRAP-*}"
72
73 if [[ ${RUBY_FAKEGEM_TASK_DOC} != "" ]]; then
74 IUSE="$IUSE doc"
75 ruby_add_bdepend "doc? ( dev-ruby/rake )"
76 fi
77
78 if [[ -n ${RUBY_FAKEGEM_DOCDIR} ]]; then
79 IUSE="$IUSE doc"
80 fi
81
82 if [[ ${RUBY_FAKEGEM_TASK_TEST} != "" ]]; then
83 IUSE="$IUSE test"
84 ruby_add_bdepend "test? ( dev-ruby/rake )"
85 fi
86
87 SRC_URI="mirror://rubygems/${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}${RUBY_FAKEGEM_SUFFIX:+-${RUBY_FAKEGEM_SUFFIX}}.gem"
88
89 ruby_add_bdepend dev-ruby/rubygems
90 ruby_add_rdepend dev-ruby/rubygems
91
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 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
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 # @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 ) || die "Unable to generate gemspec file."
162
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 # @FUNCTION: ruby_fakegem_genspec
188 # @USAGE: output-gemspec
189 # @DESCRIPTION:
190 # Generates a gemspec for the package and places it into the "specifications"
191 # directory of RubyGems.
192 # 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 # 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 # See RUBY_FAKEGEM_REQUIRE_PATHS for setting extra require paths.
200 ruby_fakegem_genspec() {
201 local required_paths="'lib'"
202 for path in ${RUBY_FAKEGEM_REQUIRE_PATHS}; do
203 required_paths="${required_paths}, '${path}'"
204 done
205
206 # 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 # generated by ruby-fakegem.eclass $Revision: 1.29 $
213 Gem::Specification.new do |s|
214 s.name = "${RUBY_FAKEGEM_NAME}"
215 s.version = "${RUBY_FAKEGEM_VERSION}"
216 s.summary = "${quoted_description}"
217 s.homepage = "${HOMEPAGE}"
218 s.require_paths = [${required_paths}]
219 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 local relativegembinary=${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}/bin/${gembinary}
233 local binpath=$(dirname $newbinary)
234 [[ ${binpath} = . ]] && binpath=/usr/bin
235
236 # 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 rubycmd="$(ruby_implementation_command ${implementation})"
249 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 cat - > "${T}"/gembin-wrapper-${gembinary} <<EOF
259 #!${rubycmd}
260 # This is a simplified version of the RubyGems wrapper
261 #
262 # Generated by ruby-fakegem.eclass $Revision: 1.29 $
263
264 require 'rubygems'
265
266 load Gem::default_path[-1] + "/gems/${relativegembinary}"
267
268 EOF
269
270 exeinto ${binpath:-/usr/bin}
271 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 for archive in ${A}; do
293 case "${archive}" in
294 *.gem)
295 # Make sure that we're not running unpack for more than
296 # 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 ebegin "Uncompressing metadata"
304 gunzip metadata.gz || die
305 eend $?
306
307 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
314 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 done
329 }
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 ${RUBY} ${rubyflags} -S rake ${RUBY_FAKEGEM_TASK_TEST} || die "tests failed"
344 }
345
346 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
355 # @FUNCTION: each_fakegem_install
356 # @DESCRIPTION:
357 # Install the package for each ruby target.
358 each_fakegem_install() {
359 ruby_fakegem_install_gemspec
360
361 local _gemlibdirs="${RUBY_FAKEGEM_EXTRAINSTALL}"
362 for directory in bin lib; do
363 [[ -d ${directory} ]] && _gemlibdirs="${_gemlibdirs} ${directory}"
364 done
365
366 [[ -n ${_gemlibdirs} ]] && \
367 ruby_fakegem_doins -r ${_gemlibdirs}
368 }
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 if [[ -n ${RUBY_FAKEGEM_DOCDIR} ]] && use doc; then
382 for dir in ${RUBY_FAKEGEM_DOCDIR}; do
383 [[ -d ${dir} ]] || continue
384
385 pushd ${dir} &>/dev/null
386 dohtml -r * || die "failed to install documentation"
387 popd &>/dev/null
388 done
389 fi
390
391 if [[ -n ${RUBY_FAKEGEM_EXTRADOC} ]]; then
392 dodoc ${RUBY_FAKEGEM_EXTRADOC} || die "failed to install further documentation"
393 fi
394
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 pushd "${bindir}" &>/dev/null
402 local binaries=$(eval ls ${RUBY_FAKEGEM_BINWRAP})
403 for binary in $binaries; do
404 ruby_fakegem_binwrapper $binary
405 done
406 popd &>/dev/null
407 fi
408 fi
409 }
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