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

Contents of /eclass/ruby-fakegem.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.4 - (hide annotations) (download)
Tue Dec 15 17:43:51 2009 UTC (4 years, 8 months ago) by flameeyes
Branch: MAIN
Changes since 1.3: +14 -3 lines
Fix and extend documentation.

1 a3li 1.1 # Copyright 1999-2009 Gentoo Foundation
2     # Distributed under the terms of the GNU General Public License v2
3 flameeyes 1.4 # $Header: /var/cvsroot/gentoo-x86/eclass/ruby-fakegem.eclass,v 1.3 2009/12/15 16:27:46 flameeyes Exp $
4 a3li 1.1 #
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 flameeyes 1.4 # RUBY_FAKEGEM_TASK_DOC="rdoc"
35 a3li 1.1
36     # @ECLASS-VARIABLE: RUBY_FAKEGEM_TASK_TEST
37     # @DESCRIPTION:
38     # Specify the rake(1) task used for executing tests.
39 flameeyes 1.4 # 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 a3li 1.1
52     RUBY_FAKEGEM_NAME="${RUBY_FAKEGEM_NAME:-${PN}}"
53     RUBY_FAKEGEM_VERSION="${RUBY_FAKEGEM_VERSION:-${PV}}"
54    
55     RUBY_FAKEGEM_TASK_DOC="${RUBY_FAKEGEM_TASK_DOC-rdoc}"
56     RUBY_FAKEGEM_TASK_TEST="${RUBY_FAKEGEM_TASK_TEST-test}"
57    
58     if [[ ${RUBY_FAKEGEM_TASK_DOC} != "" ]]; then
59     IUSE="$IUSE doc"
60     ruby_add_bdepend doc "dev-ruby/rake"
61     fi
62    
63     if [[ ${RUBY_FAKEGEM_TASK_TEST} != "" ]]; then
64     IUSE="$IUSE test"
65     ruby_add_bdepend test "dev-ruby/rake"
66     fi
67    
68 flameeyes 1.3 SRC_URI="mirror://rubygems/${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}.gem"
69    
70 a3li 1.1 ruby_add_rdepend virtual/rubygems
71    
72     # @FUNCTION: ruby_fakegem_gemsdir
73     # @RETURN: Returns the gem data directory
74     # @DESCRIPTION:
75     # This function returns the gems data directory for the ruby
76     # implementation in question.
77     ruby_fakegem_gemsdir() {
78     local _gemsitedir=$(${RUBY} -r rbconfig -e 'print Config::CONFIG["sitelibdir"]' | sed -e 's:site_ruby:gems:')
79    
80     [[ -z ${_gemsitedir} ]] && {
81     eerror "Unable to find the gems dir"
82     die "Unable to find the gems dir"
83     }
84    
85     echo "${_gemsitedir}"
86     }
87    
88     # @FUNCTION: ruby_fakegem_doins
89     # @USAGE: file [file...]
90     # @DESCRIPTION:
91     # Installs the specified file(s) into the gems directory.
92     ruby_fakegem_doins() {
93     (
94     insinto $(ruby_fakegem_gemsdir)/gems/${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}
95     doins "$@"
96     ) || die "failed $0 $@"
97     }
98    
99     # @FUNCTION: ruby_fakegem_newsins()
100     # @USAGE: file filename
101     # @DESCRIPTION:
102     # Installs the specified file into the gems directory using the provided filename.
103     ruby_fakegem_newins() {
104     (
105     # Since newins does not accept full paths but just basenames
106     # for the target file, we want to extend it here.
107     local newdirname=/$(dirname "$2")
108     [[ ${newdirname} == "/." ]] && newdirname=
109    
110     local newbasename=$(basename "$2")
111    
112     insinto $(ruby_fakegem_gemsdir)/gems/${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}${newdirname}
113     newins "$1" ${newbasename}
114     ) || die "failed $0 $@"
115     }
116    
117     # @FUNCTION: ruby_fakegem_genspec
118     # @DESCRIPTION:
119     # Generates a gemspec for the package and places it into the "specifications"
120     # directory of RubyGems.
121     # In the gemspec, the following values are set: name, version, summary,
122     # homepage, and require_paths=["lib"].
123     # See RUBY_FAKEGEM_NAME and RUBY_FAKEGEM_VERSION for setting name and version.
124     ruby_fakegem_genspec() {
125     (
126     # We use the _ruby_implementation variable to avoid having stray
127     # copies with different implementations; while for now we're using
128     # the same exact content, we might have differences in the future,
129     # so better taking this into consideration.
130     cat - > "${T}"/${RUBY_FAKEGEM_NAME}-${_ruby_implementation} <<EOF
131     Gem::Specification.new do |s|
132     s.name = "${RUBY_FAKEGEM_NAME}"
133     s.version = "${RUBY_FAKEGEM_VERSION}"
134     s.summary = "${DESCRIPTION}"
135     s.homepage = "${HOMEPAGE}"
136     s.require_paths = ["lib"]
137     end
138     EOF
139    
140     insinto $(ruby_fakegem_gemsdir)/specifications
141     newins "${T}"/${RUBY_FAKEGEM_NAME}-${_ruby_implementation} ${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}.gemspec
142     ) || die "Unable to install fake gemspec"
143     }
144    
145     # @FUNCTION: ruby_fakegem_binwrapper
146     # @USAGE: command [path]
147     # @DESCRIPTION:
148     # Creates a new binary wrapper for a command installed by the RubyGem.
149     # path defaults to /usr/bin/$command
150     ruby_fakegem_binwrapper() {
151     (
152     local gembinary=$1
153     local newbinary=${2:-/usr/bin/$gembinary}
154    
155     cat - > "${T}"/gembin-wrapper-${gembinary} <<EOF
156     #!/usr/bin/env ruby
157     # This is a simplified version of the RubyGems wrapper
158     #
159     # Generated by ruby-fakegem.eclass
160    
161     require 'rubygems'
162    
163     load Gem::GemPathSearcher.new.find('$(tr [A-Z] [a-z] <<< ${RUBY_FAKEGEM_NAME})').full_gem_path + "/bin/${gembinary}"
164    
165     EOF
166    
167     exeinto $(dirname $newbinary)
168     newexe "${T}"/gembin-wrapper-${gembinary} $(basename $newbinary)
169     ) || die "Unable to create fakegem wrapper"
170     }
171    
172     # @FUNCTION: all_fakegem_compile
173     # @DESCRIPTION:
174     # Build documentation for the package if indicated by the doc USE flag
175     # and if there is a documetation task defined.
176     all_fakegem_compile() {
177     if [[ ${RUBY_FAKEGEM_TASK_DOC} != "" ]] && use doc; then
178     rake ${RUBY_FAKEGEM_TASK_DOC} || die "failed to (re)build documentation"
179     fi
180     }
181    
182     # @FUNCTION: all_ruby_unpack
183     # @DESCRIPTION:
184     # Unpack the source archive, including support for unpacking gems.
185     all_ruby_unpack() {
186     # Special support for extracting .gem files; the file need to be
187     # extracted twice and the mtime from the archive _has_ to be
188     # ignored (it's always set to epoch 0).
189     #
190     # This only works if there is exactly one archive and that archive
191     # is a .gem file!
192     if [[ $(wc -w <<< ${A}) == 1 ]] &&
193     [[ ${A} == *.gem ]]; then
194     ebegin "Unpacking .gem file..."
195     tar -mxf ${DISTDIR}/${A} || die
196     eend $?
197    
198     mkdir "${S}"
199     pushd "${S}"
200    
201     ebegin "Unpacking data.tar.gz"
202     tar -mxf "${my_WORKDIR}"/data.tar.gz || die
203     eend $?
204     else
205     [[ -n ${A} ]] && unpack ${A}
206     fi
207     }
208    
209     # @FUNCTION: all_ruby_compile
210     # @DESCRIPTION:
211     # Compile the package.
212     all_ruby_compile() {
213     all_fakegem_compile
214     }
215    
216     # @FUNCTION: each_fakegem_test
217     # @DESCRIPTION:
218     # Run tests for the package for each ruby target if the test task is defined.
219     each_fakegem_test() {
220     local rubyflags=
221    
222     if [[ ${RUBY_FAKEGEM_TASK_TEST} != "" ]]; then
223     ${RUBY} ${rubyflags} -S rake ${RUBY_FAKEGEM_TASK_TEST} || die "tests failed"
224     else
225     echo "No test task defined, skipping tests."
226     fi
227     }
228    
229     # @FUNCTION: each_ruby_test
230     # @DESCRIPTION:
231     # Run the tests for this package.
232     each_ruby_test() {
233     each_fakegem_test
234     }
235    
236     # @FUNCTION: each_fakegem_install
237     # @DESCRIPTION:
238     # Install the package for each ruby target.
239     each_fakegem_install() {
240     ruby_fakegem_genspec
241    
242     local _gemlibdirs=
243     for directory in bin lib ${RUBY_FAKEGEM_EXTRAINSTALL}; do
244     [[ -d ${directory} ]] && _gemlibdirs="${_gemlibdirs} ${directory}"
245     done
246    
247     ruby_fakegem_doins -r ${_gemlibdirs}
248     }
249    
250     # @FUNCTION: each_ruby_install
251     # @DESCRIPTION:
252     # Install the package for each target.
253     each_ruby_install() {
254     each_fakegem_install
255     }
256    
257     # @FUNCTION: all_fakegem_install
258     # @DESCRIPTION:
259     # Install files common to all ruby targets.
260     all_fakegem_install() {
261     if [[ -n ${RUBY_FAKEGEM_DOCDIR} ]] && use doc; then
262     pushd ${RUBY_FAKEGEM_DOCDIR}
263     dohtml -r * || die "failed to install documentation"
264     popd
265     fi
266    
267     if [[ -n ${RUBY_FAKEGEM_EXTRADOC} ]]; then
268     dodoc ${RUBY_FAKEGEM_EXTRADOC} || die "failed to install further documentation"
269     fi
270     }
271    
272     # @FUNCTION: all_ruby_install
273     # @DESCRIPTION:
274     # Install files common to all ruby targets.
275     all_ruby_install() {
276     all_fakegem_install
277     }

  ViewVC Help
Powered by ViewVC 1.1.20