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

Diff of /eclass/ruby-fakegem.eclass

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.20 Revision 1.32
1# Copyright 1999-2009 Gentoo Foundation 1# Copyright 1999-2011 Gentoo Foundation
2# Distributed under the terms of the GNU General Public License v2 2# Distributed under the terms of the GNU General Public License v2
3# $Header: /var/cvsroot/gentoo-x86/eclass/ruby-fakegem.eclass,v 1.20 2010/07/21 10:43:57 flameeyes Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/ruby-fakegem.eclass,v 1.32 2011/12/05 12:24:33 graaff Exp $
4# 4
5# @ECLASS: ruby-fakegem.eclass 5# @ECLASS: ruby-fakegem.eclass
6# @MAINTAINER: 6# @MAINTAINER:
7# Ruby herd <ruby@gentoo.org> 7# Ruby herd <ruby@gentoo.org>
8# 8# @AUTHOR:
9# Author: Diego E. Pettenò <flameeyes@gentoo.org> 9# Author: Diego E. Pettenò <flameeyes@gentoo.org>
10#
11# Author: Alex Legler <a3li@gentoo.org> 10# Author: Alex Legler <a3li@gentoo.org>
12#
13# @BLURB: An eclass for installing Ruby packages to behave like RubyGems. 11# @BLURB: An eclass for installing Ruby packages to behave like RubyGems.
14# @DESCRIPTION: 12# @DESCRIPTION:
15# This eclass allows to install arbitrary Ruby libraries (including Gems), 13# This eclass allows to install arbitrary Ruby libraries (including Gems),
16# providing integration into the RubyGems system even for "regular" packages. 14# providing integration into the RubyGems system even for "regular" packages.
17#
18 15
19inherit ruby-ng 16inherit ruby-ng
20 17
21# @ECLASS-VARIABLE: RUBY_FAKEGEM_NAME 18# @ECLASS-VARIABLE: RUBY_FAKEGEM_NAME
22# @DESCRIPTION: 19# @DESCRIPTION:
56 53
57# @ECLASS-VARIABLE: RUBY_FAKEGEM_REQUIRE_PATHS 54# @ECLASS-VARIABLE: RUBY_FAKEGEM_REQUIRE_PATHS
58# @DESCRIPTION: 55# @DESCRIPTION:
59# Extra require paths (beside lib) to add to the specification 56# Extra require paths (beside lib) to add to the specification
60# RUBY_FAKEGEM_REQUIRE_PATHS="" 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=""
61 70
62RUBY_FAKEGEM_NAME="${RUBY_FAKEGEM_NAME:-${PN}}" 71RUBY_FAKEGEM_NAME="${RUBY_FAKEGEM_NAME:-${PN}}"
63RUBY_FAKEGEM_VERSION="${RUBY_FAKEGEM_VERSION:-${PV/_pre/.pre}}" 72RUBY_FAKEGEM_VERSION="${RUBY_FAKEGEM_VERSION:-${PV/_pre/.pre}}"
64RUBY_FAKEGEM_SUFFIX="${RUBY_FAKEGEM_SUFFIX:-}" 73RUBY_FAKEGEM_SUFFIX="${RUBY_FAKEGEM_SUFFIX:-}"
65 74
71if [[ ${RUBY_FAKEGEM_TASK_DOC} != "" ]]; then 80if [[ ${RUBY_FAKEGEM_TASK_DOC} != "" ]]; then
72 IUSE="$IUSE doc" 81 IUSE="$IUSE doc"
73 ruby_add_bdepend "doc? ( dev-ruby/rake )" 82 ruby_add_bdepend "doc? ( dev-ruby/rake )"
74fi 83fi
75 84
85if [[ -n ${RUBY_FAKEGEM_DOCDIR} ]]; then
86 IUSE="$IUSE doc"
87fi
88
76if [[ ${RUBY_FAKEGEM_TASK_TEST} != "" ]]; then 89if [[ ${RUBY_FAKEGEM_TASK_TEST} != "" ]]; then
77 IUSE="$IUSE test" 90 IUSE="$IUSE test"
78 ruby_add_bdepend "test? ( dev-ruby/rake )" 91 ruby_add_bdepend "test? ( dev-ruby/rake )"
79fi 92fi
80 93
81SRC_URI="mirror://rubygems/${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}${RUBY_FAKEGEM_SUFFIX:+-${RUBY_FAKEGEM_SUFFIX}}.gem" 94SRC_URI="mirror://rubygems/${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}${RUBY_FAKEGEM_SUFFIX:+-${RUBY_FAKEGEM_SUFFIX}}.gem"
82 95
96ruby_add_bdepend virtual/rubygems
83ruby_add_rdepend virtual/rubygems 97ruby_add_rdepend virtual/rubygems
84 98
85# @FUNCTION: ruby_fakegem_gemsdir 99# @FUNCTION: ruby_fakegem_gemsdir
86# @RETURN: Returns the gem data directory 100# @RETURN: Returns the gem data directory
87# @DESCRIPTION: 101# @DESCRIPTION:
88# This function returns the gems data directory for the ruby 102# This function returns the gems data directory for the ruby
89# implementation in question. 103# implementation in question.
90ruby_fakegem_gemsdir() { 104ruby_fakegem_gemsdir() {
91 local _gemsitedir=$(${RUBY} -r rbconfig -e 'print Config::CONFIG["sitelibdir"]' | sed -e 's:site_ruby:gems:') 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}}
92 110
93 [[ -z ${_gemsitedir} ]] && { 111 [[ -z ${_gemsitedir} ]] && {
94 eerror "Unable to find the gems dir" 112 eerror "Unable to find the gems dir"
95 die "Unable to find the gems dir" 113 die "Unable to find the gems dir"
96 } 114 }
125 insinto $(ruby_fakegem_gemsdir)/gems/${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}${newdirname} 143 insinto $(ruby_fakegem_gemsdir)/gems/${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}${newdirname}
126 newins "$1" ${newbasename} 144 newins "$1" ${newbasename}
127 ) || die "failed $0 $@" 145 ) || die "failed $0 $@"
128} 146}
129 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.
153ruby_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.
180ruby_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.
190ruby_fakegem_metadata_gemspec() {
191 ${RUBY} -r yaml -e "puts Gem::Specification.from_yaml(File::open('$1').read).to_ruby" > $2
192}
193
130# @FUNCTION: ruby_fakegem_genspec 194# @FUNCTION: ruby_fakegem_genspec
195# @USAGE: output-gemspec
131# @DESCRIPTION: 196# @DESCRIPTION:
132# Generates a gemspec for the package and places it into the "specifications" 197# Generates a gemspec for the package and places it into the "specifications"
133# directory of RubyGems. 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.
134# In the gemspec, the following values are set: name, version, summary, 203# In the gemspec, the following values are set: name, version, summary,
135# homepage, and require_paths=["lib"]. 204# homepage, and require_paths=["lib"].
136# See RUBY_FAKEGEM_NAME and RUBY_FAKEGEM_VERSION for setting name and version. 205# See RUBY_FAKEGEM_NAME and RUBY_FAKEGEM_VERSION for setting name and version.
137# See RUBY_FAKEGEM_REQUIRE_PATHS for setting extra require paths. 206# See RUBY_FAKEGEM_REQUIRE_PATHS for setting extra require paths.
138ruby_fakegem_genspec() { 207ruby_fakegem_genspec() {
139 (
140 local required_paths="'lib'" 208 local required_paths="'lib'"
141 for path in ${RUBY_FAKEGEM_REQUIRE_PATHS}; do 209 for path in ${RUBY_FAKEGEM_REQUIRE_PATHS}; do
142 required_paths="${required_paths}, '${path}'" 210 required_paths="${required_paths}, '${path}'"
143 done 211 done
144 212
145 # We use the _ruby_implementation variable to avoid having stray 213 # We use the _ruby_implementation variable to avoid having stray
146 # copies with different implementations; while for now we're using 214 # copies with different implementations; while for now we're using
147 # the same exact content, we might have differences in the future, 215 # the same exact content, we might have differences in the future,
148 # so better taking this into consideration. 216 # so better taking this into consideration.
149 local quoted_description=${DESCRIPTION//\"/\\\"} 217 local quoted_description=${DESCRIPTION//\"/\\\"}
150 cat - > "${T}"/${RUBY_FAKEGEM_NAME}-${_ruby_implementation} <<EOF 218 cat - > $1 <<EOF
151# generated by ruby-fakegem.eclass $Revision: 1.20 $ 219# generated by ruby-fakegem.eclass $Revision: 1.32 $
152Gem::Specification.new do |s| 220Gem::Specification.new do |s|
153 s.name = "${RUBY_FAKEGEM_NAME}" 221 s.name = "${RUBY_FAKEGEM_NAME}"
154 s.version = "${RUBY_FAKEGEM_VERSION}" 222 s.version = "${RUBY_FAKEGEM_VERSION}"
155 s.summary = "${quoted_description}" 223 s.summary = "${quoted_description}"
156 s.homepage = "${HOMEPAGE}" 224 s.homepage = "${HOMEPAGE}"
157 s.require_paths = [${required_paths}] 225 s.require_paths = [${required_paths}]
158end 226end
159EOF 227EOF
160
161 insinto $(ruby_fakegem_gemsdir)/specifications
162 newins "${T}"/${RUBY_FAKEGEM_NAME}-${_ruby_implementation} ${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}.gemspec
163 ) || die "Unable to install fake gemspec"
164} 228}
165 229
166# @FUNCTION: ruby_fakegem_binwrapper 230# @FUNCTION: ruby_fakegem_binwrapper
167# @USAGE: command [path] 231# @USAGE: command [path]
168# @DESCRIPTION: 232# @DESCRIPTION:
186 for implementation in ${USE_RUBY}; do 250 for implementation in ${USE_RUBY}; do
187 # ignore non-enabled implementations 251 # ignore non-enabled implementations
188 use ruby_targets_${implementation} || continue 252 use ruby_targets_${implementation} || continue
189 if [ -z $rubycmd ]; then 253 if [ -z $rubycmd ]; then
190 # if no other implementation was set before, set it. 254 # if no other implementation was set before, set it.
191 rubycmd="/usr/bin/${implementation}" 255 rubycmd="$(ruby_implementation_command ${implementation})"
192 else 256 else
193 # if another implementation already arrived, then make 257 # if another implementation already arrived, then make
194 # it generic and break out of the loop. This ensures 258 # it generic and break out of the loop. This ensures
195 # that we do at most two iterations. 259 # that we do at most two iterations.
196 rubycmd="/usr/bin/env ruby" 260 rubycmd="/usr/bin/env ruby"
200 264
201 cat - > "${T}"/gembin-wrapper-${gembinary} <<EOF 265 cat - > "${T}"/gembin-wrapper-${gembinary} <<EOF
202#!${rubycmd} 266#!${rubycmd}
203# This is a simplified version of the RubyGems wrapper 267# This is a simplified version of the RubyGems wrapper
204# 268#
205# Generated by ruby-fakegem.eclass $Revision: 1.20 $ 269# Generated by ruby-fakegem.eclass $Revision: 1.32 $
206 270
207require 'rubygems' 271require 'rubygems'
208 272
209load Gem::default_path[-1] + "/gems/${relativegembinary}" 273load Gem::default_path[-1] + "/gems/${relativegembinary}"
210 274
231all_ruby_unpack() { 295all_ruby_unpack() {
232 # Special support for extracting .gem files; the file need to be 296 # Special support for extracting .gem files; the file need to be
233 # extracted twice and the mtime from the archive _has_ to be 297 # extracted twice and the mtime from the archive _has_ to be
234 # ignored (it's always set to epoch 0). 298 # ignored (it's always set to epoch 0).
235 for archive in ${A}; do 299 for archive in ${A}; do
236 if [[ ${archive} == *.gem ]]; then 300 case "${archive}" in
301 *.gem)
237 # Make sure that we're not running unoack for more than 302 # Make sure that we're not running unpack for more than
238 # one .gem file, since we won't support that at all. 303 # one .gem file, since we won't support that at all.
239 [[ -d "${S}" ]] && die "Unable to unpack ${archive}, ${S} exists" 304 [[ -d "${S}" ]] && die "Unable to unpack ${archive}, ${S} exists"
240 305
241 ebegin "Unpacking .gem file..." 306 ebegin "Unpacking .gem file..."
242 tar -mxf ${DISTDIR}/${archive} || die 307 tar -mxf ${DISTDIR}/${archive} || die
243 eend $? 308 eend $?
244 309
310 ebegin "Uncompressing metadata"
311 gunzip metadata.gz || die
312 eend $?
313
245 mkdir "${S}" 314 mkdir "${S}"
246 pushd "${S}" &>/dev/null 315 pushd "${S}" &>/dev/null
247 316
248 ebegin "Unpacking data.tar.gz" 317 ebegin "Unpacking data.tar.gz"
249 tar -mxf "${my_WORKDIR}"/data.tar.gz || die 318 tar -mxf "${my_WORKDIR}"/data.tar.gz || die
250 eend $? 319 eend $?
320
251 popd &>/dev/null 321 popd &>/dev/null
252 else 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 *)
253 unpack ${archive} 332 unpack ${archive}
254 fi 333 ;;
334 esac
255 done 335 done
256} 336}
257 337
258# @FUNCTION: all_ruby_compile 338# @FUNCTION: all_ruby_compile
259# @DESCRIPTION: 339# @DESCRIPTION:
281 361
282# @FUNCTION: each_fakegem_install 362# @FUNCTION: each_fakegem_install
283# @DESCRIPTION: 363# @DESCRIPTION:
284# Install the package for each ruby target. 364# Install the package for each ruby target.
285each_fakegem_install() { 365each_fakegem_install() {
286 ruby_fakegem_genspec 366 ruby_fakegem_install_gemspec
287 367
288 local _gemlibdirs="${RUBY_FAKEGEM_EXTRAINSTALL}" 368 local _gemlibdirs="${RUBY_FAKEGEM_EXTRAINSTALL}"
289 for directory in bin lib; do 369 for directory in bin lib; do
290 [[ -d ${directory} ]] && _gemlibdirs="${_gemlibdirs} ${directory}" 370 [[ -d ${directory} ]] && _gemlibdirs="${_gemlibdirs} ${directory}"
291 done 371 done

Legend:
Removed from v.1.20  
changed lines
  Added in v.1.32

  ViewVC Help
Powered by ViewVC 1.1.20