[oe-commits] Mark Asselstine : ruby.bbclass: introduce a class to assist in building gems

git at git.openembedded.org git at git.openembedded.org
Mon Sep 29 02:51:30 UTC 2014


Module: meta-openembedded.git
Branch: master
Commit: 8c2e27e68642224df084eed14c2ad1de4f1bb0a5
URL:    http://git.openembedded.org/?p=meta-openembedded.git&a=commit;h=8c2e27e68642224df084eed14c2ad1de4f1bb0a5

Author: Mark Asselstine <mark.asselstine at windriver.com>
Date:   Fri Sep  5 11:07:13 2014 -0400

ruby.bbclass: introduce a class to assist in building gems

In order to allow the building of gems we have created a
ruby.bbclass. The building of gems is much like the building of python
packages in that we rely on building up -native gems in order to
facilitate the cross compiling of the gems that will be built for the
target. When dependencies exist between gems they must be satisfied by
the -native gems installed in the host sysroot. This approach is
feasible since the build process is able to query installed gems
without being affected by the ARCH they were built for. At this point
I have yet to come across a situation where the assumption associated
with this approach have failed but so far focus has only been on x86
and x86-64 builds.

The recipes which inherit the ruby.bbclass can optionally define a BPV
in the case where the gemspec version doesn't always map 1:1 to the
PV. This situation has only been encountered on a few occasions so
the class has been made to default BPV to PV.

To demonstrate the ruby.bbclass in use we have included a recipe to
build the bundler gem. Bundler can be used on a running target to
install gems from rubygems.org, which can be useful in itself when you
don't have recipes available for gems but want to try installing and
running pre-built gems.

Signed-off-by: Mark Asselstine <mark.asselstine at windriver.com>
Signed-off-by: Martin Jansa <Martin.Jansa at gmail.com>

---

 meta-ruby/classes/ruby.bbclass                 | 125 +++++++++++++++++++++++++
 meta-ruby/recipes-devtools/ruby/bundler_git.bb |  29 ++++++
 2 files changed, 154 insertions(+)

