# The RubyGems root folder. %gem_dir %{_datadir}/gems %gem_archdir %{_libdir}/gems # Common gem locations and files. %gem_instdir %{gem_dir}/gems/%{gem_name}-%{version}%{?prerelease} %gem_extdir_mri %{gem_archdir}/ruby/%{gem_name}-%{version}%{?prerelease} %gem_libdir %{gem_instdir}/lib %gem_cache %{gem_dir}/cache/%{gem_name}-%{version}%{?prerelease}.gem %gem_spec %{gem_dir}/specifications/%{gem_name}-%{version}%{?prerelease}.gemspec %gem_docdir %{gem_dir}/doc/%{gem_name}-%{version}%{?prerelease} # %gem_install - Install gem into appropriate directory. # # Usage: %gem_install [options] # # -n Overrides gem file name for installation. # -d Set installation directory. # %gem_install(d:n:) \ mkdir -p %{-d*}%{!?-d:.%{gem_dir}} \ \ CONFIGURE_ARGS="--with-cflags='%{optflags}' --with-cxxflags='%{optflags}' $CONFIGURE_ARGS" \\\ gem install \\\ -V \\\ --local \\\ --build-root %{-d*}%{!?-d:.} \\\ --force \\\ --document=ri,rdoc \\\ %{-n*}%{!?-n:%{gem_name}-%{version}%{?prerelease}.gem} \ %{nil} # For rubygems packages we want to filter out any provides caused by private # libs in %%{gem_archdir}. # # Note that this must be invoked in the spec file, preferably as # "%{?rubygems_default_filter}", before any %description block. %rubygems_default_filter %{expand: \ %global __provides_exclude_from %{?__provides_exclude_from:%{__provides_exclude_from}|}^%{gem_extdir_mri}/.*\\\\.so$ \ } # The 'read' command in %%gemspec_* macros is not essential, but it is usefull # to make the sript appear in build log. # %gemspec_add_dep - Add dependency into .gemspec. # # Usage: %gemspec_add_dep -g [options] [requirements] # # Add dependency named to .gemspec file. The macro adds runtime # dependency by default. The [requirements] argument can be used to specify # the dependency constraints more precisely. It is expected to be valid Ruby # code. # # -s Overrides the default .gemspec location. # -d Add development dependecy. # %gemspec_add_dep(g:s:d) \ read -d '' gemspec_add_dep_script << 'EOR' || : \ gemspec_file = '%{-s*}%{!?-s:%{_builddir}/%{gem_name}-%{version}.gemspec}' \ \ name = '%{-g*}' \ requirements = %{*}%{!?1:nil} \ \ type = :%{!?-d:runtime}%{?-d:development} \ \ spec = Gem::Specification.load(gemspec_file) \ abort("#{gemspec_file} is not accessible.") unless spec \ \ dep = spec.dependencies.detect { |d| d.type == type && d.name == name } \ if dep \ dep.requirement.concat requirements \ else \ spec.public_send "add_#{type}_dependency", name, requirements \ end \ File.write gemspec_file, spec.to_ruby \ EOR\ echo "$gemspec_add_dep_script" | ruby \ unset -v gemspec_add_dep_script \ %{nil} # %gemspec_remove_dep - Remove dependency from .gemspec. # # Usage: %gemspec_remove_dep -g [options] [requirements] # # Remove dependency named from .gemspec file. The macro removes runtime # dependency by default. The [requirements] argument can be used to specify # the dependency constraints more precisely. It is expected to be valid Ruby # code. The macro fails if these specific requirements can't be removed. # # -s Overrides the default .gemspec location. # -d Remove development dependecy. # %gemspec_remove_dep(g:s:d) \ read -d '' gemspec_remove_dep_script << 'EOR' || : \ gemspec_file = '%{-s*}%{!?-s:%{_builddir}/%{gem_name}-%{version}.gemspec}' \ \ name = '%{-g*}' \ requirements = %{*}%{!?1:nil} \ \ type = :%{!?-d:runtime}%{?-d:development} \ \ spec = Gem::Specification.load(gemspec_file) \ abort("#{gemspec_file} is not accessible.") unless spec \ \ dep = spec.dependencies.detect { |d| d.type == type && d.name == name } \ if dep \ if requirements \ requirements = Gem::Requirement.create(requirements).requirements \ requirements.each do |r| \ unless dep.requirement.requirements.reject! { |dependency_requirements| dependency_requirements == r } \ abort("Requirement '#{r.first} #{r.last}' was not possible to remove for dependency '#{dep}'!") \ end \ end \ spec.dependencies.delete dep if dep.requirement.requirements.empty? \ else \ spec.dependencies.delete dep \ end \ else \ abort("Dependency '#{name}' was not found!") \ end \ File.write gemspec_file, spec.to_ruby \ EOR\ echo "$gemspec_remove_dep_script" | ruby \ unset -v gemspec_remove_dep_script \ %{nil} # %%gemspec_add_file - Add files to various files lists in .gemspec. # # Usage: %%gemspec_add_file [options] # # Add files to .gemspec file. is expected to be valid Ruby code. # Path to file is expected. Does not check real files in any way. # By default, `files` list is edited. # # -s Overrides the default .gemspec location. # -t Edit test_files only. # -r Edit extra_rdoc_files only. # %gemspec_add_file(s:tr) \ read -d '' gemspec_add_file_script << 'EOR' || : \ gemspec_file = '%{-s*}%{!?-s:%{_builddir}/%{gem_name}-%{version}.gemspec}' \ \ abort("gemspec_add_file: Use only one '-t' or '-r' at a time.") if "%{?-t}%{?-r}" == "-t-r" \ \ filenames = %{*}%{!?1:nil} \ filenames = Array(filenames) \ \ spec = Gem::Specification.load(gemspec_file) \ abort("#{gemspec_file} is not accessible.") unless spec \ \ spec.%{?-t:test_}%{?-r:extra_rdoc_}files += filenames \ File.write gemspec_file, spec.to_ruby \ EOR\ echo "$gemspec_add_file_script" | ruby \ unset -v gemspec_add_file_script \ %{nil} # %%gemspec_remove_file - Remove files from various files lists in .gemspec. # # Usage: %%gemspec_remove_file [options] # # Remove files from .gemspec file. is expected to be valid Ruby code. # Path to file is expected. Does not check/remove real files in any way. # By default, `files` list is edited. File has to be removed from `test_files` # first in order to be removable from `files`. # # -s Overrides the default .gemspec location. # -t Edit test_files only. # -r Edit extra_rdoc_files only. # %gemspec_remove_file(s:tr) \ read -d '' gemspec_remove_file_script << 'EOR' || : \ gemspec_file = '%{-s*}%{!?-s:%{_builddir}/%{gem_name}-%{version}.gemspec}' \ \ abort("gemspec_remove_file: Use only one '-t' or '-r' at a time.") if "%{?-t}%{?-r}" == "-t-r" \ \ filenames = %{*}%{!?1:nil} \ filenames = Array(filenames) \ \ spec = Gem::Specification.load(gemspec_file) \ abort("#{gemspec_file} is not accessible.") unless spec \ \ spec.%{?-t:test_}%{?-r:extra_rdoc_}files -= filenames \ File.write gemspec_file, spec.to_ruby \ EOR\ echo "$gemspec_remove_file_script" | ruby \ unset -v gemspec_remove_file_script \ %{nil}