From Fedora Project Wiki

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.

Proposal

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:
%prep
%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 \
	%{SOURCE0}
  • %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.
%install
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)

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

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.