Skip to content

Instantly share code, notes, and snippets.

@Filirom1
Created January 12, 2015 17:27
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Filirom1/7b1d8f64fc1bb0f1775b to your computer and use it in GitHub Desktop.
Save Filirom1/7b1d8f64fc1bb0f1775b to your computer and use it in GitHub Desktop.
gem2rpm

Build RPM from rubygems

. It will fetch the gem file with the right version Ask for the license if missing Build the SRPM and the RPM using gem2rpm and a custom template

~/gem2rpm.sh simplecov '>=0.6.2'
...
Finish: build phase for rubygem-simplecov-0.9.1-1.el6.src.rpm
#!/bin/bash
NAME=$1
VERSION=$2
if [ "$#" -eq 0 ]; then
echo "Usage: $0 gem_name gem version"
exit -1
fi
set -e
set -u
# Fetch gem file
pushd ~/rpmbuild/SOURCES/
if [ -z $VERSION ]; then
GEM_FILE="$(gem fetch $NAME | sed 's#Downloaded ##g').gem"
else
GEM_FILE="$(gem fetch $NAME -v $VERSION | sed 's#Downloaded ##g').gem"
fi
popd
# Call gem2rpm
gem2rpm -t ~/rubygem-GEM.spec.template ~/rpmbuild/SOURCES/$GEM_FILE > ~/rpmbuild/SPECS/rubygem-$NAME.spec
# Remove URL from Source0
sed -i 's#http://rubygems.org/gems/##g' ~/rpmbuild/SPECS/rubygem-$NAME.spec
# Ask for License if not present
if grep "^License: $" ~/rpmbuild/SPECS/rubygem-$NAME.spec; then
read LICENSE
sed -i "s/^License: $/License: $LICENSE/g" ~/rpmbuild/SPECS/rubygem-$NAME.spec
fi
# Download sources
spectool --directory ~/rpmbuild/SOURCES/ -g ~/rpmbuild/SPECS/rubygem-$NAME.spec
# Build SRPM
SRPM_FILE="$(rpmbuild -bs ~/rpmbuild/SPECS/rubygem-$NAME.spec | sed 's#Wrote: ##g')"
# Build RPM
mock $SRPM_FILE
# Generated from <%= package.spec.file_name %> by gem2rpm -*- rpm-spec -*-
%global gemname <%= spec.name %>
<% if nongem -%>
%global ruby_sitelib %(ruby -rrbconfig -e "puts Config::CONFIG['sitelibdir']")
<% end -%>
%global gemdir %(ruby -rubygems -e 'puts Gem::dir' 2>/dev/null)
%global geminstdir %{gemdir}/gems/%{gemname}-%{version}
<%# TODO: Try to check against spec.required_ruby_version -%>
%global rubyabi 1.8
Summary: <%= spec.summary.gsub(/\.$/, "") %>
Name: rubygem-%{gemname}
Version: <%= spec.version %>
Release: 1%{?dist}
Group: Development/Languages
License: <%= spec.licenses.join(" and ") %>
<% if spec.homepage -%>
URL: <%= spec.homepage %>
<% end -%>
Source0: <%= download_path %>%{gemname}-%{version}.gem
Requires: ruby(abi) = %{rubyabi}
<% for req in spec.required_rubygems_version -%>
Requires: ruby(rubygems) <%= req %>
<% end -%>
<% for d in spec.runtime_dependencies -%>
<% for req in d.requirement -%>
Requires: rubygem(<%= d.name %>) <%= req %>
<% end -%>
<% end -%>
BuildRequires: ruby(abi) = %{rubyabi}
<% for req in spec.required_rubygems_version -%>
BuildRequires: ruby(rubygems) <%= req %>
<% end -%>
<%# TODO: Unfortunatelly this do not match with ruby(abi) yet -%>
<% for req in spec.required_ruby_version -%>
BuildRequires: ruby<%= "-devel" unless spec.extensions.empty? %> <%= req %>
<% end -%>
<% if spec.extensions.empty? -%>
BuildArch: noarch
<% end -%>
Provides: rubygem(%{gemname}) = %{version}
%description
<%= spec.description %>
<% if doc_subpackage -%>
%package doc
Summary: Documentation for %{name}
Group: Documentation
Requires: %{name} = %{version}-%{release}
BuildArch: noarch
%description doc
Documentation for %{name}
<% end # if doc_subpackage -%>
<% if nongem -%>
%package -n ruby-%{gemname}
Summary: <%= spec.summary.gsub(/\.$/, "") %>
Group: Development/Languages
Requires: rubygem(%{gemname}) = %{version}
<% spec.files.select{ |f| spec.require_paths.include?(File::dirname(f)) }.reject { |f| f =~ /\.rb$/ }.collect { |f| File::basename(f) }.each do |p| -%>
Provides: ruby(<%= p %>) = %{version}
<% end -%>
%description -n ruby-%{gemname}
<%= spec.description -%>
<% end # if nongem -%>
%prep
%setup -q -c -T
mkdir -p .%{gemdir}
<% unless spec.extensions.empty? -%>
export CONFIGURE_ARGS="--with-cflags='%{optflags}'"
<% end -%>
gem install --local --install-dir .%{gemdir} \
<% unless spec.executables.nil? or spec.executables.empty? -%>
--bindir .%{_bindir} \
<% end -%>
<% unless spec.extensions.empty? -%>
-V \
<% end -%>
--force %{SOURCE0}
%build
%install
mkdir -p %{buildroot}%{gemdir}
cp -pa .%{gemdir}/* \
%{buildroot}%{gemdir}/
<% unless spec.executables.nil? or spec.executables.empty? -%>
mkdir -p %{buildroot}%{_bindir}
cp -pa .%{_bindir}/* \
%{buildroot}%{_bindir}/
<% end -%>
<% unless spec.executables.empty? -%>
find %{buildroot}%{geminstdir}/bin -type f | xargs chmod a+x
<% end -%>
<% if nongem -%>
mkdir -p %{buildroot}%{ruby_sitelib}
<% spec.files.select{ |f| spec.require_paths.include?(File::dirname(f)) }.each do |p| -%>
ln -s %{gemdir}/gems/%{gemname}-%{version}/<%= p %> %{buildroot}%{ruby_sitelib}
<% end -%>
<% end # if nongem -%>
%files
%{geminstdir}
<% unless spec.executables.nil? or spec.executables.empty? -%>
<% for f in spec.executables -%>
%{_bindir}/<%= f %>
<% end -%>
%{geminstdir}/bin
<% end -%>
%{geminstdir}/lib
<% unless spec.extensions.empty? -%>
<%# TODO: Is it possible to delete the folder specified by the spec.extensions? -%>
%exclude %{geminstdir}/ext
<% end -%>
<% unless doc_subpackage -%>
%doc %{gemdir}/doc/%{gemname}-%{version}
<% for f in spec.extra_rdoc_files -%>
%doc %{geminstdir}/<%= f %>
<% end -%>
<% end -%>
%exclude %{gemdir}/cache/%{gemname}-%{version}.gem
%{gemdir}/specifications/%{gemname}-%{version}.gemspec
<% if doc_subpackage -%>
%files doc
%doc %{gemdir}/doc/%{gemname}-%{version}
<% for f in spec.extra_rdoc_files -%>
%doc %{geminstdir}/<%= f %>
<% end -%>
<% end # if doc_subpackage -%>
<% if nongem -%>
%files -n ruby-%{gemname}
%{ruby_sitelib}/*
<% end # if nongem -%>
%changelog
* <%= Time.now.strftime("%a %b %d %Y") %> <%= packager %> - <%= spec.version %>-1
- Initial package
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment