summaryrefslogtreecommitdiff
path: root/eclass
diff options
context:
space:
mode:
authorAlex Legler <a3li@gentoo.org>2009-12-14 12:32:18 +0000
committerAlex Legler <a3li@gentoo.org>2009-12-14 12:32:18 +0000
commit105f9eee565f9f95b16a83ce13f2244bff9ea6c7 (patch)
treeb2778ac4bdc873e49662864971c5f59d9838cbf1 /eclass
parentit's 2009 (diff)
downloadhistorical-105f9eee565f9f95b16a83ce13f2244bff9ea6c7.tar.gz
historical-105f9eee565f9f95b16a83ce13f2244bff9ea6c7.tar.bz2
historical-105f9eee565f9f95b16a83ce13f2244bff9ea6c7.zip
Add ruby-fakegem.eclass
Diffstat (limited to 'eclass')
-rw-r--r--eclass/ruby-fakegem.eclass264
1 files changed, 264 insertions, 0 deletions
diff --git a/eclass/ruby-fakegem.eclass b/eclass/ruby-fakegem.eclass
new file mode 100644
index 000000000000..6ca41784bde5
--- /dev/null
+++ b/eclass/ruby-fakegem.eclass
@@ -0,0 +1,264 @@
+# Copyright 1999-2009 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/eclass/ruby-fakegem.eclass,v 1.1 2009/12/14 12:32:18 a3li Exp $
+#
+# @ECLASS: ruby-fakegem.eclass
+# @MAINTAINER:
+# Ruby herd <ruby@gentoo.org>
+#
+# Author: Diego E. Pettenò <flameeyes@gentoo.org>
+#
+# Author: Alex Legler <a3li@gentoo.org>
+#
+# @BLURB: An eclass for installing Ruby packages to behave like RubyGems.
+# @DESCRIPTION:
+# This eclass allows to install arbitrary Ruby libraries (including Gems),
+# providing integration into the RubyGems system even for "regular" packages.
+#
+
+inherit ruby-ng
+
+# @ECLASS-VARIABLE: RUBY_FAKEGEM_NAME
+# @DESCRIPTION:
+# Sets the Gem name for the generated fake gemspec.
+# RUBY_FAKEGEM_NAME="${PN}"
+
+# @ECLASS-VARIABLE: RUBY_FAKEGEM_VERSION
+# @DESCRIPTION:
+# Sets the Gem version for the generated fake gemspec.
+# RUBY_FAKEGEM_VERSION="${PV}"
+
+# @ECLASS-VARIABLE: RUBY_FAKEGEM_TASK_DOC
+# @DESCRIPTION:
+# Specify the rake(1) task to run to generate documentation.
+# RUBY_FAKEGEM_VERSION="rdoc"
+
+# @ECLASS-VARIABLE: RUBY_FAKEGEM_TASK_TEST
+# @DESCRIPTION:
+# Specify the rake(1) task used for executing tests.
+# RUBY_FAKEGEM_VERSION="test"
+
+RUBY_FAKEGEM_NAME="${RUBY_FAKEGEM_NAME:-${PN}}"
+RUBY_FAKEGEM_VERSION="${RUBY_FAKEGEM_VERSION:-${PV}}"
+
+RUBY_FAKEGEM_TASK_DOC="${RUBY_FAKEGEM_TASK_DOC-rdoc}"
+RUBY_FAKEGEM_TASK_TEST="${RUBY_FAKEGEM_TASK_TEST-test}"
+
+if [[ ${RUBY_FAKEGEM_TASK_DOC} != "" ]]; then
+ IUSE="$IUSE doc"
+ ruby_add_bdepend doc "dev-ruby/rake"
+fi
+
+if [[ ${RUBY_FAKEGEM_TASK_TEST} != "" ]]; then
+ IUSE="$IUSE test"
+ ruby_add_bdepend test "dev-ruby/rake"
+fi
+
+ruby_add_rdepend virtual/rubygems
+
+# @FUNCTION: ruby_fakegem_gemsdir
+# @RETURN: Returns the gem data directory
+# @DESCRIPTION:
+# This function returns the gems data directory for the ruby
+# implementation in question.
+ruby_fakegem_gemsdir() {
+ local _gemsitedir=$(${RUBY} -r rbconfig -e 'print Config::CONFIG["sitelibdir"]' | sed -e 's:site_ruby:gems:')
+
+ [[ -z ${_gemsitedir} ]] && {
+ eerror "Unable to find the gems dir"
+ die "Unable to find the gems dir"
+ }
+
+ echo "${_gemsitedir}"
+}
+
+# @FUNCTION: ruby_fakegem_doins
+# @USAGE: file [file...]
+# @DESCRIPTION:
+# Installs the specified file(s) into the gems directory.
+ruby_fakegem_doins() {
+ (
+ insinto $(ruby_fakegem_gemsdir)/gems/${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}
+ doins "$@"
+ ) || die "failed $0 $@"
+}
+
+# @FUNCTION: ruby_fakegem_newsins()
+# @USAGE: file filename
+# @DESCRIPTION:
+# Installs the specified file into the gems directory using the provided filename.
+ruby_fakegem_newins() {
+ (
+ # Since newins does not accept full paths but just basenames
+ # for the target file, we want to extend it here.
+ local newdirname=/$(dirname "$2")
+ [[ ${newdirname} == "/." ]] && newdirname=
+
+ local newbasename=$(basename "$2")
+
+ insinto $(ruby_fakegem_gemsdir)/gems/${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}${newdirname}
+ newins "$1" ${newbasename}
+ ) || die "failed $0 $@"
+}
+
+# @FUNCTION: ruby_fakegem_genspec
+# @DESCRIPTION:
+# Generates a gemspec for the package and places it into the "specifications"
+# directory of RubyGems.
+# In the gemspec, the following values are set: name, version, summary,
+# homepage, and require_paths=["lib"].
+# See RUBY_FAKEGEM_NAME and RUBY_FAKEGEM_VERSION for setting name and version.
+ruby_fakegem_genspec() {
+ (
+ # We use the _ruby_implementation variable to avoid having stray
+ # copies with different implementations; while for now we're using
+ # the same exact content, we might have differences in the future,
+ # so better taking this into consideration.
+ cat - > "${T}"/${RUBY_FAKEGEM_NAME}-${_ruby_implementation} <<EOF
+Gem::Specification.new do |s|
+ s.name = "${RUBY_FAKEGEM_NAME}"
+ s.version = "${RUBY_FAKEGEM_VERSION}"
+ s.summary = "${DESCRIPTION}"
+ s.homepage = "${HOMEPAGE}"
+ s.require_paths = ["lib"]
+end
+EOF
+
+ insinto $(ruby_fakegem_gemsdir)/specifications
+ newins "${T}"/${RUBY_FAKEGEM_NAME}-${_ruby_implementation} ${RUBY_FAKEGEM_NAME}-${RUBY_FAKEGEM_VERSION}.gemspec
+ ) || die "Unable to install fake gemspec"
+}
+
+# @FUNCTION: ruby_fakegem_binwrapper
+# @USAGE: command [path]
+# @DESCRIPTION:
+# Creates a new binary wrapper for a command installed by the RubyGem.
+# path defaults to /usr/bin/$command
+ruby_fakegem_binwrapper() {
+ (
+ local gembinary=$1
+ local newbinary=${2:-/usr/bin/$gembinary}
+
+ cat - > "${T}"/gembin-wrapper-${gembinary} <<EOF
+#!/usr/bin/env ruby
+# This is a simplified version of the RubyGems wrapper
+#
+# Generated by ruby-fakegem.eclass
+
+require 'rubygems'
+
+load Gem::GemPathSearcher.new.find('$(tr [A-Z] [a-z] <<< ${RUBY_FAKEGEM_NAME})').full_gem_path + "/bin/${gembinary}"
+
+EOF
+
+ exeinto $(dirname $newbinary)
+ newexe "${T}"/gembin-wrapper-${gembinary} $(basename $newbinary)
+ ) || die "Unable to create fakegem wrapper"
+}
+
+# @FUNCTION: all_fakegem_compile
+# @DESCRIPTION:
+# Build documentation for the package if indicated by the doc USE flag
+# and if there is a documetation task defined.
+all_fakegem_compile() {
+ if [[ ${RUBY_FAKEGEM_TASK_DOC} != "" ]] && use doc; then
+ rake ${RUBY_FAKEGEM_TASK_DOC} || die "failed to (re)build documentation"
+ fi
+}
+
+# @FUNCTION: all_ruby_unpack
+# @DESCRIPTION:
+# Unpack the source archive, including support for unpacking gems.
+all_ruby_unpack() {
+ # Special support for extracting .gem files; the file need to be
+ # extracted twice and the mtime from the archive _has_ to be
+ # ignored (it's always set to epoch 0).
+ #
+ # This only works if there is exactly one archive and that archive
+ # is a .gem file!
+ if [[ $(wc -w <<< ${A}) == 1 ]] &&
+ [[ ${A} == *.gem ]]; then
+ ebegin "Unpacking .gem file..."
+ tar -mxf ${DISTDIR}/${A} || die
+ eend $?
+
+ mkdir "${S}"
+ pushd "${S}"
+
+ ebegin "Unpacking data.tar.gz"
+ tar -mxf "${my_WORKDIR}"/data.tar.gz || die
+ eend $?
+ else
+ [[ -n ${A} ]] && unpack ${A}
+ fi
+}
+
+# @FUNCTION: all_ruby_compile
+# @DESCRIPTION:
+# Compile the package.
+all_ruby_compile() {
+ all_fakegem_compile
+}
+
+# @FUNCTION: each_fakegem_test
+# @DESCRIPTION:
+# Run tests for the package for each ruby target if the test task is defined.
+each_fakegem_test() {
+ local rubyflags=
+
+ if [[ ${RUBY_FAKEGEM_TASK_TEST} != "" ]]; then
+ ${RUBY} ${rubyflags} -S rake ${RUBY_FAKEGEM_TASK_TEST} || die "tests failed"
+ else
+ echo "No test task defined, skipping tests."
+ fi
+}
+
+# @FUNCTION: each_ruby_test
+# @DESCRIPTION:
+# Run the tests for this package.
+each_ruby_test() {
+ each_fakegem_test
+}
+
+# @FUNCTION: each_fakegem_install
+# @DESCRIPTION:
+# Install the package for each ruby target.
+each_fakegem_install() {
+ ruby_fakegem_genspec
+
+ local _gemlibdirs=
+ for directory in bin lib ${RUBY_FAKEGEM_EXTRAINSTALL}; do
+ [[ -d ${directory} ]] && _gemlibdirs="${_gemlibdirs} ${directory}"
+ done
+
+ ruby_fakegem_doins -r ${_gemlibdirs}
+}
+
+# @FUNCTION: each_ruby_install
+# @DESCRIPTION:
+# Install the package for each target.
+each_ruby_install() {
+ each_fakegem_install
+}
+
+# @FUNCTION: all_fakegem_install
+# @DESCRIPTION:
+# Install files common to all ruby targets.
+all_fakegem_install() {
+ if [[ -n ${RUBY_FAKEGEM_DOCDIR} ]] && use doc; then
+ pushd ${RUBY_FAKEGEM_DOCDIR}
+ dohtml -r * || die "failed to install documentation"
+ popd
+ fi
+
+ if [[ -n ${RUBY_FAKEGEM_EXTRADOC} ]]; then
+ dodoc ${RUBY_FAKEGEM_EXTRADOC} || die "failed to install further documentation"
+ fi
+}
+
+# @FUNCTION: all_ruby_install
+# @DESCRIPTION:
+# Install files common to all ruby targets.
+all_ruby_install() {
+ all_fakegem_install
+}