diff --git a/meta-ruby/classes/ruby.bbclass b/meta-ruby/classes/ruby.bbclass
new file mode 100644
index 0000000..9c4fcf9
--- /dev/null
+++ b/meta-ruby/classes/ruby.bbclass
@@ -0,0 +1,125 @@
+BPV ?= "${PV}"
+
+DEPENDS += " \
+    ruby-native \
+"
+RDEPENDS_${PN} += " \
+    ruby \
+"
+
+def get_rubyversion(p):
+    import re
+    from os.path import isfile
+    import subprocess
+    found_version = "SOMETHING FAILED!"
+
+    cmd = "%s/ruby" % p
+
+    if not isfile(cmd):
+       return found_version
+
+    version = subprocess.Popen([cmd, "--version"], stdout=subprocess.PIPE).communicate()[0]
+    
+    r = re.compile("ruby ([0-9]+\.[0-9]+\.[0-9]+)*")
+    m = r.match(version)
+    if m:
+        found_version = m.group(1)
+
+    return found_version
+
+def get_rubygemslocation(p):
+    import re
+    from os.path import isfile
+    import subprocess
+    found_loc = "SOMETHING FAILED!"
+
+    cmd = "%s/gem" % p
+
+    if not isfile(cmd):
+       return found_loc
+
+    loc = subprocess.Popen([cmd, "env"], stdout=subprocess.PIPE).communicate()[0]
+
+    r = re.compile(".*\- (/usr.*/ruby/gems/.*)")
+    for line in loc.split('\n'):
+        m = r.match(line)
+        if m:
+            found_loc = m.group(1)
+            break
+
+    return found_loc
+
+def get_rubygemsversion(p):
+    import re
+    from os.path import isfile
+    import subprocess
+    found_version = "SOMETHING FAILED!"
+
+    cmd = "%s/gem" % p
+
+    if not isfile(cmd):
+       return found_version
+
+    version = subprocess.Popen([cmd, "env", "gemdir"], stdout=subprocess.PIPE).communicate()[0]
+    
+    r = re.compile(".*([0-9]+\.[0-9]+\.[0-9]+)$")
+    m = r.match(version)
+    if m:
+        found_version = m.group(1)
+
+    return found_version
+
+RUBY_VERSION ?= "${@get_rubyversion("${STAGING_BINDIR_NATIVE}")}"
+RUBY_GEM_DIRECTORY ?= "${@get_rubygemslocation("${STAGING_BINDIR_NATIVE}")}"
+RUBY_GEM_VERSION ?= "${@get_rubygemsversion("${STAGING_BINDIR_NATIVE}")}"
+
+export GEM_HOME = "${STAGING_DIR_NATIVE}/usr/lib/ruby/gems/${RUBY_GEM_VERSION}"
+
+RUBY_BUILD_GEMS ?= "${BPN}.gemspec"
+RUBY_INSTALL_GEMS ?= "${BPN}-${BPV}.gem"
+
+RUBY_COMPILE_FLAGS ?= 'LANG="en_US.UTF-8" LC_ALL="en_US.UTF-8"'
+
+ruby_do_compile() {
+	for gem in ${RUBY_BUILD_GEMS}; do
+		${RUBY_COMPILE_FLAGS} gem build $gem
+	done
+}
+
+
+ruby_do_install() {
+	for gem in ${RUBY_INSTALL_GEMS}; do
+		gem install --ignore-dependencies --local --env-shebang --install-dir ${D}/${libdir}/ruby/gems/${RUBY_GEM_VERSION}/ $gem
+	done
+
+	# create symlink from the gems bin directory to /usr/bin
+	for i in ${D}/${libdir}/ruby/gems/${RUBY_GEM_VERSION}/bin/*; do
+		if [ -e "$i" ]; then
+			if [ ! -d ${D}/${bindir} ]; then mkdir -p ${D}/${bindir}; fi
+			b=`basename $i`
+			ln -sf ${libdir}/ruby/gems/${RUBY_GEM_VERSION}/bin/$b ${D}/${bindir}/$b
+		fi
+	done
+}
+
+EXPORT_FUNCTIONS do_compile do_install
+
+PACKAGES = "${PN}-dbg ${PN} ${PN}-doc ${PN}-dev"
+
+FILES_${PN}-dbg += " \
+        ${libdir}/ruby/gems/${RUBY_GEM_VERSION}/gems/*/*/.debug \
+        ${libdir}/ruby/gems/${RUBY_GEM_VERSION}/gems/*/*/*/.debug \
+        ${libdir}/ruby/gems/${RUBY_GEM_VERSION}/gems/*/*/*/*/.debug \
+        ${libdir}/ruby/gems/${RUBY_GEM_VERSION}/gems/*/*/*/*/*/.debug \
+        "
+
+FILES_${PN} += " \
+        ${libdir}/ruby/gems/${RUBY_GEM_VERSION}/gems \
+        ${libdir}/ruby/gems/${RUBY_GEM_VERSION}/cache \
+        ${libdir}/ruby/gems/${RUBY_GEM_VERSION}/bin \
+        ${libdir}/ruby/gems/${RUBY_GEM_VERSION}/specifications \
+        "
+
+FILES_${PN}-doc += " \
+        ${libdir}/ruby/gems/${RUBY_GEM_VERSION}/doc \
+        "
diff --git a/meta-ruby/recipes-devtools/ruby/bundler_git.bb b/meta-ruby/recipes-devtools/ruby/bundler_git.bb
new file mode 100644
index 0000000..2adde4d
--- /dev/null
+++ b/meta-ruby/recipes-devtools/ruby/bundler_git.bb
@@ -0,0 +1,29 @@
+SUMMARY = "Makes sure Ruby applications run the same code on every machine."
+DESCRIPTION = "Bundler makes sure Ruby applications run the same code \
+on every machine. It does this by managing the gems that the \
+application depends on. Given a list of gems, it can automatically \
+download and install those gems, as well as any other gems needed by \
+the gems that are listed. Before installing gems, it checks the \
+versions of every gem to make sure that they are compatible, and can \
+all be loaded at the same time. After the gems have been installed, \
+Bundler can help you update some or all of them when new versions \
+become available. Finally, it records the exact versions that have \
+been installed, so that others can install the exact same gems."
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.md;md5=196bb963e601609817d7e9ac9a64a867"
+
+PR = "r0"
+
+PV = "1.6.2"
+SRCREV = "06e3647c117da210ffd15a174624497830addd7b"
+
+S = "${WORKDIR}/git"
+
+SRC_URI = " \
+    git://github.com/bundler/bundler.git \
+    "
+
+inherit ruby
+
+BBCLASSEXTEND = "native"



More information about the Openembedded-commits mailing list