From Fedora Project Wiki

< PackagingDrafts

Revision as of 16:46, 18 June 2009 by Mtasaka (talk | contribs) (moved User:Mtasaka/PackagingDrafts/Gem expand stage change to PackagingDrafts/Gem expand stage change: PackagingDrafts must be PackagingDrafts Moving from my user page as the first draft is completed.)

Propoposal to change the stage to expand RubyGem file

Current guidelines

Current guidelines for packaging RubyGem files here says:

  • The %prep and %build sections of the specfile should be empty.
  • The install should be performed with the command
gem install --local --install-dir %{buildroot}%{gemdir} --force %{SOURCE0}

This means that

  • usually RubyGem files should be expanded under %{buildroot} directly without using %prep or %build stage.

Issues with current guidelines

Some of the issues with current guidelines are already discussed on the thread beginning at here and continues to this.

  • When we want to apply some needed patches after expanding Gem files, with current guidelines %patchXXX macro canot be used because %patchXXX macro can be used only at %prep
  • When we want to execute some check programs to verify if the Gems to be installed really work, we usually create %check stage and execute them at the stage. With current guidelines we must execute these check programs under %{buildroot}.
    • This is troublesome if executing such programs create additional files (under %{buildroot})
  • Note that when Gem file creates C extension libraries, we have already moved the stage to expand Gem file from %install to %build (not %prep, however) to create debuginfo rpm correctly.


All RubyGem files should be expanded at %prep first. i.e.

  • RubyGem files should be expanded under %{_builddir}/%{name}-%{version}%{gemdir} at prep first. This can usually be performed by the folloing lines:
%setup -q -c -T

mkdir -p .%{gemdir}
(If RubyGem creates C extension modules, adding the following line
 is recommend:
export CONFIGURE_ARGS="--with-cflags='%{optflags}'"
gem install -V --local \
	--install-dir $(pwd)/%{gemdir} \
	--force --rdoc \
  • %build stage can be empty.
  • Then at %install stage the whole tree under the directory created at %prep stage should be copied (not moved) to under %{buildroot}%{gemdir} by the following for example.
rm -rf %{buildroot}

mkdir -p %{buildroot}%{gemdir}
cp -a .%{gemdir}/* %{buildroot}%{gemdir}/
  • Executing some test program at %check stage is recommended if there exists. This can performed by the following for example:
%global geminstdir %{gemdir}/gems/%{gemname}-%{version}
BuildRequires: rubygem(rake)

export GEM_PATH=.%{gemdir}
pushd .%{geminstdir}
rake test

Some notes

  • There is an annoying discussion about whether expanding RubyGems should be at %prep or %build when Gem creates C extension modules. However as current Gem mechanism cannot allow for us to "expand" Gems and "build" them separately, I came to think that moving expansion stage from %build to %prep does not matter.