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

Contents of /eclass/ruby-fakegem.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.15 - (show annotations) (download)
Fri Feb 19 08:47:36 2010 UTC (4 years, 8 months ago) by flameeyes
Branch: MAIN
Changes since 1.14: +4 -3 lines
Add support for suffixes to a gem (like .java) and support for
pre-release mangling (_pre becomes .pre).

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.14 2010/02/13 08:45:03 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 RUBY_FAKEGEM_NAME="${RUBY_FAKEGEM_NAME:-${PN}}"
63 RUBY_FAKEGEM_VERSION="${RUBY_FAKEGEM_VERSION:-${PV/_pre/.pre}}"
64 RUBY_FAKEGEM_SUFFIX="${RUBY_FAKEGEM_SUFFIX:-}"
65
66 RUBY_FAKEGEM_TASK_DOC="${RUBY_FAKEGEM_TASK_DOC-rdoc}"
67 RUBY_FAKEGEM_TASK_TEST="${RUBY_FAKEGEM_TASK_TEST-test}"
68
69 RUBY_FAKEGEM_BINWRAP="${RUBY_FAKEGEM_BINWRAP-*}"
70
71 if [[ ${RUBY_FAKEGEM_TASK_DOC} != "" ]]; then
72 IUSE="$IUSE doc"
73 ruby_add_bdepend doc "dev-ruby/rake"
74 fi
75
76 if [[ ${RUBY_FAKEGEM_TASK_TEST} != "" ]]; then
77 IUSE="$IUSE test"
78 ruby_add_bdepend test "dev-ruby/rake"
79 fi
80
81 SRC_URI="mirror://rubygems/${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}${RUBY_FAKEGEM_SUFFIX:+-${RUBY_FAKEGEM_SUFFIX}}.gem"
82
83 ruby_add_rdepend virtual/rubygems
84
85 # @FUNCTION: ruby_fakegem_gemsdir
86 # @RETURN: Returns the gem data directory
87 # @DESCRIPTION:
88 # This function returns the gems data directory for the ruby
89 # implementation in question.
90 ruby_fakegem_gemsdir() {
91 local _gemsitedir=$(${RUBY} -r rbconfig -e 'print Config::CONFIG["sitelibdir"]' | sed -e 's:site_ruby:gems:')
92
93 [[ -z ${_gemsitedir} ]] && {
94 eerror "Unable to find the gems dir"
95 die "Unable to find the gems dir"
96 }
97
98 echo "${_gemsitedir}"
99 }
100
101 # @FUNCTION: ruby_fakegem_doins
102 # @USAGE: file [file...]
103 # @DESCRIPTION:
104 # Installs the specified file(s) into the gems directory.
105 ruby_fakegem_doins() {
106 (
107 insinto $(ruby_fakegem_gemsdir)/gems/${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}
108 doins "$@"
109 ) || die "failed $0 $@"
110 }
111
112 # @FUNCTION: ruby_fakegem_newsins()
113 # @USAGE: file filename
114 # @DESCRIPTION:
115 # Installs the specified file into the gems directory using the provided filename.
116 ruby_fakegem_newins() {
117 (
118 # Since newins does not accept full paths but just basenames
119 # for the target file, we want to extend it here.
120 local newdirname=/$(dirname "$2")
121 [[ ${newdirname} == "/." ]] && newdirname=
122
123 local newbasename=$(basename "$2")
124
125 insinto $(ruby_fakegem_gemsdir)/gems/${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}${newdirname}
126 newins "$1" ${newbasename}
127 ) || die "failed $0 $@"
128 }
129
130 # @FUNCTION: ruby_fakegem_genspec
131 # @DESCRIPTION:
132 # Generates a gemspec for the package and places it into the "specifications"
133 # directory of RubyGems.
134 # In the gemspec, the following values are set: name, version, summary,
135 # homepage, and require_paths=["lib"].
136 # See RUBY_FAKEGEM_NAME and RUBY_FAKEGEM_VERSION for setting name and version.
137 # See RUBY_FAKEGEM_REQUIRE_PATHS for setting extra require paths.
138 ruby_fakegem_genspec() {
139 (
140 local required_paths="'lib'"
141 for path in ${RUBY_FAKEGEM_REQUIRE_PATHS}; do
142 required_paths="${required_paths}, '${path}'"
143 done
144
145 # We use the _ruby_implementation variable to avoid having stray
146 # copies with different implementations; while for now we're using
147 # the same exact content, we might have differences in the future,
148 # so better taking this into consideration.
149 local quoted_description=${DESCRIPTION//\"/\\\"}
150 cat - > "${T}"/${RUBY_FAKEGEM_NAME}-${_ruby_implementation} <<EOF
151 Gem::Specification.new do |s|
152 s.name = "${RUBY_FAKEGEM_NAME}"
153 s.version = "${RUBY_FAKEGEM_VERSION}"
154 s.summary = "${quoted_description}"
155 s.homepage = "${HOMEPAGE}"
156 s.require_paths = [${required_paths}]
157 end
158 EOF
159
160 insinto $(ruby_fakegem_gemsdir)/specifications
161 newins "${T}"/${RUBY_FAKEGEM_NAME}-${_ruby_implementation} ${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}.gemspec
162 ) || die "Unable to install fake gemspec"
163 }
164
165 # @FUNCTION: ruby_fakegem_binwrapper
166 # @USAGE: command [path]
167 # @DESCRIPTION:
168 # Creates a new binary wrapper for a command installed by the RubyGem.
169 # path defaults to /usr/bin/$command
170 ruby_fakegem_binwrapper() {
171 (
172 local gembinary=$1
173 local newbinary=${2:-/usr/bin/$gembinary}
174 local relativegembinary=${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}/bin/${gembinary}
175 local binpath=$(dirname $newbinary)
176 [[ ${binpath} = . ]] && binpath=/usr/bin
177
178 cat - > "${T}"/gembin-wrapper-${gembinary} <<EOF
179 #!/usr/bin/env ruby
180 # This is a simplified version of the RubyGems wrapper
181 #
182 # Generated by ruby-fakegem.eclass
183
184 require 'rubygems'
185
186 load Gem::default_path[-1] + "/gems/${relativegembinary}"
187
188 EOF
189
190 exeinto ${binpath:-/usr/bin}
191 newexe "${T}"/gembin-wrapper-${gembinary} $(basename $newbinary)
192 ) || die "Unable to create fakegem wrapper"
193 }
194
195 # @FUNCTION: all_fakegem_compile
196 # @DESCRIPTION:
197 # Build documentation for the package if indicated by the doc USE flag
198 # and if there is a documetation task defined.
199 all_fakegem_compile() {
200 if [[ ${RUBY_FAKEGEM_TASK_DOC} != "" ]] && use doc; then
201 rake ${RUBY_FAKEGEM_TASK_DOC} || die "failed to (re)build documentation"
202 fi
203 }
204
205 # @FUNCTION: all_ruby_unpack
206 # @DESCRIPTION:
207 # Unpack the source archive, including support for unpacking gems.
208 all_ruby_unpack() {
209 # Special support for extracting .gem files; the file need to be
210 # extracted twice and the mtime from the archive _has_ to be
211 # ignored (it's always set to epoch 0).
212 #
213 # This only works if there is exactly one archive and that archive
214 # is a .gem file!
215 if [[ $(wc -w <<< ${A}) == 1 ]] &&
216 [[ ${A} == *.gem ]]; then
217 ebegin "Unpacking .gem file..."
218 tar -mxf ${DISTDIR}/${A} || die
219 eend $?
220
221 mkdir "${S}"
222 pushd "${S}" &>/dev/null
223
224 ebegin "Unpacking data.tar.gz"
225 tar -mxf "${my_WORKDIR}"/data.tar.gz || die
226 eend $?
227 popd &>/dev/null
228 else
229 [[ -n ${A} ]] && unpack ${A}
230 fi
231 }
232
233 # @FUNCTION: all_ruby_compile
234 # @DESCRIPTION:
235 # Compile the package.
236 all_ruby_compile() {
237 all_fakegem_compile
238 }
239
240 # @FUNCTION: each_fakegem_test
241 # @DESCRIPTION:
242 # Run tests for the package for each ruby target if the test task is defined.
243 each_fakegem_test() {
244 local rubyflags=
245 ${RUBY} ${rubyflags} -S rake ${RUBY_FAKEGEM_TASK_TEST} || die "tests failed"
246 }
247
248 if [[ ${RUBY_FAKEGEM_TASK_TEST} != "" ]]; then
249 # @FUNCTION: each_ruby_test
250 # @DESCRIPTION:
251 # Run the tests for this package.
252 each_ruby_test() {
253 each_fakegem_test
254 }
255 fi
256
257 # @FUNCTION: each_fakegem_install
258 # @DESCRIPTION:
259 # Install the package for each ruby target.
260 each_fakegem_install() {
261 ruby_fakegem_genspec
262
263 local _gemlibdirs="${RUBY_FAKEGEM_EXTRAINSTALL}"
264 for directory in bin lib; do
265 [[ -d ${directory} ]] && _gemlibdirs="${_gemlibdirs} ${directory}"
266 done
267
268 [[ -n ${_gemlibdirs} ]] && \
269 ruby_fakegem_doins -r ${_gemlibdirs}
270 }
271
272 # @FUNCTION: each_ruby_install
273 # @DESCRIPTION:
274 # Install the package for each target.
275 each_ruby_install() {
276 each_fakegem_install
277 }
278
279 # @FUNCTION: all_fakegem_install
280 # @DESCRIPTION:
281 # Install files common to all ruby targets.
282 all_fakegem_install() {
283 if [[ -n ${RUBY_FAKEGEM_DOCDIR} ]] && [[ ${RUBY_FAKEGEM_TASK_DOC} != "" ]] && use doc; then
284 for dir in ${RUBY_FAKEGEM_DOCDIR}; do
285 pushd ${dir} &>/dev/null
286 dohtml -r * || die "failed to install documentation"
287 popd &>/dev/null
288 done
289 fi
290
291 if [[ -n ${RUBY_FAKEGEM_EXTRADOC} ]]; then
292 dodoc ${RUBY_FAKEGEM_EXTRADOC} || die "failed to install further documentation"
293 fi
294
295 # binary wrappers; we assume that all the implementations get the
296 # same binaries, or something is wrong anyway, so...
297 if [[ -n ${RUBY_FAKEGEM_BINWRAP} ]]; then
298 local bindir=$(find "${D}" -type d -path "*/gems/${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}/bin" -print -quit)
299
300 if [[ -d "${bindir}" ]]; then
301 pushd "${bindir}" &>/dev/null
302 local binaries=$(eval ls ${RUBY_FAKEGEM_BINWRAP})
303 for binary in $binaries; do
304 ruby_fakegem_binwrapper $binary
305 done
306 popd &>/dev/null
307 fi
308 fi
309 }
310
311 # @FUNCTION: all_ruby_install
312 # @DESCRIPTION:
313 # Install files common to all ruby targets.
314 all_ruby_install() {
315 all_fakegem_install
316 }

  ViewVC Help
Powered by ViewVC 1.1.20