import ruby-3.1.2-141.module+el9.1.0+15737+76195479
This commit is contained in:
commit
e9a297153f
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
SOURCES/ruby-3.1.2.tar.xz
|
1
.ruby.metadata
Normal file
1
.ruby.metadata
Normal file
@ -0,0 +1 @@
|
||||
4c47f1dfeeb23fc55d65bcae50cf70c23bc28aa3 SOURCES/ruby-3.1.2.tar.xz
|
303
SOURCES/libruby.stp
Normal file
303
SOURCES/libruby.stp
Normal file
@ -0,0 +1,303 @@
|
||||
/* SystemTap tapset to make it easier to trace Ruby 2.0
|
||||
*
|
||||
* All probes provided by Ruby can be listed using following command
|
||||
* (the path to the library must be adjuste appropriately):
|
||||
*
|
||||
* stap -L 'process("@LIBRARY_PATH@").mark("*")'
|
||||
*/
|
||||
|
||||
/**
|
||||
* probe ruby.array.create - Allocation of new array.
|
||||
*
|
||||
* @size: Number of elements (an int)
|
||||
* @file: The file name where the method is being called (string)
|
||||
* @line: The line number where the method is being called (int)
|
||||
*/
|
||||
probe ruby.array.create =
|
||||
process("@LIBRARY_PATH@").mark("array__create")
|
||||
{
|
||||
size = $arg1
|
||||
file = user_string($arg2)
|
||||
line = $arg3
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.cmethod.entry - Fired just before a method implemented in C is entered.
|
||||
*
|
||||
* @classname: Name of the class (string)
|
||||
* @methodname: The method about bo be executed (string)
|
||||
* @file: The file name where the method is being called (string)
|
||||
* @line: The line number where the method is being called (int)
|
||||
*/
|
||||
probe ruby.cmethod.entry =
|
||||
process("@LIBRARY_PATH@").mark("cmethod__entry")
|
||||
{
|
||||
classname = user_string($arg1)
|
||||
methodname = user_string($arg2)
|
||||
file = user_string($arg3)
|
||||
line = $arg4
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.cmethod.return - Fired just after a method implemented in C has returned.
|
||||
*
|
||||
* @classname: Name of the class (string)
|
||||
* @methodname: The executed method (string)
|
||||
* @file: The file name where the method is being called (string)
|
||||
* @line: The line number where the method is being called (int)
|
||||
*/
|
||||
probe ruby.cmethod.return =
|
||||
process("@LIBRARY_PATH@").mark("cmethod__return")
|
||||
{
|
||||
classname = user_string($arg1)
|
||||
methodname = user_string($arg2)
|
||||
file = user_string($arg3)
|
||||
line = $arg4
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.find.require.entry - Fired when require starts to search load
|
||||
* path for suitable file to require.
|
||||
*
|
||||
* @requiredfile: The name of the file to be required (string)
|
||||
* @file: The file name where the method is being called (string)
|
||||
* @line: The line number where the method is being called (int)
|
||||
*/
|
||||
probe ruby.find.require.entry =
|
||||
process("@LIBRARY_PATH@").mark("find__require__entry")
|
||||
{
|
||||
requiredfile = user_string($arg1)
|
||||
file = user_string($arg2)
|
||||
line = $arg3
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.find.require.return - Fired just after require has finished
|
||||
* search of load path for suitable file to require.
|
||||
*
|
||||
* @requiredfile: The name of the file to be required (string)
|
||||
* @file: The file name where the method is being called (string)
|
||||
* @line: The line number where the method is being called (int)
|
||||
*/
|
||||
probe ruby.find.require.return =
|
||||
process("@LIBRARY_PATH@").mark("find__require__return")
|
||||
{
|
||||
requiredfile = user_string($arg1)
|
||||
file = user_string($arg2)
|
||||
line = $arg3
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.gc.mark.begin - Fired when a GC mark phase is about to start.
|
||||
*
|
||||
* It takes no arguments.
|
||||
*/
|
||||
probe ruby.gc.mark.begin =
|
||||
process("@LIBRARY_PATH@").mark("gc__mark__begin")
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.gc.mark.end - Fired when a GC mark phase has ended.
|
||||
*
|
||||
* It takes no arguments.
|
||||
*/
|
||||
probe ruby.gc.mark.end =
|
||||
process("@LIBRARY_PATH@").mark("gc__mark__end")
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.gc.sweep.begin - Fired when a GC sweep phase is about to start.
|
||||
*
|
||||
* It takes no arguments.
|
||||
*/
|
||||
probe ruby.gc.sweep.begin =
|
||||
process("@LIBRARY_PATH@").mark("gc__sweep__begin")
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.gc.sweep.end - Fired when a GC sweep phase has ended.
|
||||
*
|
||||
* It takes no arguments.
|
||||
*/
|
||||
probe ruby.gc.sweep.end =
|
||||
process("@LIBRARY_PATH@").mark("gc__sweep__end")
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.hash.create - Allocation of new hash.
|
||||
*
|
||||
* @size: Number of elements (int)
|
||||
* @file: The file name where the method is being called (string)
|
||||
* @line: The line number where the method is being called (int)
|
||||
*/
|
||||
probe ruby.hash.create =
|
||||
process("@LIBRARY_PATH@").mark("hash__create")
|
||||
{
|
||||
size = $arg1
|
||||
file = user_string($arg2)
|
||||
line = $arg3
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.load.entry - Fired when calls to "load" are made.
|
||||
*
|
||||
* @loadedfile: The name of the file to be loaded (string)
|
||||
* @file: The file name where the method is being called (string)
|
||||
* @line: The line number where the method is being called (int)
|
||||
*/
|
||||
probe ruby.load.entry =
|
||||
process("@LIBRARY_PATH@").mark("load__entry")
|
||||
{
|
||||
loadedfile = user_string($arg1)
|
||||
file = user_string($arg2)
|
||||
line = $arg3
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.load.return - Fired just after require has finished
|
||||
* search of load path for suitable file to require.
|
||||
*
|
||||
* @loadedfile: The name of the file that was loaded (string)
|
||||
*/
|
||||
probe ruby.load.return =
|
||||
process("@LIBRARY_PATH@").mark("load__return")
|
||||
{
|
||||
loadedfile = user_string($arg1)
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.method.entry - Fired just before a method implemented in Ruby is entered.
|
||||
*
|
||||
* @classname: Name of the class (string)
|
||||
* @methodname: The method about bo be executed (string)
|
||||
* @file: The file name where the method is being called (string)
|
||||
* @line: The line number where the method is being called (int)
|
||||
*/
|
||||
probe ruby.method.entry =
|
||||
process("@LIBRARY_PATH@").mark("method__entry")
|
||||
{
|
||||
classname = user_string($arg1)
|
||||
methodname = user_string($arg2)
|
||||
file = user_string($arg3)
|
||||
line = $arg4
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.method.return - Fired just after a method implemented in Ruby has returned.
|
||||
*
|
||||
* @classname: Name of the class (string)
|
||||
* @methodname: The executed method (string)
|
||||
* @file: The file name where the method is being called (string)
|
||||
* @line: The line number where the method is being called (int)
|
||||
*/
|
||||
probe ruby.method.return =
|
||||
process("@LIBRARY_PATH@").mark("method__return")
|
||||
{
|
||||
classname = user_string($arg1)
|
||||
methodname = user_string($arg2)
|
||||
file = user_string($arg3)
|
||||
line = $arg4
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.object.create - Allocation of new object.
|
||||
*
|
||||
* @classname: Name of the class (string)
|
||||
* @file: The file name where the method is being called (string)
|
||||
* @line: The line number where the method is being called (int)
|
||||
*/
|
||||
probe ruby.object.create =
|
||||
process("@LIBRARY_PATH@").mark("object__create")
|
||||
{
|
||||
classname = user_string($arg1)
|
||||
file = user_string($arg2)
|
||||
line = $arg3
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.parse.begin - Fired just before a Ruby source file is parsed.
|
||||
*
|
||||
* @parsedfile: The name of the file to be parsed (string)
|
||||
* @parsedline: The line number of beginning of parsing (int)
|
||||
*/
|
||||
probe ruby.parse.begin =
|
||||
process("@LIBRARY_PATH@").mark("parse__begin")
|
||||
{
|
||||
parsedfile = user_string($arg1)
|
||||
parsedline = $arg2
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.parse.end - Fired just after a Ruby source file was parsed.
|
||||
*
|
||||
* @parsedfile: The name of parsed the file (string)
|
||||
* @parsedline: The line number of beginning of parsing (int)
|
||||
*/
|
||||
probe ruby.parse.end =
|
||||
process("@LIBRARY_PATH@").mark("parse__end")
|
||||
{
|
||||
parsedfile = user_string($arg1)
|
||||
parsedline = $arg2
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.raise - Fired when an exception is raised.
|
||||
*
|
||||
* @classname: The class name of the raised exception (string)
|
||||
* @file: The name of the file where the exception was raised (string)
|
||||
* @line: The line number in the file where the exception was raised (int)
|
||||
*/
|
||||
probe ruby.raise =
|
||||
process("@LIBRARY_PATH@").mark("raise")
|
||||
{
|
||||
classname = user_string($arg1)
|
||||
file = user_string($arg2)
|
||||
line = $arg3
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.require.entry - Fired on calls to rb_require_safe (when a file
|
||||
* is required).
|
||||
*
|
||||
* @requiredfile: The name of the file to be required (string)
|
||||
* @file: The file that called "require" (string)
|
||||
* @line: The line number where the call to require was made(int)
|
||||
*/
|
||||
probe ruby.require.entry =
|
||||
process("@LIBRARY_PATH@").mark("require__entry")
|
||||
{
|
||||
requiredfile = user_string($arg1)
|
||||
file = user_string($arg2)
|
||||
line = $arg3
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.require.return - Fired just after require has finished
|
||||
* search of load path for suitable file to require.
|
||||
*
|
||||
* @requiredfile: The file that was required (string)
|
||||
*/
|
||||
probe ruby.require.return =
|
||||
process("@LIBRARY_PATH@").mark("require__return")
|
||||
{
|
||||
requiredfile = user_string($arg1)
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.string.create - Allocation of new string.
|
||||
*
|
||||
* @size: Number of elements (an int)
|
||||
* @file: The file name where the method is being called (string)
|
||||
* @line: The line number where the method is being called (int)
|
||||
*/
|
||||
probe ruby.string.create =
|
||||
process("@LIBRARY_PATH@").mark("string__create")
|
||||
{
|
||||
size = $arg1
|
||||
file = user_string($arg2)
|
||||
line = $arg3
|
||||
}
|
22
SOURCES/macros.ruby
Normal file
22
SOURCES/macros.ruby
Normal file
@ -0,0 +1,22 @@
|
||||
%ruby_libdir %{_datadir}/%{name}
|
||||
%ruby_libarchdir %{_libdir}/%{name}
|
||||
|
||||
# This is the local lib/arch and should not be used for packaging.
|
||||
%ruby_sitedir site_ruby
|
||||
%ruby_sitelibdir %{_prefix}/local/share/%{name}/%{ruby_sitedir}
|
||||
%ruby_sitearchdir %{_prefix}/local/%{_lib}/%{name}/%{ruby_sitedir}
|
||||
|
||||
# This is the general location for libs/archs compatible with all
|
||||
# or most of the Ruby versions available in the Fedora repositories.
|
||||
%ruby_vendordir vendor_ruby
|
||||
%ruby_vendorlibdir %{ruby_libdir}/%{ruby_vendordir}
|
||||
%ruby_vendorarchdir %{ruby_libarchdir}/%{ruby_vendordir}
|
||||
|
||||
# For ruby packages we want to filter out any provides caused by private
|
||||
# libs in %%{ruby_vendorarchdir}/%%{ruby_sitearchdir}.
|
||||
#
|
||||
# Note that this must be invoked in the spec file, preferably as
|
||||
# "%{?ruby_default_filter}", before any %description block.
|
||||
%ruby_default_filter %{expand: \
|
||||
%global __provides_exclude_from %{?__provides_exclude_from:%{__provides_exclude_from}|}^(%{ruby_vendorarchdir}|%{ruby_sitearchdir})/.*\\\\.so$ \
|
||||
}
|
186
SOURCES/macros.rubygems
Normal file
186
SOURCES/macros.rubygems
Normal file
@ -0,0 +1,186 @@
|
||||
# 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}/%{name}/%{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_plugin %{gem_dir}/plugins/%{gem_name}_plugin.rb
|
||||
|
||||
|
||||
# %gem_install - Install gem into appropriate directory.
|
||||
#
|
||||
# Usage: %gem_install [options]
|
||||
#
|
||||
# -n <gem_file> Overrides gem file name for installation.
|
||||
# -d <install_dir> Set installation directory.
|
||||
#
|
||||
%gem_install(d:n:) \
|
||||
mkdir -p %{-d*}%{!?-d:.%{gem_dir}} \
|
||||
\
|
||||
CONFIGURE_ARGS="--with-cflags='%{optflags}' --with-cxxflags='%{optflags}' --with-ldflags='%{build_ldflags}' $CONFIGURE_ARGS" \\\
|
||||
gem install \\\
|
||||
-V \\\
|
||||
--local \\\
|
||||
--build-root %{-d*}%{!?-d:.} \\\
|
||||
--force \\\
|
||||
--document=ri,rdoc \\\
|
||||
%{-n*}%{!?-n:%{gem_name}-%{version}%{?prerelease}.gem} \
|
||||
%{nil}
|
||||
|
||||
|
||||
# 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 <gem> [options] [requirements]
|
||||
#
|
||||
# Add dependency named <gem> 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 <gemspec_file> 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}%{?prerelease}.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 <gem> [options] [requirements]
|
||||
#
|
||||
# Remove dependency named <gem> 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 <gemspec_file> 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}%{?prerelease}.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] <file>
|
||||
#
|
||||
# Add files to .gemspec file. <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 <gemspec_file> 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}%{?prerelease}.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] <file>
|
||||
#
|
||||
# Remove files from .gemspec file. <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 <gemspec_file> 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}%{?prerelease}.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}
|
148
SOURCES/operating_system.rb
Normal file
148
SOURCES/operating_system.rb
Normal file
@ -0,0 +1,148 @@
|
||||
module Gem
|
||||
class << self
|
||||
|
||||
##
|
||||
# Returns full path of previous but one directory of dir in path
|
||||
# E.g. for '/usr/share/ruby', 'ruby', it returns '/usr'
|
||||
|
||||
def previous_but_one_dir_to(path, dir)
|
||||
return unless path
|
||||
|
||||
split_path = path.split(File::SEPARATOR)
|
||||
File.join(split_path.take_while { |one_dir| one_dir !~ /^#{dir}$/ }[0..-2])
|
||||
end
|
||||
private :previous_but_one_dir_to
|
||||
|
||||
##
|
||||
# Detects --install-dir option specified on command line.
|
||||
|
||||
def opt_install_dir?
|
||||
@opt_install_dir ||= ARGV.include?('--install-dir') || ARGV.include?('-i')
|
||||
end
|
||||
private :opt_install_dir?
|
||||
|
||||
##
|
||||
# Detects --build-root option specified on command line.
|
||||
|
||||
def opt_build_root?
|
||||
@opt_build_root ||= ARGV.include?('--build-root')
|
||||
end
|
||||
private :opt_build_root?
|
||||
|
||||
##
|
||||
# Tries to detect, if arguments and environment variables suggest that
|
||||
# 'gem install' is executed from rpmbuild.
|
||||
|
||||
def rpmbuild?
|
||||
@rpmbuild ||= ENV['RPM_PACKAGE_NAME'] && (opt_install_dir? || opt_build_root?)
|
||||
end
|
||||
private :rpmbuild?
|
||||
|
||||
##
|
||||
# Default gems locations allowed on FHS system (/usr, /usr/share).
|
||||
# The locations are derived from directories specified during build
|
||||
# configuration.
|
||||
|
||||
def default_locations
|
||||
@default_locations ||= {
|
||||
:system => previous_but_one_dir_to(RbConfig::CONFIG['vendordir'], RbConfig::CONFIG['RUBY_INSTALL_NAME']),
|
||||
:local => previous_but_one_dir_to(RbConfig::CONFIG['sitedir'], RbConfig::CONFIG['RUBY_INSTALL_NAME'])
|
||||
}
|
||||
end
|
||||
|
||||
##
|
||||
# For each location provides set of directories for binaries (:bin_dir)
|
||||
# platform independent (:gem_dir) and dependent (:ext_dir) files.
|
||||
|
||||
def default_dirs
|
||||
@libdir ||= case RUBY_PLATFORM
|
||||
when 'java'
|
||||
RbConfig::CONFIG['datadir']
|
||||
else
|
||||
RbConfig::CONFIG['libdir']
|
||||
end
|
||||
|
||||
@default_dirs ||= default_locations.inject(Hash.new) do |hash, location|
|
||||
destination, path = location
|
||||
|
||||
hash[destination] = if path
|
||||
{
|
||||
:bin_dir => File.join(path, RbConfig::CONFIG['bindir'].split(File::SEPARATOR).last),
|
||||
:gem_dir => File.join(path, RbConfig::CONFIG['datadir'].split(File::SEPARATOR).last, 'gems'),
|
||||
:ext_dir => File.join(path, @libdir.split(File::SEPARATOR).last, 'gems')
|
||||
}
|
||||
else
|
||||
{
|
||||
:bin_dir => '',
|
||||
:gem_dir => '',
|
||||
:ext_dir => ''
|
||||
}
|
||||
end
|
||||
|
||||
hash
|
||||
end
|
||||
end
|
||||
|
||||
##
|
||||
# Remove methods we are going to override. This avoids "method redefined;"
|
||||
# warnings otherwise issued by Ruby.
|
||||
|
||||
remove_method :operating_system_defaults if method_defined? :operating_system_defaults
|
||||
remove_method :default_dir if method_defined? :default_dir
|
||||
remove_method :default_path if method_defined? :default_path
|
||||
remove_method :default_ext_dir_for if method_defined? :default_ext_dir_for
|
||||
|
||||
##
|
||||
# Regular user installs into user directory, root manages /usr/local.
|
||||
|
||||
def operating_system_defaults
|
||||
unless opt_build_root?
|
||||
options = if Process.uid == 0
|
||||
"--install-dir=#{Gem.default_dirs[:local][:gem_dir]} --bindir #{Gem.default_dirs[:local][:bin_dir]}"
|
||||
else
|
||||
"--user-install --bindir #{File.join [Dir.home, 'bin']}"
|
||||
end
|
||||
|
||||
{"gem" => options}
|
||||
else
|
||||
{}
|
||||
end
|
||||
end
|
||||
|
||||
##
|
||||
# RubyGems default overrides.
|
||||
|
||||
def default_dir
|
||||
Gem.default_dirs[:system][:gem_dir]
|
||||
end
|
||||
|
||||
def default_path
|
||||
path = default_dirs.collect {|location, paths| paths[:gem_dir]}
|
||||
path.unshift Gem.user_dir if File.exist? Gem.user_home
|
||||
path
|
||||
end
|
||||
|
||||
def default_ext_dir_for base_dir
|
||||
dir = if rpmbuild?
|
||||
build_dir = base_dir.chomp Gem.default_dirs[:system][:gem_dir]
|
||||
if build_dir != base_dir
|
||||
File.join build_dir, Gem.default_dirs[:system][:ext_dir]
|
||||
end
|
||||
else
|
||||
dirs = Gem.default_dirs.detect {|location, paths| paths[:gem_dir] == base_dir}
|
||||
dirs && dirs.last[:ext_dir]
|
||||
end
|
||||
dir && File.join(dir, RbConfig::CONFIG['RUBY_INSTALL_NAME'])
|
||||
end
|
||||
|
||||
# This method should be available since RubyGems 2.2 until RubyGems 3.0.
|
||||
# https://github.com/rubygems/rubygems/issues/749
|
||||
if method_defined? :install_extension_in_lib
|
||||
remove_method :install_extension_in_lib
|
||||
|
||||
def install_extension_in_lib
|
||||
false
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
25
SOURCES/ruby-1.9.3-mkmf-verbose.patch
Normal file
25
SOURCES/ruby-1.9.3-mkmf-verbose.patch
Normal file
@ -0,0 +1,25 @@
|
||||
From 28cc0749d6729aa2444661ee7b411e183fe220b0 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Mon, 19 Nov 2012 15:14:51 +0100
|
||||
Subject: [PATCH] Verbose mkmf.
|
||||
|
||||
---
|
||||
lib/mkmf.rb | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/lib/mkmf.rb b/lib/mkmf.rb
|
||||
index 682eb46..e6b1445 100644
|
||||
--- a/lib/mkmf.rb
|
||||
+++ b/lib/mkmf.rb
|
||||
@@ -1974,7 +1974,7 @@ def configuration(srcdir)
|
||||
SHELL = /bin/sh
|
||||
|
||||
# V=0 quiet, V=1 verbose. other values don't work.
|
||||
-V = 0
|
||||
+V = 1
|
||||
V0 = $(V:0=)
|
||||
Q1 = $(V:1=)
|
||||
Q = $(Q1:0=@)
|
||||
--
|
||||
1.8.3.1
|
||||
|
28
SOURCES/ruby-2.1.0-Enable-configuration-of-archlibdir.patch
Normal file
28
SOURCES/ruby-2.1.0-Enable-configuration-of-archlibdir.patch
Normal file
@ -0,0 +1,28 @@
|
||||
From 07c666ba5c3360dd6f43605a8ac7c85c99c1721f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Tue, 1 Oct 2013 12:22:40 +0200
|
||||
Subject: [PATCH] Allow to configure libruby.so placement.
|
||||
|
||||
---
|
||||
configure.ac | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index d261ea57b5..3c13076b82 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -3368,6 +3368,11 @@ AS_IF([test ${multiarch+set}], [
|
||||
])
|
||||
|
||||
archlibdir='${libdir}/${arch}'
|
||||
+AC_ARG_WITH(archlibdir,
|
||||
+ AS_HELP_STRING([--with-archlibdir=DIR],
|
||||
+ [prefix for libruby [[LIBDIR/ARCH]]]),
|
||||
+ [archlibdir="$withval"])
|
||||
+
|
||||
sitearchlibdir='${libdir}/${sitearch}'
|
||||
archincludedir='${includedir}/${arch}'
|
||||
sitearchincludedir='${includedir}/${sitearch}'
|
||||
--
|
||||
2.22.0
|
||||
|
@ -0,0 +1,80 @@
|
||||
From e24d97c938c481450ed80ec83e5399595946c1ae Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Fri, 8 Feb 2013 22:48:41 +0100
|
||||
Subject: [PATCH] Prevent duplicated paths when empty version string is
|
||||
configured.
|
||||
|
||||
---
|
||||
configure.ac | 3 ++-
|
||||
loadpath.c | 12 ++++++++++++
|
||||
tool/mkconfig.rb | 2 +-
|
||||
3 files changed, 15 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index c42436c23d..d261ea57b5 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -4026,7 +4026,8 @@ AS_CASE(["$ruby_version_dir_name"],
|
||||
ruby_version_dir=/'${ruby_version_dir_name}'
|
||||
|
||||
if test -z "${ruby_version_dir_name}"; then
|
||||
- AC_MSG_ERROR([No ruby version, No place for bundled libraries])
|
||||
+ unset ruby_version_dir
|
||||
+ AC_DEFINE(RUBY_LIB_VERSION_BLANK, 1)
|
||||
fi
|
||||
|
||||
rubylibdir='${rubylibprefix}'${ruby_version_dir}
|
||||
diff --git a/loadpath.c b/loadpath.c
|
||||
index 9160031..0d4d953 100644
|
||||
--- a/loadpath.c
|
||||
+++ b/loadpath.c
|
||||
@@ -65,21 +65,33 @@ const char ruby_initial_load_paths[] =
|
||||
RUBY_SEARCH_PATH "\0"
|
||||
#endif
|
||||
#ifndef NO_RUBY_SITE_LIB
|
||||
+#ifdef RUBY_LIB_VERSION_BLANK
|
||||
+ RUBY_SITE_LIB "\0"
|
||||
+#else
|
||||
RUBY_SITE_LIB2 "\0"
|
||||
+#endif
|
||||
#ifdef RUBY_THINARCH
|
||||
RUBY_SITE_ARCH_LIB_FOR(RUBY_THINARCH) "\0"
|
||||
#endif
|
||||
RUBY_SITE_ARCH_LIB_FOR(RUBY_SITEARCH) "\0"
|
||||
+#ifndef RUBY_LIB_VERSION_BLANK
|
||||
RUBY_SITE_LIB "\0"
|
||||
#endif
|
||||
+#endif
|
||||
|
||||
#ifndef NO_RUBY_VENDOR_LIB
|
||||
+#ifdef RUBY_LIB_VERSION_BLANK
|
||||
+ RUBY_VENDOR_LIB "\0"
|
||||
+#else
|
||||
RUBY_VENDOR_LIB2 "\0"
|
||||
+#endif
|
||||
#ifdef RUBY_THINARCH
|
||||
RUBY_VENDOR_ARCH_LIB_FOR(RUBY_THINARCH) "\0"
|
||||
#endif
|
||||
RUBY_VENDOR_ARCH_LIB_FOR(RUBY_SITEARCH) "\0"
|
||||
+#ifndef RUBY_LIB_VERSION_BLANK
|
||||
RUBY_VENDOR_LIB "\0"
|
||||
+#endif
|
||||
#endif
|
||||
|
||||
RUBY_LIB "\0"
|
||||
diff --git a/tool/mkconfig.rb b/tool/mkconfig.rb
|
||||
index 07076d4..35e6c3c 100755
|
||||
--- a/tool/mkconfig.rb
|
||||
+++ b/tool/mkconfig.rb
|
||||
@@ -115,7 +115,7 @@
|
||||
val = val.gsub(/\$(?:\$|\{?(\w+)\}?)/) {$1 ? "$(#{$1})" : $&}.dump
|
||||
case name
|
||||
when /^prefix$/
|
||||
- val = "(TOPDIR || DESTDIR + #{val})"
|
||||
+ val = "(((TOPDIR && TOPDIR.empty?) ? nil : TOPDIR) || DESTDIR + #{val})"
|
||||
when /^ARCH_FLAG$/
|
||||
val = "arch_flag || #{val}" if universal
|
||||
when /^UNIVERSAL_ARCHNAMES$/
|
||||
--
|
||||
1.9.0
|
||||
|
25
SOURCES/ruby-2.1.0-always-use-i386.patch
Normal file
25
SOURCES/ruby-2.1.0-always-use-i386.patch
Normal file
@ -0,0 +1,25 @@
|
||||
From 2089cab72b38d6d5e7ba2b596e41014209acad30 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Mon, 19 Nov 2012 14:37:28 +0100
|
||||
Subject: [PATCH] Always use i386.
|
||||
|
||||
---
|
||||
configure.ac | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 3c13076b82..93af30321d 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -4090,6 +4090,8 @@ AC_SUBST(vendorarchdir)dnl
|
||||
AC_SUBST(CONFIGURE, "`echo $0 | sed 's|.*/||'`")dnl
|
||||
AC_SUBST(configure_args, "`echo "${ac_configure_args}" | sed 's/\\$/$$/g'`")dnl
|
||||
|
||||
+target_cpu=`echo $target_cpu | sed s/i.86/i386/`
|
||||
+
|
||||
AS_IF([test "${universal_binary-no}" = yes ], [
|
||||
arch="universal-${target_os}"
|
||||
AS_IF([test "${rb_cv_architecture_available}" = yes], [
|
||||
--
|
||||
1.8.3.1
|
||||
|
97
SOURCES/ruby-2.1.0-custom-rubygems-location.patch
Normal file
97
SOURCES/ruby-2.1.0-custom-rubygems-location.patch
Normal file
@ -0,0 +1,97 @@
|
||||
From 94da59aafacc6a9efe829529eb51385588d6f149 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Fri, 11 Nov 2011 13:14:45 +0100
|
||||
Subject: [PATCH] Allow to install RubyGems into custom location, outside of
|
||||
Ruby tree.
|
||||
|
||||
---
|
||||
configure.ac | 5 +++++
|
||||
loadpath.c | 4 ++++
|
||||
template/verconf.h.tmpl | 3 +++
|
||||
tool/rbinstall.rb | 10 ++++++++++
|
||||
4 files changed, 22 insertions(+)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 93af30321d..bc13397e0e 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -4062,6 +4062,10 @@ AC_ARG_WITH(vendorarchdir,
|
||||
[vendorarchdir=$withval],
|
||||
[vendorarchdir=${multiarch+'${rubysitearchprefix}/vendor_ruby'${ruby_version_dir}}${multiarch-'${vendorlibdir}/${sitearch}'}])
|
||||
|
||||
+AC_ARG_WITH(rubygemsdir,
|
||||
+ AS_HELP_STRING([--with-rubygemsdir=DIR], [custom rubygems directory]),
|
||||
+ [rubygemsdir=$withval])
|
||||
+
|
||||
AS_IF([test "${LOAD_RELATIVE+set}"], [
|
||||
AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
|
||||
RUBY_EXEC_PREFIX=''
|
||||
@@ -4086,6 +4090,7 @@ AC_SUBST(sitearchdir)dnl
|
||||
AC_SUBST(vendordir)dnl
|
||||
AC_SUBST(vendorlibdir)dnl
|
||||
AC_SUBST(vendorarchdir)dnl
|
||||
+AC_SUBST(rubygemsdir)dnl
|
||||
|
||||
AC_SUBST(CONFIGURE, "`echo $0 | sed 's|.*/||'`")dnl
|
||||
AC_SUBST(configure_args, "`echo "${ac_configure_args}" | sed 's/\\$/$$/g'`")dnl
|
||||
diff --git a/loadpath.c b/loadpath.c
|
||||
index 623dc9d..74c5d9e 100644
|
||||
--- a/loadpath.c
|
||||
+++ b/loadpath.c
|
||||
@@ -94,6 +94,10 @@ const char ruby_initial_load_paths[] =
|
||||
#endif
|
||||
#endif
|
||||
|
||||
+#ifdef RUBYGEMS_DIR
|
||||
+ RUBYGEMS_DIR "\0"
|
||||
+#endif
|
||||
+
|
||||
RUBY_LIB "\0"
|
||||
#ifdef RUBY_THINARCH
|
||||
RUBY_ARCH_LIB_FOR(RUBY_THINARCH) "\0"
|
||||
diff --git a/template/verconf.h.tmpl b/template/verconf.h.tmpl
|
||||
index 79c003e..34f2382 100644
|
||||
--- a/template/verconf.h.tmpl
|
||||
+++ b/template/verconf.h.tmpl
|
||||
@@ -36,6 +36,9 @@
|
||||
% if C["RUBY_SEARCH_PATH"]
|
||||
#define RUBY_SEARCH_PATH "${RUBY_SEARCH_PATH}"
|
||||
% end
|
||||
+% if C["rubygemsdir"]
|
||||
+#define RUBYGEMS_DIR "${rubygemsdir}"
|
||||
+% end
|
||||
%
|
||||
% R = {}
|
||||
% R["ruby_version"] = '"RUBY_LIB_VERSION"'
|
||||
diff --git a/tool/rbinstall.rb b/tool/rbinstall.rb
|
||||
index e9110a17ca..76a1f0a315 100755
|
||||
--- a/tool/rbinstall.rb
|
||||
+++ b/tool/rbinstall.rb
|
||||
@@ -359,6 +359,7 @@ def CONFIG.[](name, mandatory = false)
|
||||
vendorlibdir = CONFIG["vendorlibdir"]
|
||||
vendorarchlibdir = CONFIG["vendorarchdir"]
|
||||
end
|
||||
+rubygemsdir = CONFIG["rubygemsdir"]
|
||||
mandir = CONFIG["mandir", true]
|
||||
docdir = CONFIG["docdir", true]
|
||||
enable_shared = CONFIG["ENABLE_SHARED"] == 'yes'
|
||||
@@ -590,7 +591,16 @@ def stub
|
||||
install?(:local, :comm, :lib) do
|
||||
prepare "library scripts", rubylibdir
|
||||
noinst = %w[*.txt *.rdoc *.gemspec]
|
||||
+ # Bundler carries "rubygems.rb" file, so it must be specialcased :/
|
||||
+ noinst += %w[rubygems.rb rubygems/ bundler.rb bundler/] if rubygemsdir
|
||||
install_recursive(File.join(srcdir, "lib"), rubylibdir, :no_install => noinst, :mode => $data_mode)
|
||||
+ if rubygemsdir
|
||||
+ noinst = %w[*.txt *.rdoc *.gemspec]
|
||||
+ install_recursive(File.join(srcdir, "lib", "rubygems"), File.join(rubygemsdir, "rubygems"), :no_install => noinst, :mode => $data_mode)
|
||||
+ install(File.join(srcdir, "lib", "rubygems.rb"), File.join(rubygemsdir, "rubygems.rb"), :mode => $data_mode)
|
||||
+ install_recursive(File.join(srcdir, "lib", "bundler"), File.join(rubylibdir, "bundler"), :no_install => noinst, :mode => $data_mode)
|
||||
+ install(File.join(srcdir, "lib", "bundler.rb"), rubylibdir, :mode => $data_mode)
|
||||
+ end
|
||||
end
|
||||
|
||||
install?(:local, :comm, :hdr, :'comm-hdr') do
|
||||
--
|
||||
1.8.3.1
|
||||
|
281
SOURCES/ruby-2.3.0-ruby_version.patch
Normal file
281
SOURCES/ruby-2.3.0-ruby_version.patch
Normal file
@ -0,0 +1,281 @@
|
||||
From 4fc1be3af3f58621bb751c9e63c208b15c0e8d16 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Tue, 31 Mar 2015 16:21:04 +0200
|
||||
Subject: [PATCH 1/4] Use ruby_version_dir_name for versioned directories.
|
||||
|
||||
This disallows changing the ruby_version constant by --with-ruby-version
|
||||
configuration options. The two places version numbers are disallowed as
|
||||
well, since there are a lot of places which cannot handle this format
|
||||
properly.
|
||||
|
||||
ruby_version_dir_name now specifies custom version string for versioned
|
||||
directories, e.g. instead of default X.Y.Z, you can specify whatever
|
||||
string.
|
||||
---
|
||||
configure.ac | 64 ++++++++++++++++++++++++---------------------
|
||||
template/ruby.pc.in | 1 +
|
||||
2 files changed, 35 insertions(+), 30 deletions(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 80b137e380..63cd3b4f8b 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -3977,9 +3977,6 @@ AS_CASE(["$target_os"],
|
||||
rubyw_install_name='$(RUBYW_INSTALL_NAME)'
|
||||
])
|
||||
|
||||
-rubylibdir='${rubylibprefix}/${ruby_version}'
|
||||
-rubyarchdir=${multiarch+'${rubyarchprefix}/${ruby_version}'}${multiarch-'${rubylibdir}/${arch}'}
|
||||
-
|
||||
rubyarchprefix=${multiarch+'${archlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${arch}'}
|
||||
AC_ARG_WITH(rubyarchprefix,
|
||||
AS_HELP_STRING([--with-rubyarchprefix=DIR],
|
||||
@@ -4002,56 +3999,62 @@ AC_ARG_WITH(ridir,
|
||||
AC_SUBST(ridir)
|
||||
AC_SUBST(RI_BASE_NAME)
|
||||
|
||||
-AC_ARG_WITH(ruby-version,
|
||||
- AS_HELP_STRING([--with-ruby-version=STR], [ruby version string for version specific directories [[full]] (full|minor|STR)]),
|
||||
- [ruby_version=$withval],
|
||||
- [ruby_version=full])
|
||||
unset RUBY_LIB_VERSION
|
||||
-unset RUBY_LIB_VERSION_STYLE
|
||||
-AS_CASE(["$ruby_version"],
|
||||
- [full], [RUBY_LIB_VERSION_STYLE='3 /* full */'],
|
||||
- [minor], [RUBY_LIB_VERSION_STYLE='2 /* minor */'])
|
||||
-AS_IF([test ${RUBY_LIB_VERSION_STYLE+set}], [
|
||||
- {
|
||||
- echo "#define RUBY_LIB_VERSION_STYLE $RUBY_LIB_VERSION_STYLE"
|
||||
- echo '#define STRINGIZE(x) x'
|
||||
- test -f revision.h -o -f "${srcdir}/revision.h" || echo '#define RUBY_REVISION 0'
|
||||
- echo '#include "version.h"'
|
||||
- echo 'ruby_version=RUBY_LIB_VERSION'
|
||||
- } > conftest.c
|
||||
- ruby_version="`$CPP -I. -I"${srcdir}" -I"${srcdir}/include" conftest.c | sed '/^ruby_version=/!d;s/ //g'`"
|
||||
- eval $ruby_version
|
||||
-], [test -z "${ruby_version}"], [
|
||||
- AC_MSG_ERROR([No ruby version, No place for bundled libraries])
|
||||
-], [
|
||||
- RUBY_LIB_VERSION="${ruby_version}"
|
||||
-])
|
||||
+RUBY_LIB_VERSION_STYLE='3 /* full */'
|
||||
+{
|
||||
+echo "#define RUBY_LIB_VERSION_STYLE $RUBY_LIB_VERSION_STYLE"
|
||||
+echo '#define STRINGIZE(x) x'
|
||||
+test -f revision.h -o -f "${srcdir}/revision.h" || echo '#define RUBY_REVISION 0'
|
||||
+echo '#include "version.h"'
|
||||
+echo 'ruby_version=RUBY_LIB_VERSION'
|
||||
+} > conftest.c
|
||||
+ruby_version="`$CPP -I. -I"${srcdir}" -I"${srcdir}/include" conftest.c | sed '/^ruby_version=/!d;s/ //g'`"
|
||||
+eval $ruby_version
|
||||
+
|
||||
+RUBY_LIB_VERSION="${ruby_version}"
|
||||
+
|
||||
AC_SUBST(RUBY_LIB_VERSION_STYLE)
|
||||
AC_SUBST(RUBY_LIB_VERSION)
|
||||
|
||||
+AC_ARG_WITH(ruby-version,
|
||||
+ AS_HELP_STRING([--with-ruby-version=STR], [ruby version string for version specific directories [[full]] (full|STR)]),
|
||||
+ [ruby_version_dir_name=$withval],
|
||||
+ [ruby_version_dir_name=full])
|
||||
+AS_CASE(["$ruby_version_dir_name"],
|
||||
+ [full], [ruby_version_dir_name='${ruby_version}'])
|
||||
+
|
||||
+ruby_version_dir=/'${ruby_version_dir_name}'
|
||||
+
|
||||
+if test -z "${ruby_version_dir_name}"; then
|
||||
+ AC_MSG_ERROR([No ruby version, No place for bundled libraries])
|
||||
+fi
|
||||
+
|
||||
+rubylibdir='${rubylibprefix}'${ruby_version_dir}
|
||||
+rubyarchdir=${multiarch+'${rubyarchprefix}'${ruby_version_dir}}${multiarch-'${rubylibdir}/${arch}'}
|
||||
+
|
||||
AC_ARG_WITH(sitedir,
|
||||
AS_HELP_STRING([--with-sitedir=DIR], [site libraries in DIR [[RUBY_LIB_PREFIX/site_ruby]], "no" to disable site directory]),
|
||||
[sitedir=$withval],
|
||||
[sitedir='${rubylibprefix}/site_ruby'])
|
||||
-sitelibdir='${sitedir}/${ruby_version}'
|
||||
+sitelibdir='${sitedir}'${ruby_version_dir}
|
||||
|
||||
AC_ARG_WITH(sitearchdir,
|
||||
AS_HELP_STRING([--with-sitearchdir=DIR],
|
||||
[architecture dependent site libraries in DIR [[SITEDIR/SITEARCH]], "no" to disable site directory]),
|
||||
[sitearchdir=$withval],
|
||||
- [sitearchdir=${multiarch+'${rubysitearchprefix}/site_ruby/${ruby_version}'}${multiarch-'${sitelibdir}/${sitearch}'}])
|
||||
+ [sitearchdir=${multiarch+'${rubysitearchprefix}/site_ruby'${ruby_version_dir}}${multiarch-'${sitelibdir}/${sitearch}'}])
|
||||
|
||||
AC_ARG_WITH(vendordir,
|
||||
AS_HELP_STRING([--with-vendordir=DIR], [vendor libraries in DIR [[RUBY_LIB_PREFIX/vendor_ruby]], "no" to disable vendor directory]),
|
||||
[vendordir=$withval],
|
||||
[vendordir='${rubylibprefix}/vendor_ruby'])
|
||||
-vendorlibdir='${vendordir}/${ruby_version}'
|
||||
+vendorlibdir='${vendordir}'${ruby_version_dir}
|
||||
|
||||
AC_ARG_WITH(vendorarchdir,
|
||||
AS_HELP_STRING([--with-vendorarchdir=DIR],
|
||||
[architecture dependent vendor libraries in DIR [[VENDORDIR/SITEARCH]], "no" to disable vendor directory]),
|
||||
[vendorarchdir=$withval],
|
||||
- [vendorarchdir=${multiarch+'${rubysitearchprefix}/vendor_ruby/${ruby_version}'}${multiarch-'${vendorlibdir}/${sitearch}'}])
|
||||
+ [vendorarchdir=${multiarch+'${rubysitearchprefix}/vendor_ruby'${ruby_version_dir}}${multiarch-'${vendorlibdir}/${sitearch}'}])
|
||||
|
||||
AS_IF([test "${LOAD_RELATIVE+set}"], [
|
||||
AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
|
||||
@@ -4068,6 +4071,7 @@ AC_SUBST(sitearchincludedir)dnl
|
||||
AC_SUBST(arch)dnl
|
||||
AC_SUBST(sitearch)dnl
|
||||
AC_SUBST(ruby_version)dnl
|
||||
+AC_SUBST(ruby_version_dir_name)dnl
|
||||
AC_SUBST(rubylibdir)dnl
|
||||
AC_SUBST(rubyarchdir)dnl
|
||||
AC_SUBST(sitedir)dnl
|
||||
diff --git a/template/ruby.pc.in b/template/ruby.pc.in
|
||||
index 8a2c066..c81b211 100644
|
||||
--- a/template/ruby.pc.in
|
||||
+++ b/template/ruby.pc.in
|
||||
@@ -2,6 +2,7 @@ MAJOR=@MAJOR@
|
||||
MINOR=@MINOR@
|
||||
TEENY=@TEENY@
|
||||
ruby_version=@ruby_version@
|
||||
+ruby_version_dir_name=@ruby_version_dir_name@
|
||||
RUBY_API_VERSION=@RUBY_API_VERSION@
|
||||
RUBY_PROGRAM_VERSION=@RUBY_PROGRAM_VERSION@
|
||||
arch=@arch@
|
||||
--
|
||||
2.1.0
|
||||
|
||||
|
||||
From 518850aba6eee76de7715aae8d37330e34b01983 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Tue, 31 Mar 2015 16:37:26 +0200
|
||||
Subject: [PATCH 2/4] Add ruby_version_dir_name support for RDoc.
|
||||
|
||||
---
|
||||
lib/rdoc/ri/paths.rb | 2 +-
|
||||
tool/rbinstall.rb | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/lib/rdoc/ri/paths.rb b/lib/rdoc/ri/paths.rb
|
||||
index 970cb91..5bf8230 100644
|
||||
--- a/lib/rdoc/ri/paths.rb
|
||||
+++ b/lib/rdoc/ri/paths.rb
|
||||
@@ -10,7 +10,7 @@ module RDoc::RI::Paths
|
||||
#:stopdoc:
|
||||
require 'rbconfig'
|
||||
|
||||
- version = RbConfig::CONFIG['ruby_version']
|
||||
+ version = RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
|
||||
|
||||
BASE = File.join RbConfig::CONFIG['ridir'], version
|
||||
|
||||
diff --git a/tool/rbinstall.rb b/tool/rbinstall.rb
|
||||
index d4c110e..d39c9a6 100755
|
||||
--- a/tool/rbinstall.rb
|
||||
+++ b/tool/rbinstall.rb
|
||||
@@ -448,7 +448,7 @@ def CONFIG.[](name, mandatory = false)
|
||||
|
||||
install?(:doc, :rdoc) do
|
||||
if $rdocdir
|
||||
- ridatadir = File.join(CONFIG['ridir'], CONFIG['ruby_version'], "system")
|
||||
+ ridatadir = File.join(CONFIG['ridir'], CONFIG['ruby_version_dir_name'] || CONFIG['ruby_version'], "system")
|
||||
prepare "rdoc", ridatadir
|
||||
install_recursive($rdocdir, ridatadir, :no_install => rdoc_noinst, :mode => $data_mode)
|
||||
end
|
||||
--
|
||||
2.23.0
|
||||
|
||||
|
||||
From 9f0ec0233f618cbb862629816b22491c3df79578 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Tue, 31 Mar 2015 16:37:44 +0200
|
||||
Subject: [PATCH 3/4] Add ruby_version_dir_name support for RubyGems.
|
||||
|
||||
---
|
||||
lib/rubygems/defaults.rb | 7 ++++---
|
||||
test/rubygems/test_gem.rb | 5 +++--
|
||||
2 files changed, 7 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/lib/rubygems/defaults.rb b/lib/rubygems/defaults.rb
|
||||
index d4ff4a262c..3f9a5bf590 100644
|
||||
--- a/lib/rubygems/defaults.rb
|
||||
+++ b/lib/rubygems/defaults.rb
|
||||
@@ -34,7 +34,7 @@ def self.default_spec_cache_dir
|
||||
# specified in the environment
|
||||
|
||||
def self.default_dir
|
||||
- @default_dir ||= File.join(RbConfig::CONFIG['rubylibprefix'], 'gems', RbConfig::CONFIG['ruby_version'])
|
||||
+ @default_dir ||= File.join(RbConfig::CONFIG['rubylibprefix'], 'gems', RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version'])
|
||||
end
|
||||
|
||||
##
|
||||
@@ -103,7 +103,8 @@ def self.user_dir
|
||||
gem_dir = File.join(Gem.user_home, ".gem")
|
||||
gem_dir = File.join(Gem.data_home, "gem") unless File.exist?(gem_dir)
|
||||
parts = [gem_dir, ruby_engine]
|
||||
- parts << RbConfig::CONFIG['ruby_version'] unless RbConfig::CONFIG['ruby_version'].empty?
|
||||
+ ruby_version_dir_name = RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
|
||||
+ parts << ruby_version_dir_name unless ruby_version_dir_name.empty?
|
||||
File.join parts
|
||||
end
|
||||
|
||||
@@ -234,7 +235,7 @@ def self.vendor_dir # :nodoc:
|
||||
return nil unless RbConfig::CONFIG.key? 'vendordir'
|
||||
|
||||
File.join RbConfig::CONFIG['vendordir'], 'gems',
|
||||
- RbConfig::CONFIG['ruby_version']
|
||||
+ RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
|
||||
end
|
||||
|
||||
##
|
||||
diff --git a/test/rubygems/test_gem.rb b/test/rubygems/test_gem.rb
|
||||
index b25068405d..e9fef4a311 100644
|
||||
--- a/test/rubygems/test_gem.rb
|
||||
+++ b/test/rubygems/test_gem.rb
|
||||
@@ -1410,7 +1410,8 @@ def test_self_use_paths
|
||||
|
||||
def test_self_user_dir
|
||||
parts = [@userhome, '.gem', Gem.ruby_engine]
|
||||
- parts << RbConfig::CONFIG['ruby_version'] unless RbConfig::CONFIG['ruby_version'].empty?
|
||||
+ ruby_version_dir_name = RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
|
||||
+ parts << ruby_version_dir_name unless ruby_version_dir_name.empty?
|
||||
|
||||
FileUtils.mkdir_p File.join(parts)
|
||||
|
||||
@@ -1486,7 +1487,7 @@ def test_self_vendor_dir
|
||||
vendordir(File.join(@tempdir, 'vendor')) do
|
||||
expected =
|
||||
File.join RbConfig::CONFIG['vendordir'], 'gems',
|
||||
- RbConfig::CONFIG['ruby_version']
|
||||
+ RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
|
||||
|
||||
assert_equal expected, Gem.vendor_dir
|
||||
end
|
||||
--
|
||||
2.1.0
|
||||
|
||||
|
||||
From 88c38a030c22dbf9422ece847bdfbf87d6659313 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Wed, 1 Apr 2015 14:55:37 +0200
|
||||
Subject: [PATCH 4/4] Let headers directories follow the configured version
|
||||
name.
|
||||
|
||||
---
|
||||
configure.ac | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index a00f2b6776..999e2d6d5d 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -108,7 +108,7 @@ RUBY_BASE_NAME=`echo ruby | sed "$program_transform_name"`
|
||||
RUBYW_BASE_NAME=`echo rubyw | sed "$program_transform_name"`
|
||||
AC_SUBST(RUBY_BASE_NAME)
|
||||
AC_SUBST(RUBYW_BASE_NAME)
|
||||
-AC_SUBST(RUBY_VERSION_NAME, '${RUBY_BASE_NAME}-${ruby_version}')
|
||||
+AC_SUBST(RUBY_VERSION_NAME, '${RUBY_BASE_NAME}-${ruby_version_dir_name}')
|
||||
|
||||
dnl checks for alternative programs
|
||||
AC_CANONICAL_BUILD
|
||||
--
|
||||
2.1.0
|
||||
|
77
SOURCES/ruby-2.7.0-Initialize-ABRT-hook.patch
Normal file
77
SOURCES/ruby-2.7.0-Initialize-ABRT-hook.patch
Normal file
@ -0,0 +1,77 @@
|
||||
From eca084e4079c77c061045df9c21b219175b05228 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Mon, 6 Jan 2020 13:56:04 +0100
|
||||
Subject: [PATCH] Initialize ABRT hook.
|
||||
|
||||
The ABRT hook used to be initialized by preludes via patches [[1], [2]].
|
||||
Unfortunately, due to [[3]] and especially since [[4]], this would
|
||||
require boostrapping [[5]].
|
||||
|
||||
To keep the things simple for now, load the ABRT hook via C.
|
||||
|
||||
[1]: https://bugs.ruby-lang.org/issues/8566
|
||||
[2]: https://bugs.ruby-lang.org/issues/15306
|
||||
[3]: https://bugs.ruby-lang.org/issues/16254
|
||||
[4]: https://github.com/ruby/ruby/pull/2735
|
||||
[5]: https://lists.fedoraproject.org/archives/list/ruby-sig@lists.fedoraproject.org/message/LH6L6YJOYQT4Y5ZNOO4SLIPTUWZ5V45Q/
|
||||
---
|
||||
abrt.c | 12 ++++++++++++
|
||||
common.mk | 3 ++-
|
||||
ruby.c | 4 ++++
|
||||
3 files changed, 18 insertions(+), 1 deletion(-)
|
||||
create mode 100644 abrt.c
|
||||
|
||||
diff --git a/abrt.c b/abrt.c
|
||||
new file mode 100644
|
||||
index 0000000000..74b0bd5c0f
|
||||
--- /dev/null
|
||||
+++ b/abrt.c
|
||||
@@ -0,0 +1,12 @@
|
||||
+#include "internal.h"
|
||||
+
|
||||
+void
|
||||
+Init_abrt(void)
|
||||
+{
|
||||
+ rb_eval_string(
|
||||
+ " begin\n"
|
||||
+ " require 'abrt'\n"
|
||||
+ " rescue LoadError\n"
|
||||
+ " end\n"
|
||||
+ );
|
||||
+}
|
||||
diff --git a/common.mk b/common.mk
|
||||
index b2e5b2b6d0..f39f81da5c 100644
|
||||
--- a/common.mk
|
||||
+++ b/common.mk
|
||||
@@ -82,7 +82,8 @@ ENC_MK = enc.mk
|
||||
MAKE_ENC = -f $(ENC_MK) V="$(V)" UNICODE_HDR_DIR="$(UNICODE_HDR_DIR)" \
|
||||
RUBY="$(MINIRUBY)" MINIRUBY="$(MINIRUBY)" $(mflags)
|
||||
|
||||
-COMMONOBJS = array.$(OBJEXT) \
|
||||
+COMMONOBJS = abrt.$(OBJEXT) \
|
||||
+ array.$(OBJEXT) \
|
||||
ast.$(OBJEXT) \
|
||||
bignum.$(OBJEXT) \
|
||||
class.$(OBJEXT) \
|
||||
diff --git a/ruby.c b/ruby.c
|
||||
index 60c57d6259..1eec16f2c8 100644
|
||||
--- a/ruby.c
|
||||
+++ b/ruby.c
|
||||
@@ -1611,10 +1611,14 @@ proc_options(long argc, char **argv, ruby_cmdline_options_t *opt, int envopt)
|
||||
|
||||
void Init_builtin_features(void);
|
||||
|
||||
+/* abrt.c */
|
||||
+void Init_abrt(void);
|
||||
+
|
||||
static void
|
||||
ruby_init_prelude(void)
|
||||
{
|
||||
Init_builtin_features();
|
||||
+ Init_abrt();
|
||||
rb_const_remove(rb_cObject, rb_intern_const("TMP_RUBY_PREFIX"));
|
||||
}
|
||||
|
||||
--
|
||||
2.24.1
|
||||
|
@ -0,0 +1,34 @@
|
||||
From 9b42fce32bff25e0569581f76f532b9d57865aef Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Mon, 27 Jul 2020 14:56:05 +0200
|
||||
Subject: [PATCH] Timeout the test_bug_reporter_add witout raising error.
|
||||
|
||||
While timeouting the threads might be still good idea, it does not seems
|
||||
the timeout impacts the TestBugReporter#test_bug_reporter_add result,
|
||||
because the output of the child process has been already collected
|
||||
earlier.
|
||||
|
||||
It seems that when the system is under heavy load, the thread might not
|
||||
be sheduled to finish its processing. Even finishing the child process
|
||||
might take tens of seconds and therefore the test case finish might take
|
||||
a while.
|
||||
---
|
||||
test/-ext-/bug_reporter/test_bug_reporter.rb | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/test/-ext-/bug_reporter/test_bug_reporter.rb b/test/-ext-/bug_reporter/test_bug_reporter.rb
|
||||
index 628fcd0340..2c677cc8a7 100644
|
||||
--- a/test/-ext-/bug_reporter/test_bug_reporter.rb
|
||||
+++ b/test/-ext-/bug_reporter/test_bug_reporter.rb
|
||||
@@ -22,7 +22,7 @@ def test_bug_reporter_add
|
||||
args = ["--disable-gems", "-r-test-/bug_reporter",
|
||||
"-C", tmpdir]
|
||||
stdin = "register_sample_bug_reporter(12345); Process.kill :SEGV, $$"
|
||||
- assert_in_out_err(args, stdin, [], expected_stderr, encoding: "ASCII-8BIT")
|
||||
+ assert_in_out_err(args, stdin, [], expected_stderr, encoding: "ASCII-8BIT", timeout_error: nil)
|
||||
ensure
|
||||
FileUtils.rm_rf(tmpdir) if tmpdir
|
||||
end
|
||||
--
|
||||
2.27.0
|
||||
|
@ -0,0 +1,43 @@
|
||||
From 0ade5611df9f981005eed32b369d1e699e520221 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Thu, 10 Feb 2022 13:26:44 +0100
|
||||
Subject: [PATCH] Don't query `RubyVM::FrozenCore` for class path.
|
||||
|
||||
The `RubyVM::FrozenCore` class path is corrupted during GC cycle and
|
||||
returns random garbage, which might result in segfault.
|
||||
|
||||
But since it is easy to detect the `RubyVM::FrozenCore`, just provide
|
||||
the class path explicitly as a workaround.
|
||||
|
||||
Other possibility would be to ignore `RubyVM::FrozenCore` simlarly as
|
||||
TracePoint API does:
|
||||
|
||||
https://github.com/ruby/ruby/blob/46f6575157d4c2f6bbd5693896e26a65037e5552/vm_trace.c#L411
|
||||
---
|
||||
vm.c | 10 +++++++++-
|
||||
1 file changed, 9 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/vm.c b/vm.c
|
||||
index 8ce8b279d4..3d189fa63a 100644
|
||||
--- a/vm.c
|
||||
+++ b/vm.c
|
||||
@@ -479,7 +479,15 @@ rb_dtrace_setup(rb_execution_context_t *ec, VALUE klass, ID id,
|
||||
}
|
||||
type = BUILTIN_TYPE(klass);
|
||||
if (type == T_CLASS || type == T_ICLASS || type == T_MODULE) {
|
||||
- VALUE name = rb_class_path(klass);
|
||||
+ VALUE name = Qnil;
|
||||
+ /*
|
||||
+ * Special treatment for rb_mRubyVMFrozenCore wchi is broken by GC.
|
||||
+ * https://bugs.ruby-lang.org/issues/18257
|
||||
+ */
|
||||
+ if (klass == rb_mRubyVMFrozenCore)
|
||||
+ name = rb_str_new_cstr("RubyVM::FrozenCore");
|
||||
+ else
|
||||
+ name = rb_class_path(klass);
|
||||
const char *classname, *filename;
|
||||
const char *methodname = rb_id2name(id);
|
||||
if (methodname && (filename = rb_source_location_cstr(&args->line_no)) != 0) {
|
||||
--
|
||||
2.34.1
|
||||
|
31
SOURCES/ruby-3.1.1-ossl_ocsp-use-null.patch
Normal file
31
SOURCES/ruby-3.1.1-ossl_ocsp-use-null.patch
Normal file
@ -0,0 +1,31 @@
|
||||
--- ext/openssl/ossl_ocsp.c.orig 2022-04-07 16:40:13.263752886 +0200
|
||||
+++ ext/openssl/ossl_ocsp.c 2022-04-07 16:45:56.818971187 +0200
|
||||
@@ -382,7 +382,7 @@
|
||||
if (!NIL_P(flags))
|
||||
flg = NUM2INT(flags);
|
||||
if (NIL_P(digest))
|
||||
- md = EVP_sha1();
|
||||
+ md = NULL;
|
||||
else
|
||||
md = ossl_evp_get_digestbyname(digest);
|
||||
if (NIL_P(certs))
|
||||
@@ -1033,7 +1033,7 @@
|
||||
if (!NIL_P(flags))
|
||||
flg = NUM2INT(flags);
|
||||
if (NIL_P(digest))
|
||||
- md = EVP_sha1();
|
||||
+ md = NULL;
|
||||
else
|
||||
md = ossl_evp_get_digestbyname(digest);
|
||||
if (NIL_P(certs))
|
||||
--- test/openssl/test_ocsp.rb.orig 2022-04-08 08:20:31.400739869 +0200
|
||||
+++ test/openssl/test_ocsp.rb 2022-04-08 08:20:37.208727488 +0200
|
||||
@@ -99,7 +99,7 @@
|
||||
request.sign(@cert, @cert_key, [@ca_cert], 0)
|
||||
asn1 = OpenSSL::ASN1.decode(request.to_der)
|
||||
assert_equal cid.to_der, asn1.value[0].value.find { |a| a.tag_class == :UNIVERSAL }.value[0].value[0].to_der
|
||||
- assert_equal OpenSSL::ASN1.ObjectId("sha1WithRSAEncryption").to_der, asn1.value[1].value[0].value[0].value[0].to_der
|
||||
+ assert_equal OpenSSL::ASN1.ObjectId("sha256WithRSAEncryption").to_der, asn1.value[1].value[0].value[0].value[0].to_der
|
||||
assert_equal @cert.to_der, asn1.value[1].value[0].value[2].value[0].value[0].to_der
|
||||
assert_equal @ca_cert.to_der, asn1.value[1].value[0].value[2].value[0].value[1].to_der
|
||||
assert_equal asn1.to_der, OpenSSL::OCSP::Request.new(asn1.to_der).to_der
|
609
SOURCES/ruby-3.1.2-ossl-tests-replace-sha1.patch
Normal file
609
SOURCES/ruby-3.1.2-ossl-tests-replace-sha1.patch
Normal file
@ -0,0 +1,609 @@
|
||||
diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
|
||||
index fedcb93..53ad621 100644
|
||||
--- a/ext/openssl/extconf.rb
|
||||
+++ b/ext/openssl/extconf.rb
|
||||
@@ -169,6 +169,7 @@ have_func("SSL_CTX_set_post_handshake_auth")
|
||||
|
||||
# added in 1.1.1
|
||||
have_func("EVP_PKEY_check")
|
||||
+have_func("SSL_CTX_set_ciphersuites")
|
||||
|
||||
# added in 3.0.0
|
||||
have_func("SSL_set0_tmp_dh_pkey")
|
||||
diff --git a/ext/openssl/ossl.h b/ext/openssl/ossl.h
|
||||
index 4b51268..2ab8aea 100644
|
||||
--- a/ext/openssl/ossl.h
|
||||
+++ b/ext/openssl/ossl.h
|
||||
@@ -43,13 +43,13 @@
|
||||
#ifndef LIBRESSL_VERSION_NUMBER
|
||||
# define OSSL_IS_LIBRESSL 0
|
||||
# define OSSL_OPENSSL_PREREQ(maj, min, pat) \
|
||||
- (OPENSSL_VERSION_NUMBER >= (maj << 28) | (min << 20) | (pat << 12))
|
||||
+ (OPENSSL_VERSION_NUMBER >= ((maj << 28) | (min << 20) | (pat << 12)))
|
||||
# define OSSL_LIBRESSL_PREREQ(maj, min, pat) 0
|
||||
#else
|
||||
# define OSSL_IS_LIBRESSL 1
|
||||
# define OSSL_OPENSSL_PREREQ(maj, min, pat) 0
|
||||
# define OSSL_LIBRESSL_PREREQ(maj, min, pat) \
|
||||
- (LIBRESSL_VERSION_NUMBER >= (maj << 28) | (min << 20) | (pat << 12))
|
||||
+ (LIBRESSL_VERSION_NUMBER >= ((maj << 28) | (min << 20) | (pat << 12)))
|
||||
#endif
|
||||
|
||||
#if !defined(OPENSSL_NO_ENGINE) && !OSSL_OPENSSL_PREREQ(3, 0, 0)
|
||||
diff --git a/ext/openssl/ossl_asn1.c b/ext/openssl/ossl_asn1.c
|
||||
index a61d3ee..0d3fa9a 100644
|
||||
--- a/ext/openssl/ossl_asn1.c
|
||||
+++ b/ext/openssl/ossl_asn1.c
|
||||
@@ -1522,7 +1522,7 @@ Init_ossl_asn1(void)
|
||||
*
|
||||
* An Array that stores the name of a given tag number. These names are
|
||||
* the same as the name of the tag constant that is additionally defined,
|
||||
- * e.g. +UNIVERSAL_TAG_NAME[2] = "INTEGER"+ and +OpenSSL::ASN1::INTEGER = 2+.
|
||||
+ * e.g. <tt>UNIVERSAL_TAG_NAME[2] = "INTEGER"</tt> and <tt>OpenSSL::ASN1::INTEGER = 2</tt>.
|
||||
*
|
||||
* == Example usage
|
||||
*
|
||||
diff --git a/ext/openssl/ossl_pkey.c b/ext/openssl/ossl_pkey.c
|
||||
index 2a4835a..24d0da4 100644
|
||||
--- a/ext/openssl/ossl_pkey.c
|
||||
+++ b/ext/openssl/ossl_pkey.c
|
||||
@@ -670,7 +670,7 @@ ossl_pkey_export_traditional(int argc, VALUE *argv, VALUE self, int to_der)
|
||||
}
|
||||
}
|
||||
else {
|
||||
-#if OPENSSL_VERSION_NUMBER >= 0x10100000 && !defined(LIBRESSL_VERSION_NUMBER)
|
||||
+#if OSSL_OPENSSL_PREREQ(1, 1, 0) || OSSL_LIBRESSL_PREREQ(3, 5, 0)
|
||||
if (!PEM_write_bio_PrivateKey_traditional(bio, pkey, enc, NULL, 0,
|
||||
ossl_pem_passwd_cb,
|
||||
(void *)pass)) {
|
||||
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
|
||||
index 9a0682a..af262d9 100644
|
||||
--- a/ext/openssl/ossl_ssl.c
|
||||
+++ b/ext/openssl/ossl_ssl.c
|
||||
@@ -959,27 +959,13 @@ ossl_sslctx_get_ciphers(VALUE self)
|
||||
return ary;
|
||||
}
|
||||
|
||||
-/*
|
||||
- * call-seq:
|
||||
- * ctx.ciphers = "cipher1:cipher2:..."
|
||||
- * ctx.ciphers = [name, ...]
|
||||
- * ctx.ciphers = [[name, version, bits, alg_bits], ...]
|
||||
- *
|
||||
- * Sets the list of available cipher suites for this context. Note in a server
|
||||
- * context some ciphers require the appropriate certificates. For example, an
|
||||
- * RSA cipher suite can only be chosen when an RSA certificate is available.
|
||||
- */
|
||||
static VALUE
|
||||
-ossl_sslctx_set_ciphers(VALUE self, VALUE v)
|
||||
+build_cipher_string(VALUE v)
|
||||
{
|
||||
- SSL_CTX *ctx;
|
||||
VALUE str, elem;
|
||||
int i;
|
||||
|
||||
- rb_check_frozen(self);
|
||||
- if (NIL_P(v))
|
||||
- return v;
|
||||
- else if (RB_TYPE_P(v, T_ARRAY)) {
|
||||
+ if (RB_TYPE_P(v, T_ARRAY)) {
|
||||
str = rb_str_new(0, 0);
|
||||
for (i = 0; i < RARRAY_LEN(v); i++) {
|
||||
elem = rb_ary_entry(v, i);
|
||||
@@ -993,14 +979,67 @@ ossl_sslctx_set_ciphers(VALUE self, VALUE v)
|
||||
StringValue(str);
|
||||
}
|
||||
|
||||
+ return str;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * call-seq:
|
||||
+ * ctx.ciphers = "cipher1:cipher2:..."
|
||||
+ * ctx.ciphers = [name, ...]
|
||||
+ * ctx.ciphers = [[name, version, bits, alg_bits], ...]
|
||||
+ *
|
||||
+ * Sets the list of available cipher suites for this context. Note in a server
|
||||
+ * context some ciphers require the appropriate certificates. For example, an
|
||||
+ * RSA cipher suite can only be chosen when an RSA certificate is available.
|
||||
+ */
|
||||
+static VALUE
|
||||
+ossl_sslctx_set_ciphers(VALUE self, VALUE v)
|
||||
+{
|
||||
+ SSL_CTX *ctx;
|
||||
+ VALUE str;
|
||||
+
|
||||
+ rb_check_frozen(self);
|
||||
+ if (NIL_P(v))
|
||||
+ return v;
|
||||
+
|
||||
+ str = build_cipher_string(v);
|
||||
+
|
||||
GetSSLCTX(self, ctx);
|
||||
- if (!SSL_CTX_set_cipher_list(ctx, StringValueCStr(str))) {
|
||||
+ if (!SSL_CTX_set_cipher_list(ctx, StringValueCStr(str)))
|
||||
ossl_raise(eSSLError, "SSL_CTX_set_cipher_list");
|
||||
- }
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
+#ifdef HAVE_SSL_CTX_SET_CIPHERSUITES
|
||||
+/*
|
||||
+ * call-seq:
|
||||
+ * ctx.ciphersuites = "cipher1:cipher2:..."
|
||||
+ * ctx.ciphersuites = [name, ...]
|
||||
+ * ctx.ciphersuites = [[name, version, bits, alg_bits], ...]
|
||||
+ *
|
||||
+ * Sets the list of available TLSv1.3 cipher suites for this context.
|
||||
+ */
|
||||
+static VALUE
|
||||
+ossl_sslctx_set_ciphersuites(VALUE self, VALUE v)
|
||||
+{
|
||||
+ SSL_CTX *ctx;
|
||||
+ VALUE str;
|
||||
+
|
||||
+ rb_check_frozen(self);
|
||||
+ if (NIL_P(v))
|
||||
+ return v;
|
||||
+
|
||||
+ str = build_cipher_string(v);
|
||||
+
|
||||
+ GetSSLCTX(self, ctx);
|
||||
+ if (!SSL_CTX_set_ciphersuites(ctx, StringValueCStr(str)))
|
||||
+ ossl_raise(eSSLError, "SSL_CTX_set_ciphersuites");
|
||||
+
|
||||
+ return v;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
#ifndef OPENSSL_NO_DH
|
||||
/*
|
||||
* call-seq:
|
||||
@@ -2703,6 +2742,9 @@ Init_ossl_ssl(void)
|
||||
ossl_sslctx_set_minmax_proto_version, 2);
|
||||
rb_define_method(cSSLContext, "ciphers", ossl_sslctx_get_ciphers, 0);
|
||||
rb_define_method(cSSLContext, "ciphers=", ossl_sslctx_set_ciphers, 1);
|
||||
+#ifdef HAVE_SSL_CTX_SET_CIPHERSUITES
|
||||
+ rb_define_method(cSSLContext, "ciphersuites=", ossl_sslctx_set_ciphersuites, 1);
|
||||
+#endif
|
||||
#ifndef OPENSSL_NO_DH
|
||||
rb_define_method(cSSLContext, "tmp_dh=", ossl_sslctx_set_tmp_dh, 1);
|
||||
#endif
|
||||
diff --git a/test/openssl/test_asn1.rb b/test/openssl/test_asn1.rb
|
||||
index 0fd7971..c79bc14 100644
|
||||
--- a/test/openssl/test_asn1.rb
|
||||
+++ b/test/openssl/test_asn1.rb
|
||||
@@ -14,7 +14,7 @@ class OpenSSL::TestASN1 < OpenSSL::TestCase
|
||||
["keyUsage","keyCertSign, cRLSign",true],
|
||||
["subjectKeyIdentifier","hash",false],
|
||||
]
|
||||
- dgst = OpenSSL::Digest.new('SHA1')
|
||||
+ dgst = OpenSSL::Digest.new('SHA256')
|
||||
cert = OpenSSL::TestUtils.issue_cert(
|
||||
subj, key, s, exts, nil, nil, digest: dgst, not_before: now, not_after: now+3600)
|
||||
|
||||
@@ -42,7 +42,7 @@ class OpenSSL::TestASN1 < OpenSSL::TestCase
|
||||
assert_equal(OpenSSL::ASN1::Sequence, sig.class)
|
||||
assert_equal(2, sig.value.size)
|
||||
assert_equal(OpenSSL::ASN1::ObjectId, sig.value[0].class)
|
||||
- assert_equal("1.2.840.113549.1.1.5", sig.value[0].oid)
|
||||
+ assert_equal("1.2.840.113549.1.1.11", sig.value[0].oid)
|
||||
assert_equal(OpenSSL::ASN1::Null, sig.value[1].class)
|
||||
|
||||
dn = tbs_cert.value[3] # issuer
|
||||
@@ -189,7 +189,7 @@ class OpenSSL::TestASN1 < OpenSSL::TestCase
|
||||
assert_equal(OpenSSL::ASN1::Null, pkey.value[0].value[1].class)
|
||||
|
||||
assert_equal(OpenSSL::ASN1::BitString, sig_val.class)
|
||||
- cululated_sig = key.sign(OpenSSL::Digest.new('SHA1'), tbs_cert.to_der)
|
||||
+ cululated_sig = key.sign(OpenSSL::Digest.new('SHA256'), tbs_cert.to_der)
|
||||
assert_equal(cululated_sig, sig_val.value)
|
||||
end
|
||||
|
||||
diff --git a/test/openssl/test_ns_spki.rb b/test/openssl/test_ns_spki.rb
|
||||
index ed3be86..383931b 100644
|
||||
--- a/test/openssl/test_ns_spki.rb
|
||||
+++ b/test/openssl/test_ns_spki.rb
|
||||
@@ -22,7 +22,7 @@ class OpenSSL::TestNSSPI < OpenSSL::TestCase
|
||||
spki = OpenSSL::Netscape::SPKI.new
|
||||
spki.challenge = "RandomString"
|
||||
spki.public_key = key1.public_key
|
||||
- spki.sign(key1, OpenSSL::Digest.new('SHA1'))
|
||||
+ spki.sign(key1, OpenSSL::Digest.new('SHA256'))
|
||||
assert(spki.verify(spki.public_key))
|
||||
assert(spki.verify(key1.public_key))
|
||||
assert(!spki.verify(key2.public_key))
|
||||
diff --git a/test/openssl/test_pkey_dsa.rb b/test/openssl/test_pkey_dsa.rb
|
||||
index 726b7db..08213df 100644
|
||||
--- a/test/openssl/test_pkey_dsa.rb
|
||||
+++ b/test/openssl/test_pkey_dsa.rb
|
||||
@@ -36,8 +36,8 @@ class OpenSSL::TestPKeyDSA < OpenSSL::PKeyTestCase
|
||||
assert_equal true, dsa512.verify(OpenSSL::Digest.new('DSS1'), signature, data)
|
||||
end
|
||||
|
||||
- signature = dsa512.sign("SHA1", data)
|
||||
- assert_equal true, dsa512.verify("SHA1", signature, data)
|
||||
+ signature = dsa512.sign("SHA256", data)
|
||||
+ assert_equal true, dsa512.verify("SHA256", signature, data)
|
||||
|
||||
signature0 = (<<~'end;').unpack("m")[0]
|
||||
MCwCFH5h40plgU5Fh0Z4wvEEpz0eE9SnAhRPbkRB8ggsN/vsSEYMXvJwjGg/
|
||||
diff --git a/test/openssl/test_pkey_ec.rb b/test/openssl/test_pkey_ec.rb
|
||||
index ffe5a94..c06fe6f 100644
|
||||
--- a/test/openssl/test_pkey_ec.rb
|
||||
+++ b/test/openssl/test_pkey_ec.rb
|
||||
@@ -98,8 +98,8 @@ class OpenSSL::TestEC < OpenSSL::PKeyTestCase
|
||||
def test_sign_verify
|
||||
p256 = Fixtures.pkey("p256")
|
||||
data = "Sign me!"
|
||||
- signature = p256.sign("SHA1", data)
|
||||
- assert_equal true, p256.verify("SHA1", signature, data)
|
||||
+ signature = p256.sign("SHA256", data)
|
||||
+ assert_equal true, p256.verify("SHA256", signature, data)
|
||||
|
||||
signature0 = (<<~'end;').unpack("m")[0]
|
||||
MEQCIEOTY/hD7eI8a0qlzxkIt8LLZ8uwiaSfVbjX2dPAvN11AiAQdCYx56Fq
|
||||
diff --git a/test/openssl/test_pkey_rsa.rb b/test/openssl/test_pkey_rsa.rb
|
||||
index 4bb39ed..9e06e43 100644
|
||||
--- a/test/openssl/test_pkey_rsa.rb
|
||||
+++ b/test/openssl/test_pkey_rsa.rb
|
||||
@@ -80,8 +80,8 @@ class OpenSSL::TestPKeyRSA < OpenSSL::PKeyTestCase
|
||||
def test_sign_verify
|
||||
rsa1024 = Fixtures.pkey("rsa1024")
|
||||
data = "Sign me!"
|
||||
- signature = rsa1024.sign("SHA1", data)
|
||||
- assert_equal true, rsa1024.verify("SHA1", signature, data)
|
||||
+ signature = rsa1024.sign("SHA256", data)
|
||||
+ assert_equal true, rsa1024.verify("SHA256", signature, data)
|
||||
|
||||
signature0 = (<<~'end;').unpack("m")[0]
|
||||
oLCgbprPvfhM4pjFQiDTFeWI9Sk+Og7Nh9TmIZ/xSxf2CGXQrptlwo7NQ28+
|
||||
@@ -113,10 +113,10 @@ class OpenSSL::TestPKeyRSA < OpenSSL::PKeyTestCase
|
||||
def test_sign_verify_raw
|
||||
key = Fixtures.pkey("rsa-1")
|
||||
data = "Sign me!"
|
||||
- hash = OpenSSL::Digest.digest("SHA1", data)
|
||||
- signature = key.sign_raw("SHA1", hash)
|
||||
- assert_equal true, key.verify_raw("SHA1", signature, hash)
|
||||
- assert_equal true, key.verify("SHA1", signature, data)
|
||||
+ hash = OpenSSL::Digest.digest("SHA256", data)
|
||||
+ signature = key.sign_raw("SHA256", hash)
|
||||
+ assert_equal true, key.verify_raw("SHA256", signature, hash)
|
||||
+ assert_equal true, key.verify("SHA256", signature, data)
|
||||
|
||||
# Too long data
|
||||
assert_raise(OpenSSL::PKey::PKeyError) {
|
||||
@@ -129,9 +129,9 @@ class OpenSSL::TestPKeyRSA < OpenSSL::PKeyTestCase
|
||||
"rsa_pss_saltlen" => 20,
|
||||
"rsa_mgf1_md" => "SHA256"
|
||||
}
|
||||
- sig_pss = key.sign_raw("SHA1", hash, pssopts)
|
||||
- assert_equal true, key.verify("SHA1", sig_pss, data, pssopts)
|
||||
- assert_equal true, key.verify_raw("SHA1", sig_pss, hash, pssopts)
|
||||
+ sig_pss = key.sign_raw("SHA256", hash, pssopts)
|
||||
+ assert_equal true, key.verify("SHA256", sig_pss, data, pssopts)
|
||||
+ assert_equal true, key.verify_raw("SHA256", sig_pss, hash, pssopts)
|
||||
end
|
||||
|
||||
def test_sign_verify_raw_legacy
|
||||
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
|
||||
index a7607da..3ba8b39 100644
|
||||
--- a/test/openssl/test_ssl.rb
|
||||
+++ b/test/openssl/test_ssl.rb
|
||||
@@ -676,10 +676,16 @@ class OpenSSL::TestSSL < OpenSSL::SSLTestCase
|
||||
# buzz.example.net, respectively). ...
|
||||
assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
|
||||
create_cert_with_san('DNS:baz*.example.com'), 'baz1.example.com'))
|
||||
+
|
||||
+ # LibreSSL 3.5.0+ doesn't support other wildcard certificates
|
||||
+ # (it isn't required to, as RFC states MAY, not MUST)
|
||||
+ return if libressl?(3, 5, 0)
|
||||
+
|
||||
assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
|
||||
create_cert_with_san('DNS:*baz.example.com'), 'foobaz.example.com'))
|
||||
assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
|
||||
create_cert_with_san('DNS:b*z.example.com'), 'buzz.example.com'))
|
||||
+
|
||||
# Section 6.4.3 of RFC6125 states that client should NOT match identifier
|
||||
# where wildcard is other than left-most label.
|
||||
#
|
||||
@@ -1563,6 +1569,99 @@ class OpenSSL::TestSSL < OpenSSL::SSLTestCase
|
||||
end
|
||||
end
|
||||
|
||||
+ def test_ciphersuites_method_tls_connection
|
||||
+ ssl_ctx = OpenSSL::SSL::SSLContext.new
|
||||
+ if !tls13_supported? || !ssl_ctx.respond_to?(:ciphersuites=)
|
||||
+ pend 'TLS 1.3 not supported'
|
||||
+ end
|
||||
+
|
||||
+ csuite = ['TLS_AES_128_GCM_SHA256', 'TLSv1.3', 128, 128]
|
||||
+ inputs = [csuite[0], [csuite[0]], [csuite]]
|
||||
+
|
||||
+ start_server do |port|
|
||||
+ inputs.each do |input|
|
||||
+ cli_ctx = OpenSSL::SSL::SSLContext.new
|
||||
+ cli_ctx.min_version = cli_ctx.max_version = OpenSSL::SSL::TLS1_3_VERSION
|
||||
+ cli_ctx.ciphersuites = input
|
||||
+
|
||||
+ server_connect(port, cli_ctx) do |ssl|
|
||||
+ assert_equal('TLSv1.3', ssl.ssl_version)
|
||||
+ if libressl?(3, 4, 0) && !libressl?(3, 5, 0)
|
||||
+ assert_equal("AEAD-AES128-GCM-SHA256", ssl.cipher[0])
|
||||
+ else
|
||||
+ assert_equal(csuite[0], ssl.cipher[0])
|
||||
+ end
|
||||
+ ssl.puts('abc'); assert_equal("abc\n", ssl.gets)
|
||||
+ end
|
||||
+ end
|
||||
+ end
|
||||
+ end
|
||||
+
|
||||
+ def test_ciphersuites_method_nil_argument
|
||||
+ ssl_ctx = OpenSSL::SSL::SSLContext.new
|
||||
+ pend 'ciphersuites= method is missing' unless ssl_ctx.respond_to?(:ciphersuites=)
|
||||
+
|
||||
+ assert_nothing_raised { ssl_ctx.ciphersuites = nil }
|
||||
+ end
|
||||
+
|
||||
+ def test_ciphersuites_method_frozen_object
|
||||
+ ssl_ctx = OpenSSL::SSL::SSLContext.new
|
||||
+ pend 'ciphersuites= method is missing' unless ssl_ctx.respond_to?(:ciphersuites=)
|
||||
+
|
||||
+ ssl_ctx.freeze
|
||||
+ assert_raise(FrozenError) { ssl_ctx.ciphersuites = 'TLS_AES_256_GCM_SHA384' }
|
||||
+ end
|
||||
+
|
||||
+ def test_ciphersuites_method_bogus_csuite
|
||||
+ ssl_ctx = OpenSSL::SSL::SSLContext.new
|
||||
+ pend 'ciphersuites= method is missing' unless ssl_ctx.respond_to?(:ciphersuites=)
|
||||
+
|
||||
+ assert_raise_with_message(
|
||||
+ OpenSSL::SSL::SSLError,
|
||||
+ /SSL_CTX_set_ciphersuites: no cipher match/i
|
||||
+ ) { ssl_ctx.ciphersuites = 'BOGUS' }
|
||||
+ end
|
||||
+
|
||||
+ def test_ciphers_method_tls_connection
|
||||
+ csuite = ['ECDHE-RSA-AES256-GCM-SHA384', 'TLSv1.2', 256, 256]
|
||||
+ inputs = [csuite[0], [csuite[0]], [csuite]]
|
||||
+
|
||||
+ start_server do |port|
|
||||
+ inputs.each do |input|
|
||||
+ cli_ctx = OpenSSL::SSL::SSLContext.new
|
||||
+ cli_ctx.min_version = cli_ctx.max_version = OpenSSL::SSL::TLS1_2_VERSION
|
||||
+ cli_ctx.ciphers = input
|
||||
+
|
||||
+ server_connect(port, cli_ctx) do |ssl|
|
||||
+ assert_equal('TLSv1.2', ssl.ssl_version)
|
||||
+ assert_equal(csuite[0], ssl.cipher[0])
|
||||
+ ssl.puts('abc'); assert_equal("abc\n", ssl.gets)
|
||||
+ end
|
||||
+ end
|
||||
+ end
|
||||
+ end
|
||||
+
|
||||
+ def test_ciphers_method_nil_argument
|
||||
+ ssl_ctx = OpenSSL::SSL::SSLContext.new
|
||||
+ assert_nothing_raised { ssl_ctx.ciphers = nil }
|
||||
+ end
|
||||
+
|
||||
+ def test_ciphers_method_frozen_object
|
||||
+ ssl_ctx = OpenSSL::SSL::SSLContext.new
|
||||
+
|
||||
+ ssl_ctx.freeze
|
||||
+ assert_raise(FrozenError) { ssl_ctx.ciphers = 'ECDHE-RSA-AES128-SHA' }
|
||||
+ end
|
||||
+
|
||||
+ def test_ciphers_method_bogus_csuite
|
||||
+ ssl_ctx = OpenSSL::SSL::SSLContext.new
|
||||
+
|
||||
+ assert_raise_with_message(
|
||||
+ OpenSSL::SSL::SSLError,
|
||||
+ /SSL_CTX_set_cipher_list: no cipher match/i
|
||||
+ ) { ssl_ctx.ciphers = 'BOGUS' }
|
||||
+ end
|
||||
+
|
||||
def test_connect_works_when_setting_dh_callback_to_nil
|
||||
ctx_proc = -> ctx {
|
||||
ctx.max_version = :TLS1_2
|
||||
diff --git a/test/openssl/test_x509cert.rb b/test/openssl/test_x509cert.rb
|
||||
index d696b98..4e2bd0c 100644
|
||||
--- a/test/openssl/test_x509cert.rb
|
||||
+++ b/test/openssl/test_x509cert.rb
|
||||
@@ -180,6 +180,7 @@ class OpenSSL::TestX509Certificate < OpenSSL::TestCase
|
||||
assert_equal(false, certificate_error_returns_false { cert.verify(@dsa512) })
|
||||
cert.serial = 2
|
||||
assert_equal(false, cert.verify(@rsa2048))
|
||||
+ rescue OpenSSL::X509::CertificateError # RHEL 9 disables SHA1
|
||||
end
|
||||
|
||||
def test_sign_and_verify_rsa_md5
|
||||
@@ -226,9 +227,8 @@ class OpenSSL::TestX509Certificate < OpenSSL::TestCase
|
||||
assert_equal("dsa_with_SHA256", cert.signature_algorithm)
|
||||
# TODO: need more tests for dsa + sha2
|
||||
|
||||
- # SHA1 is allowed from OpenSSL 1.0.0 (0.9.8 requires DSS1)
|
||||
- cert = issue_cert(@ca, @dsa256, 1, [], nil, nil, digest: "sha1")
|
||||
- assert_equal("dsaWithSHA1", cert.signature_algorithm)
|
||||
+ cert = issue_cert(@ca, @dsa256, 1, [], nil, nil, digest: "sha512")
|
||||
+ assert_equal("dsa_with_SHA512", cert.signature_algorithm)
|
||||
end
|
||||
|
||||
def test_check_private_key
|
||||
diff --git a/test/openssl/test_x509crl.rb b/test/openssl/test_x509crl.rb
|
||||
index bcdb0a6..146ee07 100644
|
||||
--- a/test/openssl/test_x509crl.rb
|
||||
+++ b/test/openssl/test_x509crl.rb
|
||||
@@ -20,7 +20,7 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
|
||||
|
||||
cert = issue_cert(@ca, @rsa2048, 1, [], nil, nil)
|
||||
crl = issue_crl([], 1, now, now+1600, [],
|
||||
- cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
|
||||
+ cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
|
||||
assert_equal(1, crl.version)
|
||||
assert_equal(cert.issuer.to_der, crl.issuer.to_der)
|
||||
assert_equal(now, crl.last_update)
|
||||
@@ -57,7 +57,7 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
|
||||
]
|
||||
cert = issue_cert(@ca, @rsa2048, 1, [], nil, nil)
|
||||
crl = issue_crl(revoke_info, 1, Time.now, Time.now+1600, [],
|
||||
- cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
|
||||
+ cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
|
||||
revoked = crl.revoked
|
||||
assert_equal(5, revoked.size)
|
||||
assert_equal(1, revoked[0].serial)
|
||||
@@ -98,7 +98,7 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
|
||||
|
||||
revoke_info = (1..1000).collect{|i| [i, now, 0] }
|
||||
crl = issue_crl(revoke_info, 1, Time.now, Time.now+1600, [],
|
||||
- cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
|
||||
+ cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
|
||||
revoked = crl.revoked
|
||||
assert_equal(1000, revoked.size)
|
||||
assert_equal(1, revoked[0].serial)
|
||||
@@ -124,7 +124,7 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
|
||||
|
||||
cert = issue_cert(@ca, @rsa2048, 1, cert_exts, nil, nil)
|
||||
crl = issue_crl([], 1, Time.now, Time.now+1600, crl_exts,
|
||||
- cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
|
||||
+ cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
|
||||
exts = crl.extensions
|
||||
assert_equal(3, exts.size)
|
||||
assert_equal("1", exts[0].value)
|
||||
@@ -160,24 +160,24 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
|
||||
assert_equal(false, exts[2].critical?)
|
||||
|
||||
no_ext_crl = issue_crl([], 1, Time.now, Time.now+1600, [],
|
||||
- cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
|
||||
+ cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
|
||||
assert_equal nil, no_ext_crl.authority_key_identifier
|
||||
end
|
||||
|
||||
def test_crlnumber
|
||||
cert = issue_cert(@ca, @rsa2048, 1, [], nil, nil)
|
||||
crl = issue_crl([], 1, Time.now, Time.now+1600, [],
|
||||
- cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
|
||||
+ cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
|
||||
assert_match(1.to_s, crl.extensions[0].value)
|
||||
assert_match(/X509v3 CRL Number:\s+#{1}/m, crl.to_text)
|
||||
|
||||
crl = issue_crl([], 2**32, Time.now, Time.now+1600, [],
|
||||
- cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
|
||||
+ cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
|
||||
assert_match((2**32).to_s, crl.extensions[0].value)
|
||||
assert_match(/X509v3 CRL Number:\s+#{2**32}/m, crl.to_text)
|
||||
|
||||
crl = issue_crl([], 2**100, Time.now, Time.now+1600, [],
|
||||
- cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
|
||||
+ cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
|
||||
assert_match(/X509v3 CRL Number:\s+#{2**100}/m, crl.to_text)
|
||||
assert_match((2**100).to_s, crl.extensions[0].value)
|
||||
end
|
||||
@@ -185,7 +185,7 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
|
||||
def test_sign_and_verify
|
||||
cert = issue_cert(@ca, @rsa2048, 1, [], nil, nil)
|
||||
crl = issue_crl([], 1, Time.now, Time.now+1600, [],
|
||||
- cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
|
||||
+ cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
|
||||
assert_equal(false, crl.verify(@rsa1024))
|
||||
assert_equal(true, crl.verify(@rsa2048))
|
||||
assert_equal(false, crl_error_returns_false { crl.verify(@dsa256) })
|
||||
@@ -195,7 +195,7 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
|
||||
|
||||
cert = issue_cert(@ca, @dsa512, 1, [], nil, nil)
|
||||
crl = issue_crl([], 1, Time.now, Time.now+1600, [],
|
||||
- cert, @dsa512, OpenSSL::Digest.new('SHA1'))
|
||||
+ cert, @dsa512, OpenSSL::Digest.new('SHA256'))
|
||||
assert_equal(false, crl_error_returns_false { crl.verify(@rsa1024) })
|
||||
assert_equal(false, crl_error_returns_false { crl.verify(@rsa2048) })
|
||||
assert_equal(false, crl.verify(@dsa256))
|
||||
diff --git a/test/openssl/test_x509req.rb b/test/openssl/test_x509req.rb
|
||||
index ee9c678..a84b162 100644
|
||||
--- a/test/openssl/test_x509req.rb
|
||||
+++ b/test/openssl/test_x509req.rb
|
||||
@@ -23,31 +23,31 @@ class OpenSSL::TestX509Request < OpenSSL::TestCase
|
||||
end
|
||||
|
||||
def test_public_key
|
||||
- req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
|
||||
+ req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
|
||||
assert_equal(@rsa1024.public_key.to_der, req.public_key.to_der)
|
||||
req = OpenSSL::X509::Request.new(req.to_der)
|
||||
assert_equal(@rsa1024.public_key.to_der, req.public_key.to_der)
|
||||
|
||||
- req = issue_csr(0, @dn, @dsa512, OpenSSL::Digest.new('SHA1'))
|
||||
+ req = issue_csr(0, @dn, @dsa512, OpenSSL::Digest.new('SHA256'))
|
||||
assert_equal(@dsa512.public_key.to_der, req.public_key.to_der)
|
||||
req = OpenSSL::X509::Request.new(req.to_der)
|
||||
assert_equal(@dsa512.public_key.to_der, req.public_key.to_der)
|
||||
end
|
||||
|
||||
def test_version
|
||||
- req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
|
||||
+ req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
|
||||
assert_equal(0, req.version)
|
||||
req = OpenSSL::X509::Request.new(req.to_der)
|
||||
assert_equal(0, req.version)
|
||||
|
||||
- req = issue_csr(1, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
|
||||
+ req = issue_csr(1, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
|
||||
assert_equal(1, req.version)
|
||||
req = OpenSSL::X509::Request.new(req.to_der)
|
||||
assert_equal(1, req.version)
|
||||
end
|
||||
|
||||
def test_subject
|
||||
- req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
|
||||
+ req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
|
||||
assert_equal(@dn.to_der, req.subject.to_der)
|
||||
req = OpenSSL::X509::Request.new(req.to_der)
|
||||
assert_equal(@dn.to_der, req.subject.to_der)
|
||||
@@ -78,9 +78,9 @@ class OpenSSL::TestX509Request < OpenSSL::TestCase
|
||||
OpenSSL::X509::Attribute.new("msExtReq", attrval),
|
||||
]
|
||||
|
||||
- req0 = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
|
||||
+ req0 = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
|
||||
attrs.each{|attr| req0.add_attribute(attr) }
|
||||
- req1 = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
|
||||
+ req1 = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
|
||||
req1.attributes = attrs
|
||||
assert_equal(req0.to_der, req1.to_der)
|
||||
|
||||
@@ -101,7 +101,7 @@ class OpenSSL::TestX509Request < OpenSSL::TestCase
|
||||
end
|
||||
|
||||
def test_sign_and_verify_rsa_sha1
|
||||
- req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
|
||||
+ req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
|
||||
assert_equal(true, req.verify(@rsa1024))
|
||||
assert_equal(false, req.verify(@rsa2048))
|
||||
assert_equal(false, request_error_returns_false { req.verify(@dsa256) })
|
||||
@@ -122,7 +122,7 @@ class OpenSSL::TestX509Request < OpenSSL::TestCase
|
||||
end
|
||||
|
||||
def test_sign_and_verify_dsa
|
||||
- req = issue_csr(0, @dn, @dsa512, OpenSSL::Digest.new('SHA1'))
|
||||
+ req = issue_csr(0, @dn, @dsa512, OpenSSL::Digest.new('SHA256'))
|
||||
assert_equal(false, request_error_returns_false { req.verify(@rsa1024) })
|
||||
assert_equal(false, request_error_returns_false { req.verify(@rsa2048) })
|
||||
assert_equal(false, req.verify(@dsa256))
|
||||
@@ -137,13 +137,13 @@ class OpenSSL::TestX509Request < OpenSSL::TestCase
|
||||
end
|
||||
|
||||
def test_dup
|
||||
- req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
|
||||
+ req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
|
||||
assert_equal(req.to_der, req.dup.to_der)
|
||||
end
|
||||
|
||||
def test_eq
|
||||
- req1 = issue_csr(0, @dn, @rsa1024, "sha1")
|
||||
- req2 = issue_csr(0, @dn, @rsa1024, "sha1")
|
||||
+ req1 = issue_csr(0, @dn, @rsa1024, "sha512")
|
||||
+ req2 = issue_csr(0, @dn, @rsa1024, "sha512")
|
||||
req3 = issue_csr(0, @dn, @rsa1024, "sha256")
|
||||
|
||||
assert_equal false, req1 == 12345
|
@ -0,0 +1,338 @@
|
||||
From 111f8422427d78becc9183ae149b2105a16bf327 Mon Sep 17 00:00:00 2001
|
||||
From: Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
Date: Tue, 5 Apr 2022 23:24:00 +0900
|
||||
Subject: [PATCH 1/5] Bundled gems are expanded under `.bundle/gems` now
|
||||
|
||||
---
|
||||
ext/extmk.rb | 13 +++++++------
|
||||
template/exts.mk.tmpl | 2 +-
|
||||
2 files changed, 8 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/ext/extmk.rb b/ext/extmk.rb
|
||||
index 4a087f294ac9..1da9e2704521 100755
|
||||
--- a/ext/extmk.rb
|
||||
+++ b/ext/extmk.rb
|
||||
@@ -146,7 +146,7 @@ def extmake(target, basedir = 'ext', maybestatic = true)
|
||||
top_srcdir = $top_srcdir
|
||||
topdir = $topdir
|
||||
hdrdir = $hdrdir
|
||||
- prefix = "../" * (target.count("/")+1)
|
||||
+ prefix = "../" * (basedir.count("/")+target.count("/")+1)
|
||||
$top_srcdir = relative_from(top_srcdir, prefix)
|
||||
$hdrdir = relative_from(hdrdir, prefix)
|
||||
$topdir = prefix + $topdir
|
||||
@@ -460,10 +460,11 @@ def $mflags.defined?(var)
|
||||
end unless $extstatic
|
||||
|
||||
@gemname = nil
|
||||
-if ARGV[0]
|
||||
- ext_prefix, exts = ARGV.shift.split('/', 2)
|
||||
+if exts = ARGV.shift
|
||||
+ ext_prefix = exts[%r[\A(?>\.bundle/)?[^/]+(?:/(?=(.+)?)|\z)]]
|
||||
+ exts = $1
|
||||
$extension = [exts] if exts
|
||||
- if ext_prefix == 'gems'
|
||||
+ if ext_prefix.start_with?('.')
|
||||
@gemname = exts
|
||||
elsif exts
|
||||
$static_ext.delete_if {|t, *| !File.fnmatch(t, exts)}
|
||||
@@ -515,7 +516,7 @@ def $mflags.defined?(var)
|
||||
exts.delete_if {|d| File.fnmatch?("-*", d)}
|
||||
end
|
||||
end
|
||||
-ext_prefix = File.basename(ext_prefix)
|
||||
+ext_prefix = ext_prefix[$top_srcdir.size+1..-2]
|
||||
|
||||
extend Module.new {
|
||||
def timestamp_file(name, target_prefix = nil)
|
||||
@@ -634,7 +635,7 @@ def initialize(src)
|
||||
end
|
||||
}
|
||||
|
||||
-Dir.chdir ".."
|
||||
+Dir.chdir dir
|
||||
unless $destdir.to_s.empty?
|
||||
$mflags.defined?("DESTDIR") or $mflags << "DESTDIR=#{$destdir}"
|
||||
end
|
||||
diff --git a/template/exts.mk.tmpl b/template/exts.mk.tmpl
|
||||
index 2f37f4480ac5..964939e365a1 100644
|
||||
--- a/template/exts.mk.tmpl
|
||||
+++ b/template/exts.mk.tmpl
|
||||
@@ -25,7 +25,7 @@ macros["old_extensions"] = []
|
||||
|
||||
contpat = /(?>(?>[^\\\n]|\\.)*\\\n)*(?>[^\\\n]|\\.)*/
|
||||
Dir.glob("{ext,.bundle/gems}/*/exts.mk") do |e|
|
||||
- gem = /\Agems(?=\/)/ =~ e
|
||||
+ gem = e.start_with?(".bundle/gems/")
|
||||
s = File.read(e)
|
||||
s.scan(/^(extensions|SUBMAKEOPTS|EXT[A-Z]+|MFLAGS|NOTE_[A-Z]+)[ \t]*=[ \t]*(#{contpat})$/o) do |n, v|
|
||||
v.gsub!(/\\\n[ \t]*/, ' ')
|
||||
|
||||
From 6ea34cac22131d28a9cc50e7875e854aed9bdb88 Mon Sep 17 00:00:00 2001
|
||||
From: Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
Date: Wed, 6 Apr 2022 20:25:53 +0900
|
||||
Subject: [PATCH 2/5] Retrieve configured gems info
|
||||
|
||||
---
|
||||
template/configure-ext.mk.tmpl | 2 +-
|
||||
template/exts.mk.tmpl | 4 ++--
|
||||
2 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/template/configure-ext.mk.tmpl b/template/configure-ext.mk.tmpl
|
||||
index 6636a7759c54..8ba6b963e3ec 100644
|
||||
--- a/template/configure-ext.mk.tmpl
|
||||
+++ b/template/configure-ext.mk.tmpl
|
||||
@@ -27,7 +27,7 @@ SCRIPT_ARGS = <%=script_args.gsub("#", "\\#")%>
|
||||
EXTMK_ARGS = $(SCRIPT_ARGS) --gnumake=$(gnumake) --extflags="$(EXTLDFLAGS)" \
|
||||
--make-flags="MINIRUBY='$(MINIRUBY)'"
|
||||
|
||||
-all: exts # gems
|
||||
+all: exts gems
|
||||
exts:
|
||||
gems:
|
||||
|
||||
diff --git a/template/exts.mk.tmpl b/template/exts.mk.tmpl
|
||||
index 964939e365a1..e544c4c88bd7 100644
|
||||
--- a/template/exts.mk.tmpl
|
||||
+++ b/template/exts.mk.tmpl
|
||||
@@ -19,7 +19,7 @@ opt = OptionParser.new do |o|
|
||||
o.on('--configure-exts=FILE') {|v| confexts = v}
|
||||
o.order!(ARGV)
|
||||
end
|
||||
-confexts &&= File.read(confexts).scan(/^exts: (.*\.mk)/).flatten rescue nil
|
||||
+confexts &&= File.read(confexts).scan(/^(?:ext|gem)s: (.*\.mk)/).flatten rescue nil
|
||||
confexts ||= []
|
||||
macros["old_extensions"] = []
|
||||
|
||||
@@ -30,7 +30,7 @@ Dir.glob("{ext,.bundle/gems}/*/exts.mk") do |e|
|
||||
s.scan(/^(extensions|SUBMAKEOPTS|EXT[A-Z]+|MFLAGS|NOTE_[A-Z]+)[ \t]*=[ \t]*(#{contpat})$/o) do |n, v|
|
||||
v.gsub!(/\\\n[ \t]*/, ' ')
|
||||
next if v.empty?
|
||||
- next if gem and n != "extensions"
|
||||
+ next if n != "extensions"
|
||||
n = "old_extensions" if n == "extensions" and !confexts.include?(e)
|
||||
v = v.split
|
||||
m = macros[n] ||= []
|
||||
|
||||
From be9d00ee7c72766551ba8c3530f1538034498a6a Mon Sep 17 00:00:00 2001
|
||||
From: Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
Date: Wed, 6 Apr 2022 20:28:00 +0900
|
||||
Subject: [PATCH 3/5] Move the target directory of bundled gems like as
|
||||
rubygems
|
||||
|
||||
---
|
||||
ext/extmk.rb | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/ext/extmk.rb b/ext/extmk.rb
|
||||
index 1da9e2704521..a440af27fc5d 100755
|
||||
--- a/ext/extmk.rb
|
||||
+++ b/ext/extmk.rb
|
||||
@@ -2,6 +2,9 @@
|
||||
# -*- mode: ruby; coding: us-ascii -*-
|
||||
# frozen_string_literal: false
|
||||
|
||||
+module Gem; end # only needs Gem::Platform
|
||||
+require 'rubygems/platform'
|
||||
+
|
||||
# :stopdoc:
|
||||
$extension = nil
|
||||
$extstatic = nil
|
||||
@@ -535,11 +538,12 @@ def create_makefile(*args, &block)
|
||||
super(*args) do |conf|
|
||||
conf.find do |s|
|
||||
s.sub!(/^(TARGET_SO_DIR *= *)\$\(RUBYARCHDIR\)/) {
|
||||
- "TARGET_GEM_DIR = $(extout)/gems/$(arch)/#{@gemname}\n"\
|
||||
+ "TARGET_GEM_DIR = $(topdir)/.bundle/extensions/$(gem_platform)/$(ruby_version)/#{@gemname}\n"\
|
||||
"#{$1}$(TARGET_GEM_DIR)$(target_prefix)"
|
||||
}
|
||||
end
|
||||
conf.any? {|s| /^TARGET *= *\S/ =~ s} and conf << %{
|
||||
+gem_platform = #{Gem::Platform.local}
|
||||
|
||||
# default target
|
||||
all:
|
||||
|
||||
From c4daf8e445925695c34bab8bf5135dcd1e8575a3 Mon Sep 17 00:00:00 2001
|
||||
From: Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
Date: Wed, 6 Apr 2022 22:57:01 +0900
|
||||
Subject: [PATCH 4/5] Obey spec file locations to rubygems
|
||||
|
||||
---
|
||||
common.mk | 3 ++-
|
||||
defs/gmake.mk | 2 +-
|
||||
tool/gem-unpack.rb | 5 +++--
|
||||
3 files changed, 6 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/common.mk b/common.mk
|
||||
index 7c552cba1e04..b4adb2729c0e 100644
|
||||
--- a/common.mk
|
||||
+++ b/common.mk
|
||||
@@ -1359,10 +1359,11 @@ extract-gems$(gnumake:yes=-nongnumake): PHONY
|
||||
$(Q) $(RUNRUBY) -C "$(srcdir)" \
|
||||
-Itool -rgem-unpack -answ \
|
||||
-e 'BEGIN {FileUtils.mkdir_p(d = ".bundle/gems")}' \
|
||||
+ -e 'BEGIN {FileUtils.mkdir_p(s = ".bundle/specifications")}' \
|
||||
-e 'gem, ver = *$$F' \
|
||||
-e 'next if !ver or /^#/=~gem' \
|
||||
-e 'g = "#{gem}-#{ver}"' \
|
||||
- -e 'File.directory?("#{d}/#{g}") or Gem.unpack("gems/#{g}.gem", d)' \
|
||||
+ -e 'File.directory?("#{d}/#{g}") or Gem.unpack("gems/#{g}.gem", d, s)' \
|
||||
gems/bundled_gems
|
||||
|
||||
update-bundled_gems: PHONY
|
||||
diff --git a/defs/gmake.mk b/defs/gmake.mk
|
||||
index a625379a6804..27e3e21cc4d6 100644
|
||||
--- a/defs/gmake.mk
|
||||
+++ b/defs/gmake.mk
|
||||
@@ -290,7 +290,7 @@ extract-gems: | $(patsubst %,.bundle/gems/%,$(bundled-gems))
|
||||
$(ECHO) Extracting bundle gem $*...
|
||||
$(Q) $(BASERUBY) -C "$(srcdir)" \
|
||||
-Itool -rgem-unpack \
|
||||
- -e 'Gem.unpack("gems/$(@F).gem", ".bundle/gems")'
|
||||
+ -e 'Gem.unpack("gems/$(@F).gem", ".bundle/gems", ".bundle/specifications")'
|
||||
|
||||
$(srcdir)/.bundle/gems:
|
||||
$(MAKEDIRS) $@
|
||||
diff --git a/tool/gem-unpack.rb b/tool/gem-unpack.rb
|
||||
index cb05719463f2..fe10b0e420fa 100644
|
||||
--- a/tool/gem-unpack.rb
|
||||
+++ b/tool/gem-unpack.rb
|
||||
@@ -5,13 +5,14 @@
|
||||
# This library is used by "make extract-gems" to
|
||||
# unpack bundled gem files.
|
||||
|
||||
-def Gem.unpack(file, dir = nil)
|
||||
+def Gem.unpack(file, dir = nil, spec_dir = nil)
|
||||
pkg = Gem::Package.new(file)
|
||||
spec = pkg.spec
|
||||
target = spec.full_name
|
||||
target = File.join(dir, target) if dir
|
||||
pkg.extract_files target
|
||||
- spec_file = File.join(target, "#{spec.name}-#{spec.version}.gemspec")
|
||||
+ FileUtils.mkdir_p(spec_dir ||= target)
|
||||
+ spec_file = File.join(spec_dir, "#{spec.name}-#{spec.version}.gemspec")
|
||||
open(spec_file, 'wb') do |f|
|
||||
f.print spec.to_ruby
|
||||
end
|
||||
|
||||
From 3de652d8198be9cd2998c095903889a80e738275 Mon Sep 17 00:00:00 2001
|
||||
From: Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
Date: Thu, 7 Apr 2022 01:44:43 +0900
|
||||
Subject: [PATCH 5/5] Install built gem extension binaries
|
||||
|
||||
---
|
||||
tool/rbinstall.rb | 56 ++++++++++++++---------------------------------
|
||||
1 file changed, 16 insertions(+), 40 deletions(-)
|
||||
|
||||
diff --git a/tool/rbinstall.rb b/tool/rbinstall.rb
|
||||
index 9d9b672be472..624961b4eee6 100755
|
||||
--- a/tool/rbinstall.rb
|
||||
+++ b/tool/rbinstall.rb
|
||||
@@ -858,6 +858,9 @@ class UnpackedInstaller < GemInstaller
|
||||
def write_cache_file
|
||||
end
|
||||
|
||||
+ def build_extensions
|
||||
+ end
|
||||
+
|
||||
def shebang(bin_file_name)
|
||||
path = File.join(gem_dir, spec.bindir, bin_file_name)
|
||||
first_line = File.open(path, "rb") {|file| file.gets}
|
||||
@@ -940,13 +943,12 @@ def ensure_writable_dir(dir)
|
||||
install_default_gem('ext', srcdir, bindir)
|
||||
end
|
||||
|
||||
-def load_gemspec(file, expanded = false)
|
||||
+def load_gemspec(file, base = nil)
|
||||
file = File.realpath(file)
|
||||
code = File.read(file, encoding: "utf-8:-")
|
||||
code.gsub!(/(?:`git[^\`]*`|%x\[git[^\]]*\])\.split\([^\)]*\)/m) do
|
||||
files = []
|
||||
- if expanded
|
||||
- base = File.dirname(file)
|
||||
+ if base
|
||||
Dir.glob("**/*", File::FNM_DOTMATCH, base: base) do |n|
|
||||
case File.basename(n); when ".", ".."; next; end
|
||||
next if File.directory?(File.join(base, n))
|
||||
@@ -959,7 +961,7 @@ def load_gemspec(file, expanded = false)
|
||||
unless Gem::Specification === spec
|
||||
raise TypeError, "[#{file}] isn't a Gem::Specification (#{spec.class} instead)."
|
||||
end
|
||||
- spec.loaded_from = file
|
||||
+ spec.loaded_from = base ? File.join(base, File.basename(file)) : file
|
||||
spec.files.reject! {|n| n.end_with?(".gemspec") or n.start_with?(".git")}
|
||||
|
||||
spec
|
||||
@@ -1014,20 +1016,6 @@ def install_default_gem(dir, srcdir, bindir)
|
||||
end
|
||||
|
||||
install?(:ext, :comm, :gem, :'bundled-gems') do
|
||||
- if CONFIG['CROSS_COMPILING'] == 'yes'
|
||||
- # The following hacky steps set "$ruby = BASERUBY" in tool/fake.rb
|
||||
- $hdrdir = ''
|
||||
- $extmk = nil
|
||||
- $ruby = nil # ...
|
||||
- ruby_path = $ruby + " -I#{Dir.pwd}" # $baseruby + " -I#{Dir.pwd}"
|
||||
- else
|
||||
- # ruby_path = File.expand_path(with_destdir(File.join(bindir, ruby_install_name)))
|
||||
- ENV['RUBYLIB'] = nil
|
||||
- ENV['RUBYOPT'] = nil
|
||||
- ruby_path = File.expand_path(with_destdir(File.join(bindir, ruby_install_name))) + " --disable=gems -I#{with_destdir(archlibdir)}"
|
||||
- end
|
||||
- Gem.instance_variable_set(:@ruby, ruby_path) if Gem.ruby != ruby_path
|
||||
-
|
||||
gem_dir = Gem.default_dir
|
||||
install_dir = with_destdir(gem_dir)
|
||||
prepare "bundled gems", gem_dir
|
||||
@@ -1047,40 +1035,28 @@ def install_default_gem(dir, srcdir, bindir)
|
||||
:wrappers => true,
|
||||
:format_executable => true,
|
||||
}
|
||||
- gem_ext_dir = "#$extout/gems/#{CONFIG['arch']}"
|
||||
- extensions_dir = with_destdir(Gem::StubSpecification.gemspec_stub("", gem_dir, gem_dir).extensions_dir)
|
||||
+
|
||||
+ extensions_dir = Gem::StubSpecification.gemspec_stub("", gem_dir, gem_dir).extensions_dir
|
||||
+ specifications_dir = File.join(gem_dir, "specifications")
|
||||
+ build_dir = Gem::StubSpecification.gemspec_stub("", ".bundle", ".bundle").extensions_dir
|
||||
|
||||
File.foreach("#{srcdir}/gems/bundled_gems") do |name|
|
||||
next if /^\s*(?:#|$)/ =~ name
|
||||
next unless /^(\S+)\s+(\S+).*/ =~ name
|
||||
gem_name = "#$1-#$2"
|
||||
- path = "#{srcdir}/.bundle/gems/#{gem_name}/#{gem_name}.gemspec"
|
||||
- if File.exist?(path)
|
||||
- spec = load_gemspec(path)
|
||||
- else
|
||||
- path = "#{srcdir}/.bundle/gems/#{gem_name}/#$1.gemspec"
|
||||
- next unless File.exist?(path)
|
||||
- spec = load_gemspec(path, true)
|
||||
- end
|
||||
+ path = "#{srcdir}/.bundle/specifications/#{gem_name}.gemspec"
|
||||
+ next unless File.exist?(path)
|
||||
+ spec = load_gemspec(path, "#{srcdir}/.bundle/gems/#{gem_name}")
|
||||
next unless spec.platform == Gem::Platform::RUBY
|
||||
next unless spec.full_name == gem_name
|
||||
- if !spec.extensions.empty? && CONFIG["EXTSTATIC"] == "static"
|
||||
- puts "skip installation of #{spec.name} #{spec.version}; bundled gem with an extension library is not supported on --with-static-linked-ext"
|
||||
- next
|
||||
- end
|
||||
spec.extension_dir = "#{extensions_dir}/#{spec.full_name}"
|
||||
- if File.directory?(ext = "#{gem_ext_dir}/#{spec.full_name}")
|
||||
- spec.extensions[0] ||= "-"
|
||||
- end
|
||||
package = RbInstall::DirPackage.new spec
|
||||
ins = RbInstall::UnpackedInstaller.new(package, options)
|
||||
puts "#{INDENT}#{spec.name} #{spec.version}"
|
||||
ins.install
|
||||
- unless $dryrun
|
||||
- File.chmod($data_mode, File.join(install_dir, "specifications", "#{spec.full_name}.gemspec"))
|
||||
- end
|
||||
- unless spec.extensions.empty?
|
||||
- install_recursive(ext, spec.extension_dir)
|
||||
+ install_recursive("#{build_dir}/#{gem_name}", "#{extensions_dir}/#{gem_name}") do |src, dest|
|
||||
+ # puts "#{INDENT} #{dest[extensions_dir.size+gem_name.size+2..-1]}"
|
||||
+ install src, dest, :mode => (File.executable?(src) ? $prog_mode : $data_mode)
|
||||
end
|
||||
installed_gems[spec.full_name] = true
|
||||
end
|
@ -0,0 +1,256 @@
|
||||
From 4d9cc9afa47981520d991d19fd78b322f1ba9f2a Mon Sep 17 00:00:00 2001
|
||||
From: Jarek Prokop <jprokop@redhat.com>
|
||||
Date: Wed, 22 Jun 2022 01:03:49 +0200
|
||||
Subject: [PATCH] Detect compaction support during runtime.
|
||||
|
||||
The patch is created by backporting 3 commits from
|
||||
the upstream Ruby master branch in the chronological order below.
|
||||
|
||||
https://github.com/ruby/ruby/commit/52d42e702375446746164a0251e1a10bce813b78
|
||||
https://github.com/ruby/ruby/commit/79eaaf2d0b641710613f16525e4b4c439dfe854e
|
||||
https://github.com/ruby/ruby/commit/2c190863239bee3f54cfb74b16bb6ea4cae6ed20
|
||||
|
||||
== How to create this patch ==
|
||||
|
||||
Download Ruby source code.
|
||||
```
|
||||
$ git clone https://github.com/ruby/ruby.git
|
||||
$ cd ruby
|
||||
```
|
||||
|
||||
First create a commit squashed from the 3 commits above.
|
||||
Checkout the second commmit above, and create a temporary branch.
|
||||
```
|
||||
$ git checkout 79eaaf2d0b641710613f16525e4b4c439dfe854e
|
||||
$ git checkout -b wip/detect-compaction-runtime-tmp
|
||||
```
|
||||
|
||||
Cherry pick the third commit on the second commit.
|
||||
```
|
||||
$ git cherry-pick 2c190863239bee3f54cfb74b16bb6ea4cae6ed20
|
||||
```
|
||||
|
||||
Squash the last 3 commits on the branch.
|
||||
```
|
||||
$ git rebase -i 2223eb082afa6d05321b69df783d4133b9aacba6
|
||||
```
|
||||
|
||||
Then checkout Ruby 3.1.2 branch.
|
||||
Create a new branch.
|
||||
Merge the Fedora Ruby's
|
||||
ruby-3.2.0-define-unsupported-gc-compaction-methods-as-rb_f_notimplement.patch.
|
||||
```
|
||||
$ git checkout v3_1_2
|
||||
$ git checkout -b wip/detect-compaction-runtime
|
||||
$ patch -p1 <
|
||||
~/fed/ruby/ruby-3.2.0-define-unsupported-gc-compaction-methods-as-rb_f_notimplement.patch
|
||||
$ git add gc.c gc.rb test/ruby/test_gc_compact.rb
|
||||
$ git commit
|
||||
```
|
||||
|
||||
Merge the squashed one commit on the
|
||||
`wip/detect-compaction-runtime-tmp` branch
|
||||
into the `wip/detect-compaction-runtime` branch.
|
||||
```
|
||||
$ git cherry-pick <the squashed commit above>
|
||||
```
|
||||
|
||||
Fix conflicts seeing the difference by `git show <the squashed commit
|
||||
above>`
|
||||
on another terminal.
|
||||
```
|
||||
$ vi gc.c
|
||||
$ git add gc.c
|
||||
$ git commit
|
||||
```
|
||||
|
||||
== Original commit messages ==
|
||||
|
||||
This is a combination of 3 commits.
|
||||
This is the 1st commit message:
|
||||
~~~
|
||||
Rename GC_COMPACTION_SUPPORTED
|
||||
|
||||
Naming this macro GC_COMPACTION_SUPPORTED is misleading because it
|
||||
only checks whether compaction is supported at compile time.
|
||||
|
||||
[Bug #18829]
|
||||
~~~
|
||||
|
||||
This is the commit message #2:
|
||||
~~~
|
||||
Include runtime checks for compaction support
|
||||
|
||||
Commit 0c36ba53192c5a0d245c9b626e4346a32d7d144e changed GC compaction
|
||||
methods to not be implemented when not supported. However, that commit
|
||||
only does compile time checks (which currently only checks for WASM),
|
||||
but there are additional compaction support checks during run time.
|
||||
|
||||
This commit changes it so that GC compaction methods aren't defined
|
||||
during run time if the platform does not support GC compaction.
|
||||
|
||||
[Bug #18829]
|
||||
~~~
|
||||
|
||||
This is the commit message #3:
|
||||
~~~
|
||||
Suppress code unused unless GC_CAN_COMPILE_COMPACTION
|
||||
~~~
|
||||
---
|
||||
gc.c | 63 +++++++++++++++++++++++++++++++++++++++++-------------------
|
||||
1 file changed, 43 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/gc.c b/gc.c
|
||||
index 1c35856c44..bff0666a17 100644
|
||||
--- a/gc.c
|
||||
+++ b/gc.c
|
||||
@@ -4980,6 +4980,23 @@ gc_unprotect_pages(rb_objspace_t *objspace, rb_heap_t *heap)
|
||||
static void gc_update_references(rb_objspace_t * objspace);
|
||||
static void invalidate_moved_page(rb_objspace_t *objspace, struct heap_page *page);
|
||||
|
||||
+#ifndef GC_CAN_COMPILE_COMPACTION
|
||||
+#if defined(__wasi__) /* WebAssembly doesn't support signals */
|
||||
+# define GC_CAN_COMPILE_COMPACTION 0
|
||||
+#else
|
||||
+# define GC_CAN_COMPILE_COMPACTION 1
|
||||
+#endif
|
||||
+#endif
|
||||
+
|
||||
+#if defined(__MINGW32__) || defined(_WIN32)
|
||||
+# define GC_COMPACTION_SUPPORTED 1
|
||||
+#else
|
||||
+/* If not MinGW, Windows, or does not have mmap, we cannot use mprotect for
|
||||
+ * the read barrier, so we must disable compaction. */
|
||||
+# define GC_COMPACTION_SUPPORTED (GC_CAN_COMPILE_COMPACTION && USE_MMAP_ALIGNED_ALLOC)
|
||||
+#endif
|
||||
+
|
||||
+#if GC_CAN_COMPILE_COMPACTION
|
||||
static void
|
||||
read_barrier_handler(uintptr_t address)
|
||||
{
|
||||
@@ -5000,6 +5017,7 @@ read_barrier_handler(uintptr_t address)
|
||||
}
|
||||
RB_VM_LOCK_LEAVE();
|
||||
}
|
||||
+#endif
|
||||
|
||||
#if defined(_WIN32)
|
||||
static LPTOP_LEVEL_EXCEPTION_FILTER old_handler;
|
||||
@@ -9250,13 +9268,7 @@ gc_start_internal(rb_execution_context_t *ec, VALUE self, VALUE full_mark, VALUE
|
||||
|
||||
/* For now, compact implies full mark / sweep, so ignore other flags */
|
||||
if (RTEST(compact)) {
|
||||
- /* If not MinGW, Windows, or does not have mmap, we cannot use mprotect for
|
||||
- * the read barrier, so we must disable compaction. */
|
||||
-#if !defined(__MINGW32__) && !defined(_WIN32)
|
||||
- if (!USE_MMAP_ALIGNED_ALLOC) {
|
||||
- rb_raise(rb_eNotImpError, "Compaction isn't available on this platform");
|
||||
- }
|
||||
-#endif
|
||||
+ GC_ASSERT(GC_COMPACTION_SUPPORTED);
|
||||
|
||||
reason |= GPR_FLAG_COMPACT;
|
||||
}
|
||||
@@ -9421,7 +9433,7 @@ gc_move(rb_objspace_t *objspace, VALUE scan, VALUE free, size_t slot_size)
|
||||
return (VALUE)src;
|
||||
}
|
||||
|
||||
-#if GC_COMPACTION_SUPPORTED
|
||||
+#if GC_CAN_COMPILE_COMPACTION
|
||||
static int
|
||||
compare_free_slots(const void *left, const void *right, void *dummy)
|
||||
{
|
||||
@@ -10149,7 +10161,7 @@ gc_update_references(rb_objspace_t *objspace)
|
||||
gc_update_table_refs(objspace, finalizer_table);
|
||||
}
|
||||
|
||||
-#if GC_COMPACTION_SUPPORTED
|
||||
+#if GC_CAN_COMPILE_COMPACTION
|
||||
/*
|
||||
* call-seq:
|
||||
* GC.latest_compact_info -> {:considered=>{:T_CLASS=>11}, :moved=>{:T_CLASS=>11}}
|
||||
@@ -10190,7 +10202,7 @@ gc_compact_stats(VALUE self)
|
||||
# define gc_compact_stats rb_f_notimplement
|
||||
#endif
|
||||
|
||||
-#if GC_COMPACTION_SUPPORTED
|
||||
+#if GC_CAN_COMPILE_COMPACTION
|
||||
static void
|
||||
root_obj_check_moved_i(const char *category, VALUE obj, void *data)
|
||||
{
|
||||
@@ -10269,7 +10281,7 @@ gc_compact(VALUE self)
|
||||
# define gc_compact rb_f_notimplement
|
||||
#endif
|
||||
|
||||
-#if GC_COMPACTION_SUPPORTED
|
||||
+#if GC_CAN_COMPILE_COMPACTION
|
||||
/*
|
||||
* call-seq:
|
||||
* GC.verify_compaction_references(toward: nil, double_heap: false) -> hash
|
||||
@@ -10800,7 +10812,7 @@ gc_disable(rb_execution_context_t *ec, VALUE _)
|
||||
return rb_gc_disable();
|
||||
}
|
||||
|
||||
-#if GC_COMPACTION_SUPPORTED
|
||||
+#if GC_CAN_COMPILE_COMPACTION
|
||||
/*
|
||||
* call-seq:
|
||||
* GC.auto_compact = flag
|
||||
@@ -10814,8 +10826,7 @@ gc_disable(rb_execution_context_t *ec, VALUE _)
|
||||
static VALUE
|
||||
gc_set_auto_compact(VALUE _, VALUE v)
|
||||
{
|
||||
- /* If not MinGW, Windows, or does not have mmap, we cannot use mprotect for
|
||||
- * the read barrier, so we must disable automatic compaction. */
|
||||
+ GC_ASSERT(GC_COMPACTION_SUPPORTED);
|
||||
|
||||
ruby_enable_autocompact = RTEST(v);
|
||||
return v;
|
||||
@@ -10824,7 +10835,8 @@ gc_set_auto_compact(VALUE _, VALUE v)
|
||||
# define gc_set_auto_compact rb_f_notimplement
|
||||
#endif
|
||||
|
||||
-#if GC_COMPACTION_SUPPORTED
|
||||
+
|
||||
+#if GC_CAN_COMPILE_COMPACTION
|
||||
/*
|
||||
* call-seq:
|
||||
* GC.auto_compact -> true or false
|
||||
@@ -13696,11 +13708,21 @@ Init_GC(void)
|
||||
rb_define_singleton_method(rb_mGC, "malloc_allocated_size", gc_malloc_allocated_size, 0);
|
||||
rb_define_singleton_method(rb_mGC, "malloc_allocations", gc_malloc_allocations, 0);
|
||||
#endif
|
||||
- rb_define_singleton_method(rb_mGC, "compact", gc_compact, 0);
|
||||
- rb_define_singleton_method(rb_mGC, "auto_compact", gc_get_auto_compact, 0);
|
||||
- rb_define_singleton_method(rb_mGC, "auto_compact=", gc_set_auto_compact, 1);
|
||||
- rb_define_singleton_method(rb_mGC, "latest_compact_info", gc_compact_stats, 0);
|
||||
- rb_define_singleton_method(rb_mGC, "verify_compaction_references", gc_verify_compaction_references, -1);
|
||||
+ if (GC_COMPACTION_SUPPORTED) {
|
||||
+ rb_define_singleton_method(rb_mGC, "compact", gc_compact, 0);
|
||||
+ rb_define_singleton_method(rb_mGC, "auto_compact", gc_get_auto_compact, 0);
|
||||
+ rb_define_singleton_method(rb_mGC, "auto_compact=", gc_set_auto_compact, 1);
|
||||
+ rb_define_singleton_method(rb_mGC, "latest_compact_info", gc_compact_stats, 0);
|
||||
+ rb_define_singleton_method(rb_mGC, "verify_compaction_references", gc_verify_compaction_references, -1);
|
||||
+ }
|
||||
+ else {
|
||||
+ rb_define_singleton_method(rb_mGC, "compact", rb_f_notimplement, 0);
|
||||
+ rb_define_singleton_method(rb_mGC, "auto_compact", rb_f_notimplement, 0);
|
||||
+ rb_define_singleton_method(rb_mGC, "auto_compact=", rb_f_notimplement, 1);
|
||||
+ rb_define_singleton_method(rb_mGC, "latest_compact_info", rb_f_notimplement, 0);
|
||||
+ /* When !GC_COMPACTION_SUPPORTED, this method is not defined in gc.rb */
|
||||
+ rb_define_singleton_method(rb_mGC, "verify_compaction_references", rb_f_notimplement, -1);
|
||||
+ }
|
||||
|
||||
#if GC_DEBUG_STRESS_TO_CLASS
|
||||
rb_define_singleton_method(rb_mGC, "add_stress_to_class", rb_gcdebug_add_stress_to_class, -1);
|
||||
@@ -13724,6 +13746,7 @@ Init_GC(void)
|
||||
OPT(MALLOC_ALLOCATED_SIZE);
|
||||
OPT(MALLOC_ALLOCATED_SIZE_CHECK);
|
||||
OPT(GC_PROFILE_DETAIL_MEMORY);
|
||||
+ OPT(GC_COMPACTION_SUPPORTED);
|
||||
#undef OPT
|
||||
OBJ_FREEZE(opts);
|
||||
}
|
||||
--
|
||||
2.36.1
|
||||
|
@ -0,0 +1,402 @@
|
||||
commit 6d1ca6737f31b2e24664a093f1827dd74a121a9f
|
||||
Author: Jarek Prokop <jprokop@redhat.com>
|
||||
Date: Thu May 26 11:28:13 2022 +0200
|
||||
|
||||
Gc ppc64le fix
|
||||
|
||||
diff --git a/gc.c b/gc.c
|
||||
index ef9327df1f..1c35856c44 100644
|
||||
--- a/gc.c
|
||||
+++ b/gc.c
|
||||
@@ -9421,6 +9421,7 @@ gc_move(rb_objspace_t *objspace, VALUE scan, VALUE free, size_t slot_size)
|
||||
return (VALUE)src;
|
||||
}
|
||||
|
||||
+#if GC_COMPACTION_SUPPORTED
|
||||
static int
|
||||
compare_free_slots(const void *left, const void *right, void *dummy)
|
||||
{
|
||||
@@ -9468,6 +9469,7 @@ gc_sort_heap_by_empty_slots(rb_objspace_t *objspace)
|
||||
free(page_list);
|
||||
}
|
||||
}
|
||||
+#endif
|
||||
|
||||
static void
|
||||
gc_ref_update_array(rb_objspace_t * objspace, VALUE v)
|
||||
@@ -10147,8 +10149,21 @@ gc_update_references(rb_objspace_t *objspace)
|
||||
gc_update_table_refs(objspace, finalizer_table);
|
||||
}
|
||||
|
||||
+#if GC_COMPACTION_SUPPORTED
|
||||
+/*
|
||||
+ * call-seq:
|
||||
+ * GC.latest_compact_info -> {:considered=>{:T_CLASS=>11}, :moved=>{:T_CLASS=>11}}
|
||||
+ *
|
||||
+ * Returns information about object moved in the most recent GC compaction.
|
||||
+ *
|
||||
+ * The returned hash has two keys :considered and :moved. The hash for
|
||||
+ * :considered lists the number of objects that were considered for movement
|
||||
+ * by the compactor, and the :moved hash lists the number of objects that
|
||||
+ * were actually moved. Some objects can't be moved (maybe they were pinned)
|
||||
+ * so these numbers can be used to calculate compaction efficiency.
|
||||
+ */
|
||||
static VALUE
|
||||
-gc_compact_stats(rb_execution_context_t *ec, VALUE self)
|
||||
+gc_compact_stats(VALUE self)
|
||||
{
|
||||
size_t i;
|
||||
rb_objspace_t *objspace = &rb_objspace;
|
||||
@@ -10171,7 +10186,11 @@ gc_compact_stats(rb_execution_context_t *ec, VALUE self)
|
||||
|
||||
return h;
|
||||
}
|
||||
+#else
|
||||
+# define gc_compact_stats rb_f_notimplement
|
||||
+#endif
|
||||
|
||||
+#if GC_COMPACTION_SUPPORTED
|
||||
static void
|
||||
root_obj_check_moved_i(const char *category, VALUE obj, void *data)
|
||||
{
|
||||
@@ -10221,22 +10240,78 @@ heap_check_moved_i(void *vstart, void *vend, size_t stride, void *data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * call-seq:
|
||||
+ * GC.compact
|
||||
+ *
|
||||
+ * This function compacts objects together in Ruby's heap. It eliminates
|
||||
+ * unused space (or fragmentation) in the heap by moving objects in to that
|
||||
+ * unused space. This function returns a hash which contains statistics about
|
||||
+ * which objects were moved. See `GC.latest_gc_info` for details about
|
||||
+ * compaction statistics.
|
||||
+ *
|
||||
+ * This method is implementation specific and not expected to be implemented
|
||||
+ * in any implementation besides MRI.
|
||||
+ *
|
||||
+ * To test whether GC compaction is supported, use the idiom:
|
||||
+ *
|
||||
+ * GC.respond_to?(:compact)
|
||||
+ */
|
||||
static VALUE
|
||||
-gc_compact(rb_execution_context_t *ec, VALUE self)
|
||||
+gc_compact(VALUE self)
|
||||
{
|
||||
/* Run GC with compaction enabled */
|
||||
- gc_start_internal(ec, self, Qtrue, Qtrue, Qtrue, Qtrue);
|
||||
+ gc_start_internal(NULL, self, Qtrue, Qtrue, Qtrue, Qtrue);
|
||||
|
||||
- return gc_compact_stats(ec, self);
|
||||
+ return gc_compact_stats(self);
|
||||
}
|
||||
+#else
|
||||
+# define gc_compact rb_f_notimplement
|
||||
+#endif
|
||||
|
||||
+#if GC_COMPACTION_SUPPORTED
|
||||
+/*
|
||||
+ * call-seq:
|
||||
+ * GC.verify_compaction_references(toward: nil, double_heap: false) -> hash
|
||||
+ *
|
||||
+ * Verify compaction reference consistency.
|
||||
+ *
|
||||
+ * This method is implementation specific. During compaction, objects that
|
||||
+ * were moved are replaced with T_MOVED objects. No object should have a
|
||||
+ * reference to a T_MOVED object after compaction.
|
||||
+ *
|
||||
+ * This function doubles the heap to ensure room to move all objects,
|
||||
+ * compacts the heap to make sure everything moves, updates all references,
|
||||
+ * then performs a full GC. If any object contains a reference to a T_MOVED
|
||||
+ * object, that object should be pushed on the mark stack, and will
|
||||
+ * make a SEGV.
|
||||
+ */
|
||||
static VALUE
|
||||
-gc_verify_compaction_references(rb_execution_context_t *ec, VALUE self, VALUE double_heap, VALUE toward_empty)
|
||||
+gc_verify_compaction_references(int argc, VALUE *argv, VALUE self)
|
||||
{
|
||||
rb_objspace_t *objspace = &rb_objspace;
|
||||
+ VALUE kwargs, double_heap = Qfalse, toward_empty = Qfalse;
|
||||
+ static ID id_toward, id_double_heap, id_empty;
|
||||
+
|
||||
+ if (!id_toward) {
|
||||
+ id_toward = rb_intern("toward");
|
||||
+ id_double_heap = rb_intern("double_heap");
|
||||
+ id_empty = rb_intern("empty");
|
||||
+ }
|
||||
+
|
||||
+ rb_scan_args(argc, argv, ":", &kwargs);
|
||||
+ if (!NIL_P(kwargs)) {
|
||||
+ if (rb_hash_has_key(kwargs, ID2SYM(id_toward))) {
|
||||
+ VALUE toward = rb_hash_aref(kwargs, ID2SYM(id_toward));
|
||||
+ toward_empty = (toward == ID2SYM(id_empty)) ? Qtrue : Qfalse;
|
||||
+ }
|
||||
+ if (rb_hash_has_key(kwargs, ID2SYM(id_double_heap))) {
|
||||
+ double_heap = rb_hash_aref(kwargs, ID2SYM(id_double_heap));
|
||||
+ }
|
||||
+ }
|
||||
|
||||
/* Clear the heap. */
|
||||
- gc_start_internal(ec, self, Qtrue, Qtrue, Qtrue, Qfalse);
|
||||
+ gc_start_internal(NULL, self, Qtrue, Qtrue, Qtrue, Qfalse);
|
||||
|
||||
RB_VM_LOCK_ENTER();
|
||||
{
|
||||
@@ -10256,13 +10331,16 @@ gc_verify_compaction_references(rb_execution_context_t *ec, VALUE self, VALUE do
|
||||
}
|
||||
RB_VM_LOCK_LEAVE();
|
||||
|
||||
- gc_start_internal(ec, self, Qtrue, Qtrue, Qtrue, Qtrue);
|
||||
+ gc_start_internal(NULL, self, Qtrue, Qtrue, Qtrue, Qtrue);
|
||||
|
||||
objspace_reachable_objects_from_root(objspace, root_obj_check_moved_i, NULL);
|
||||
objspace_each_objects(objspace, heap_check_moved_i, NULL, TRUE);
|
||||
|
||||
- return gc_compact_stats(ec, self);
|
||||
+ return gc_compact_stats(self);
|
||||
}
|
||||
+#else
|
||||
+# define gc_verify_compaction_references rb_f_notimplement
|
||||
+#endif
|
||||
|
||||
VALUE
|
||||
rb_gc_start(void)
|
||||
@@ -10722,26 +10800,45 @@ gc_disable(rb_execution_context_t *ec, VALUE _)
|
||||
return rb_gc_disable();
|
||||
}
|
||||
|
||||
+#if GC_COMPACTION_SUPPORTED
|
||||
+/*
|
||||
+ * call-seq:
|
||||
+ * GC.auto_compact = flag
|
||||
+ *
|
||||
+ * Updates automatic compaction mode.
|
||||
+ *
|
||||
+ * When enabled, the compactor will execute on every major collection.
|
||||
+ *
|
||||
+ * Enabling compaction will degrade performance on major collections.
|
||||
+ */
|
||||
static VALUE
|
||||
-gc_set_auto_compact(rb_execution_context_t *ec, VALUE _, VALUE v)
|
||||
+gc_set_auto_compact(VALUE _, VALUE v)
|
||||
{
|
||||
/* If not MinGW, Windows, or does not have mmap, we cannot use mprotect for
|
||||
* the read barrier, so we must disable automatic compaction. */
|
||||
-#if !defined(__MINGW32__) && !defined(_WIN32)
|
||||
- if (!USE_MMAP_ALIGNED_ALLOC) {
|
||||
- rb_raise(rb_eNotImpError, "Automatic compaction isn't available on this platform");
|
||||
- }
|
||||
-#endif
|
||||
|
||||
ruby_enable_autocompact = RTEST(v);
|
||||
return v;
|
||||
}
|
||||
+#else
|
||||
+# define gc_set_auto_compact rb_f_notimplement
|
||||
+#endif
|
||||
|
||||
+#if GC_COMPACTION_SUPPORTED
|
||||
+/*
|
||||
+ * call-seq:
|
||||
+ * GC.auto_compact -> true or false
|
||||
+ *
|
||||
+ * Returns whether or not automatic compaction has been enabled.
|
||||
+ */
|
||||
static VALUE
|
||||
-gc_get_auto_compact(rb_execution_context_t *ec, VALUE _)
|
||||
+gc_get_auto_compact(VALUE _)
|
||||
{
|
||||
return RBOOL(ruby_enable_autocompact);
|
||||
}
|
||||
+#else
|
||||
+# define gc_get_auto_compact rb_f_notimplement
|
||||
+#endif
|
||||
|
||||
static int
|
||||
get_envparam_size(const char *name, size_t *default_value, size_t lower_bound)
|
||||
@@ -13599,6 +13696,11 @@ Init_GC(void)
|
||||
rb_define_singleton_method(rb_mGC, "malloc_allocated_size", gc_malloc_allocated_size, 0);
|
||||
rb_define_singleton_method(rb_mGC, "malloc_allocations", gc_malloc_allocations, 0);
|
||||
#endif
|
||||
+ rb_define_singleton_method(rb_mGC, "compact", gc_compact, 0);
|
||||
+ rb_define_singleton_method(rb_mGC, "auto_compact", gc_get_auto_compact, 0);
|
||||
+ rb_define_singleton_method(rb_mGC, "auto_compact=", gc_set_auto_compact, 1);
|
||||
+ rb_define_singleton_method(rb_mGC, "latest_compact_info", gc_compact_stats, 0);
|
||||
+ rb_define_singleton_method(rb_mGC, "verify_compaction_references", gc_verify_compaction_references, -1);
|
||||
|
||||
#if GC_DEBUG_STRESS_TO_CLASS
|
||||
rb_define_singleton_method(rb_mGC, "add_stress_to_class", rb_gcdebug_add_stress_to_class, -1);
|
||||
diff --git a/test/ruby/test_gc_compact.rb b/test/ruby/test_gc_compact.rb
|
||||
index 42ad028530..411d5eab69 100644
|
||||
--- a/test/ruby/test_gc_compact.rb
|
||||
+++ b/test/ruby/test_gc_compact.rb
|
||||
@@ -9,14 +9,7 @@
|
||||
end
|
||||
|
||||
class TestGCCompact < Test::Unit::TestCase
|
||||
- module SupportsCompact
|
||||
- def setup
|
||||
- skip "autocompact not supported on this platform" unless supports_auto_compact?
|
||||
- super
|
||||
- end
|
||||
-
|
||||
- private
|
||||
-
|
||||
+ module CompactionSupportInspector
|
||||
def supports_auto_compact?
|
||||
return true unless defined?(Etc::SC_PAGE_SIZE)
|
||||
|
||||
@@ -30,10 +23,19 @@ def supports_auto_compact?
|
||||
end
|
||||
end
|
||||
|
||||
- include SupportsCompact
|
||||
+ module OmitUnlessCompactSupported
|
||||
+ include CompactionSupportInspector
|
||||
+
|
||||
+ def setup
|
||||
+ omit "autocompact not supported on this platform" unless supports_auto_compact?
|
||||
+ super
|
||||
+ end
|
||||
+ end
|
||||
+
|
||||
+ include OmitUnlessCompactSupported
|
||||
|
||||
class AutoCompact < Test::Unit::TestCase
|
||||
- include SupportsCompact
|
||||
+ include OmitUnlessCompactSupported
|
||||
|
||||
def test_enable_autocompact
|
||||
before = GC.auto_compact
|
||||
@@ -87,13 +89,39 @@ def test_implicit_compaction_does_something
|
||||
end
|
||||
end
|
||||
|
||||
- def os_page_size
|
||||
- return true unless defined?(Etc::SC_PAGE_SIZE)
|
||||
+ class CompactMethodsNotImplemented < Test::Unit::TestCase
|
||||
+ include CompactionSupportInspector
|
||||
+
|
||||
+ def assert_not_implemented(method, *args)
|
||||
+ omit "autocompact is supported on this platform" if supports_auto_compact?
|
||||
+
|
||||
+ assert_raise(NotImplementedError) { GC.send(method, *args) }
|
||||
+ refute(GC.respond_to?(method), "GC.#{method} should be defined as rb_f_notimplement")
|
||||
+ end
|
||||
+
|
||||
+ def test_gc_compact_not_implemented
|
||||
+ assert_not_implemented(:compact)
|
||||
+ end
|
||||
+
|
||||
+ def test_gc_auto_compact_get_not_implemented
|
||||
+ assert_not_implemented(:auto_compact)
|
||||
+ end
|
||||
+
|
||||
+ def test_gc_auto_compact_set_not_implemented
|
||||
+ assert_not_implemented(:auto_compact=, true)
|
||||
+ end
|
||||
+
|
||||
+ def test_gc_latest_compact_info_not_implemented
|
||||
+ assert_not_implemented(:latest_compact_info)
|
||||
+ end
|
||||
+
|
||||
+ def test_gc_verify_compaction_references_not_implemented
|
||||
+ assert_not_implemented(:verify_compaction_references)
|
||||
+ end
|
||||
end
|
||||
|
||||
- def setup
|
||||
- skip "autocompact not supported on this platform" unless supports_auto_compact?
|
||||
- super
|
||||
+ def os_page_size
|
||||
+ return true unless defined?(Etc::SC_PAGE_SIZE)
|
||||
end
|
||||
|
||||
def test_gc_compact_stats
|
||||
diff --git a/gc.rb b/gc.rb
|
||||
index 72637f3796..9265dd7b57 100644
|
||||
--- a/gc.rb
|
||||
+++ b/gc.rb
|
||||
@@ -38,27 +38,6 @@ def garbage_collect full_mark: true, immediate_mark: true, immediate_sweep: true
|
||||
Primitive.gc_start_internal full_mark, immediate_mark, immediate_sweep, false
|
||||
end
|
||||
|
||||
- # call-seq:
|
||||
- # GC.auto_compact -> true or false
|
||||
- #
|
||||
- # Returns whether or not automatic compaction has been enabled.
|
||||
- #
|
||||
- def self.auto_compact
|
||||
- Primitive.gc_get_auto_compact
|
||||
- end
|
||||
-
|
||||
- # call-seq:
|
||||
- # GC.auto_compact = flag
|
||||
- #
|
||||
- # Updates automatic compaction mode.
|
||||
- #
|
||||
- # When enabled, the compactor will execute on every major collection.
|
||||
- #
|
||||
- # Enabling compaction will degrade performance on major collections.
|
||||
- def self.auto_compact=(flag)
|
||||
- Primitive.gc_set_auto_compact(flag)
|
||||
- end
|
||||
-
|
||||
# call-seq:
|
||||
# GC.enable -> true or false
|
||||
#
|
||||
@@ -210,53 +189,6 @@ def self.latest_gc_info hash_or_key = nil
|
||||
Primitive.gc_latest_gc_info hash_or_key
|
||||
end
|
||||
|
||||
- # call-seq:
|
||||
- # GC.latest_compact_info -> {:considered=>{:T_CLASS=>11}, :moved=>{:T_CLASS=>11}}
|
||||
- #
|
||||
- # Returns information about object moved in the most recent GC compaction.
|
||||
- #
|
||||
- # The returned hash has two keys :considered and :moved. The hash for
|
||||
- # :considered lists the number of objects that were considered for movement
|
||||
- # by the compactor, and the :moved hash lists the number of objects that
|
||||
- # were actually moved. Some objects can't be moved (maybe they were pinned)
|
||||
- # so these numbers can be used to calculate compaction efficiency.
|
||||
- def self.latest_compact_info
|
||||
- Primitive.gc_compact_stats
|
||||
- end
|
||||
-
|
||||
- # call-seq:
|
||||
- # GC.compact
|
||||
- #
|
||||
- # This function compacts objects together in Ruby's heap. It eliminates
|
||||
- # unused space (or fragmentation) in the heap by moving objects in to that
|
||||
- # unused space. This function returns a hash which contains statistics about
|
||||
- # which objects were moved. See `GC.latest_gc_info` for details about
|
||||
- # compaction statistics.
|
||||
- #
|
||||
- # This method is implementation specific and not expected to be implemented
|
||||
- # in any implementation besides MRI.
|
||||
- def self.compact
|
||||
- Primitive.gc_compact
|
||||
- end
|
||||
-
|
||||
- # call-seq:
|
||||
- # GC.verify_compaction_references(toward: nil, double_heap: false) -> hash
|
||||
- #
|
||||
- # Verify compaction reference consistency.
|
||||
- #
|
||||
- # This method is implementation specific. During compaction, objects that
|
||||
- # were moved are replaced with T_MOVED objects. No object should have a
|
||||
- # reference to a T_MOVED object after compaction.
|
||||
- #
|
||||
- # This function doubles the heap to ensure room to move all objects,
|
||||
- # compacts the heap to make sure everything moves, updates all references,
|
||||
- # then performs a full GC. If any object contains a reference to a T_MOVED
|
||||
- # object, that object should be pushed on the mark stack, and will
|
||||
- # make a SEGV.
|
||||
- def self.verify_compaction_references(toward: nil, double_heap: false)
|
||||
- Primitive.gc_verify_compaction_references(double_heap, toward == :empty)
|
||||
- end
|
||||
-
|
||||
# call-seq:
|
||||
# GC.using_rvargc? -> true or false
|
||||
#
|
@ -0,0 +1,502 @@
|
||||
--- ruby-3.1.2/gc.rbinc 2022-04-12 13:11:17.000000000 +0200
|
||||
+++ ruby/gc.rbinc 2022-06-08 12:49:16.288024971 +0200
|
||||
@@ -9,27 +9,27 @@
|
||||
#include "builtin.h" /* for RB_BUILTIN_FUNCTION */
|
||||
struct rb_execution_context_struct; /* in vm_core.h */
|
||||
|
||||
-static VALUE builtin_inline_class_277(struct rb_execution_context_struct *ec, const VALUE self)
|
||||
+static VALUE builtin_inline_class_209(struct rb_execution_context_struct *ec, const VALUE self)
|
||||
{
|
||||
MAYBE_UNUSED(const VALUE) flag = rb_vm_lvar(ec, -3);
|
||||
-#line 277 "gc.rb"
|
||||
+#line 209 "gc.rb"
|
||||
|
||||
rb_objspace.flags.measure_gc = RTEST(flag) ? TRUE : FALSE;
|
||||
return flag;
|
||||
#line 20 "gc.rbinc"
|
||||
}
|
||||
|
||||
-static VALUE builtin_inline_class_289(struct rb_execution_context_struct *ec, const VALUE self)
|
||||
+static VALUE builtin_inline_class_221(struct rb_execution_context_struct *ec, const VALUE self)
|
||||
{
|
||||
-#line 289 "gc.rb"
|
||||
+#line 221 "gc.rb"
|
||||
return
|
||||
RBOOL(rb_objspace.flags.measure_gc);
|
||||
#line 28 "gc.rbinc"
|
||||
}
|
||||
|
||||
-static VALUE builtin_inline_class_299(struct rb_execution_context_struct *ec, const VALUE self)
|
||||
+static VALUE builtin_inline_class_231(struct rb_execution_context_struct *ec, const VALUE self)
|
||||
{
|
||||
-#line 299 "gc.rb"
|
||||
+#line 231 "gc.rb"
|
||||
return
|
||||
ULL2NUM(rb_objspace.profile.total_time_ns);
|
||||
#line 36 "gc.rbinc"
|
||||
@@ -52,31 +52,6 @@
|
||||
}
|
||||
|
||||
static void
|
||||
-mjit_compile_invokebuiltin_for_gc_get_auto_compact(FILE *f, long index, unsigned stack_size, bool inlinable_p)
|
||||
-{
|
||||
- fprintf(f, " VALUE self = GET_SELF();\n");
|
||||
- fprintf(f, " typedef VALUE (*func)(rb_execution_context_t *, VALUE);\n");
|
||||
- fprintf(f, " func f = (func)%"PRIuVALUE"; /* == gc_get_auto_compact */\n", (VALUE)gc_get_auto_compact);
|
||||
- fprintf(f, " val = f(ec, self);\n");
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
-mjit_compile_invokebuiltin_for_gc_set_auto_compact(FILE *f, long index, unsigned stack_size, bool inlinable_p)
|
||||
-{
|
||||
- fprintf(f, " VALUE self = GET_SELF();\n");
|
||||
- fprintf(f, " typedef VALUE (*func)(rb_execution_context_t *, VALUE, VALUE);\n");
|
||||
- if (index == -1) {
|
||||
- fprintf(f, " const VALUE *argv = &stack[%d];\n", stack_size - 1);
|
||||
- }
|
||||
- else {
|
||||
- fprintf(f, " const unsigned int lnum = GET_ISEQ()->body->local_table_size;\n");
|
||||
- fprintf(f, " const VALUE *argv = GET_EP() - lnum - VM_ENV_DATA_SIZE + 1 + %ld;\n", index);
|
||||
- }
|
||||
- fprintf(f, " func f = (func)%"PRIuVALUE"; /* == gc_set_auto_compact */\n", (VALUE)gc_set_auto_compact);
|
||||
- fprintf(f, " val = f(ec, self, argv[0]);\n");
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
mjit_compile_invokebuiltin_for_gc_enable(FILE *f, long index, unsigned stack_size, bool inlinable_p)
|
||||
{
|
||||
fprintf(f, " VALUE self = GET_SELF();\n");
|
||||
@@ -161,40 +136,6 @@
|
||||
}
|
||||
|
||||
static void
|
||||
-mjit_compile_invokebuiltin_for_gc_compact_stats(FILE *f, long index, unsigned stack_size, bool inlinable_p)
|
||||
-{
|
||||
- fprintf(f, " VALUE self = GET_SELF();\n");
|
||||
- fprintf(f, " typedef VALUE (*func)(rb_execution_context_t *, VALUE);\n");
|
||||
- fprintf(f, " func f = (func)%"PRIuVALUE"; /* == gc_compact_stats */\n", (VALUE)gc_compact_stats);
|
||||
- fprintf(f, " val = f(ec, self);\n");
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
-mjit_compile_invokebuiltin_for_gc_compact(FILE *f, long index, unsigned stack_size, bool inlinable_p)
|
||||
-{
|
||||
- fprintf(f, " VALUE self = GET_SELF();\n");
|
||||
- fprintf(f, " typedef VALUE (*func)(rb_execution_context_t *, VALUE);\n");
|
||||
- fprintf(f, " func f = (func)%"PRIuVALUE"; /* == gc_compact */\n", (VALUE)gc_compact);
|
||||
- fprintf(f, " val = f(ec, self);\n");
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
-mjit_compile_invokebuiltin_for_gc_verify_compaction_references(FILE *f, long index, unsigned stack_size, bool inlinable_p)
|
||||
-{
|
||||
- fprintf(f, " VALUE self = GET_SELF();\n");
|
||||
- fprintf(f, " typedef VALUE (*func)(rb_execution_context_t *, VALUE, VALUE, VALUE);\n");
|
||||
- if (index == -1) {
|
||||
- fprintf(f, " const VALUE *argv = &stack[%d];\n", stack_size - 2);
|
||||
- }
|
||||
- else {
|
||||
- fprintf(f, " const unsigned int lnum = GET_ISEQ()->body->local_table_size;\n");
|
||||
- fprintf(f, " const VALUE *argv = GET_EP() - lnum - VM_ENV_DATA_SIZE + 1 + %ld;\n", index);
|
||||
- }
|
||||
- fprintf(f, " func f = (func)%"PRIuVALUE"; /* == gc_verify_compaction_references */\n", (VALUE)gc_verify_compaction_references);
|
||||
- fprintf(f, " val = f(ec, self, argv[0], argv[1]);\n");
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
mjit_compile_invokebuiltin_for__bi0(FILE *f, long index, unsigned stack_size, bool inlinable_p)
|
||||
{
|
||||
fprintf(f, " VALUE self = GET_SELF();\n");
|
||||
@@ -202,7 +143,7 @@
|
||||
if (inlinable_p) {
|
||||
fprintf(f, "%s", " {\n");
|
||||
fprintf(f, "%s", " MAYBE_UNUSED(const VALUE) flag = rb_vm_lvar(ec, -3);\n");
|
||||
- fprintf(f, "%s", "#line 277 \"gc.rb\"\n");
|
||||
+ fprintf(f, "%s", "#line 209 \"gc.rb\"\n");
|
||||
fprintf(f, "%s", " \n");
|
||||
fprintf(f, "%s", " rb_objspace.flags.measure_gc = RTEST(flag) ? TRUE : FALSE;\n");
|
||||
fprintf(f, "%s", " return flag;\n");
|
||||
@@ -211,7 +152,7 @@
|
||||
fprintf(f, "%s", " \n");
|
||||
return;
|
||||
}
|
||||
- fprintf(f, " func f = (func)%"PRIuVALUE"; /* == builtin_inline_class_277 */\n", (VALUE)builtin_inline_class_277);
|
||||
+ fprintf(f, " func f = (func)%"PRIuVALUE"; /* == builtin_inline_class_209 */\n", (VALUE)builtin_inline_class_209);
|
||||
fprintf(f, " val = f(ec, self);\n");
|
||||
}
|
||||
|
||||
@@ -222,7 +163,7 @@
|
||||
fprintf(f, " typedef VALUE (*func)(rb_execution_context_t *, VALUE);\n");
|
||||
if (inlinable_p) {
|
||||
fprintf(f, "%s", " {\n");
|
||||
- fprintf(f, "%s", "#line 289 \"gc.rb\"\n");
|
||||
+ fprintf(f, "%s", "#line 221 \"gc.rb\"\n");
|
||||
fprintf(f, "%s", " return \n");
|
||||
fprintf(f, "%s", " RBOOL(rb_objspace.flags.measure_gc);\n");
|
||||
fprintf(f, "%s", "#line 52 \"gc.rbinc\"\n");
|
||||
@@ -230,7 +171,7 @@
|
||||
fprintf(f, "%s", " \n");
|
||||
return;
|
||||
}
|
||||
- fprintf(f, " func f = (func)%"PRIuVALUE"; /* == builtin_inline_class_289 */\n", (VALUE)builtin_inline_class_289);
|
||||
+ fprintf(f, " func f = (func)%"PRIuVALUE"; /* == builtin_inline_class_221 */\n", (VALUE)builtin_inline_class_221);
|
||||
fprintf(f, " val = f(ec, self);\n");
|
||||
}
|
||||
|
||||
@@ -241,7 +182,7 @@
|
||||
fprintf(f, " typedef VALUE (*func)(rb_execution_context_t *, VALUE);\n");
|
||||
if (inlinable_p) {
|
||||
fprintf(f, "%s", " {\n");
|
||||
- fprintf(f, "%s", "#line 299 \"gc.rb\"\n");
|
||||
+ fprintf(f, "%s", "#line 231 \"gc.rb\"\n");
|
||||
fprintf(f, "%s", " return \n");
|
||||
fprintf(f, "%s", " ULL2NUM(rb_objspace.profile.total_time_ns);\n");
|
||||
fprintf(f, "%s", "#line 59 \"gc.rbinc\"\n");
|
||||
@@ -249,7 +190,7 @@
|
||||
fprintf(f, "%s", " \n");
|
||||
return;
|
||||
}
|
||||
- fprintf(f, " func f = (func)%"PRIuVALUE"; /* == builtin_inline_class_299 */\n", (VALUE)builtin_inline_class_299);
|
||||
+ fprintf(f, " func f = (func)%"PRIuVALUE"; /* == builtin_inline_class_231 */\n", (VALUE)builtin_inline_class_231);
|
||||
fprintf(f, " val = f(ec, self);\n");
|
||||
}
|
||||
|
||||
@@ -258,21 +199,16 @@
|
||||
// table definition
|
||||
static const struct rb_builtin_function gc_table[] = {
|
||||
RB_BUILTIN_FUNCTION(0, gc_start_internal, gc_start_internal, 4, mjit_compile_invokebuiltin_for_gc_start_internal),
|
||||
- RB_BUILTIN_FUNCTION(1, gc_get_auto_compact, gc_get_auto_compact, 0, mjit_compile_invokebuiltin_for_gc_get_auto_compact),
|
||||
- RB_BUILTIN_FUNCTION(2, gc_set_auto_compact, gc_set_auto_compact, 1, mjit_compile_invokebuiltin_for_gc_set_auto_compact),
|
||||
- RB_BUILTIN_FUNCTION(3, gc_enable, gc_enable, 0, mjit_compile_invokebuiltin_for_gc_enable),
|
||||
- RB_BUILTIN_FUNCTION(4, gc_disable, gc_disable, 0, mjit_compile_invokebuiltin_for_gc_disable),
|
||||
- RB_BUILTIN_FUNCTION(5, gc_stress_get, gc_stress_get, 0, mjit_compile_invokebuiltin_for_gc_stress_get),
|
||||
- RB_BUILTIN_FUNCTION(6, gc_stress_set_m, gc_stress_set_m, 1, mjit_compile_invokebuiltin_for_gc_stress_set_m),
|
||||
- RB_BUILTIN_FUNCTION(7, gc_count, gc_count, 0, mjit_compile_invokebuiltin_for_gc_count),
|
||||
- RB_BUILTIN_FUNCTION(8, gc_stat, gc_stat, 1, mjit_compile_invokebuiltin_for_gc_stat),
|
||||
- RB_BUILTIN_FUNCTION(9, gc_latest_gc_info, gc_latest_gc_info, 1, mjit_compile_invokebuiltin_for_gc_latest_gc_info),
|
||||
- RB_BUILTIN_FUNCTION(10, gc_compact_stats, gc_compact_stats, 0, mjit_compile_invokebuiltin_for_gc_compact_stats),
|
||||
- RB_BUILTIN_FUNCTION(11, gc_compact, gc_compact, 0, mjit_compile_invokebuiltin_for_gc_compact),
|
||||
- RB_BUILTIN_FUNCTION(12, gc_verify_compaction_references, gc_verify_compaction_references, 2, mjit_compile_invokebuiltin_for_gc_verify_compaction_references),
|
||||
- RB_BUILTIN_FUNCTION(13, _bi0, builtin_inline_class_277, 0, mjit_compile_invokebuiltin_for__bi0),
|
||||
- RB_BUILTIN_FUNCTION(14, _bi1, builtin_inline_class_289, 0, mjit_compile_invokebuiltin_for__bi1),
|
||||
- RB_BUILTIN_FUNCTION(15, _bi2, builtin_inline_class_299, 0, mjit_compile_invokebuiltin_for__bi2),
|
||||
+ RB_BUILTIN_FUNCTION(1, gc_enable, gc_enable, 0, mjit_compile_invokebuiltin_for_gc_enable),
|
||||
+ RB_BUILTIN_FUNCTION(2, gc_disable, gc_disable, 0, mjit_compile_invokebuiltin_for_gc_disable),
|
||||
+ RB_BUILTIN_FUNCTION(3, gc_stress_get, gc_stress_get, 0, mjit_compile_invokebuiltin_for_gc_stress_get),
|
||||
+ RB_BUILTIN_FUNCTION(4, gc_stress_set_m, gc_stress_set_m, 1, mjit_compile_invokebuiltin_for_gc_stress_set_m),
|
||||
+ RB_BUILTIN_FUNCTION(5, gc_count, gc_count, 0, mjit_compile_invokebuiltin_for_gc_count),
|
||||
+ RB_BUILTIN_FUNCTION(6, gc_stat, gc_stat, 1, mjit_compile_invokebuiltin_for_gc_stat),
|
||||
+ RB_BUILTIN_FUNCTION(7, gc_latest_gc_info, gc_latest_gc_info, 1, mjit_compile_invokebuiltin_for_gc_latest_gc_info),
|
||||
+ RB_BUILTIN_FUNCTION(8, _bi0, builtin_inline_class_209, 0, mjit_compile_invokebuiltin_for__bi0),
|
||||
+ RB_BUILTIN_FUNCTION(9, _bi1, builtin_inline_class_221, 0, mjit_compile_invokebuiltin_for__bi1),
|
||||
+ RB_BUILTIN_FUNCTION(10, _bi2, builtin_inline_class_231, 0, mjit_compile_invokebuiltin_for__bi2),
|
||||
RB_BUILTIN_FUNCTION(-1, NULL, NULL, 0, 0),
|
||||
};
|
||||
|
||||
@@ -282,8 +218,6 @@
|
||||
COMPILER_WARNING_ERROR(-Wincompatible-pointer-types)
|
||||
#endif
|
||||
if (0) rb_builtin_function_check_arity4(gc_start_internal);
|
||||
- if (0) rb_builtin_function_check_arity0(gc_get_auto_compact);
|
||||
- if (0) rb_builtin_function_check_arity1(gc_set_auto_compact);
|
||||
if (0) rb_builtin_function_check_arity0(gc_enable);
|
||||
if (0) rb_builtin_function_check_arity0(gc_disable);
|
||||
if (0) rb_builtin_function_check_arity0(gc_stress_get);
|
||||
@@ -291,12 +225,9 @@
|
||||
if (0) rb_builtin_function_check_arity0(gc_count);
|
||||
if (0) rb_builtin_function_check_arity1(gc_stat);
|
||||
if (0) rb_builtin_function_check_arity1(gc_latest_gc_info);
|
||||
- if (0) rb_builtin_function_check_arity0(gc_compact_stats);
|
||||
- if (0) rb_builtin_function_check_arity0(gc_compact);
|
||||
- if (0) rb_builtin_function_check_arity2(gc_verify_compaction_references);
|
||||
- if (0) rb_builtin_function_check_arity0(builtin_inline_class_277);
|
||||
- if (0) rb_builtin_function_check_arity0(builtin_inline_class_289);
|
||||
- if (0) rb_builtin_function_check_arity0(builtin_inline_class_299);
|
||||
+ if (0) rb_builtin_function_check_arity0(builtin_inline_class_209);
|
||||
+ if (0) rb_builtin_function_check_arity0(builtin_inline_class_221);
|
||||
+ if (0) rb_builtin_function_check_arity0(builtin_inline_class_231);
|
||||
COMPILER_WARNING_POP
|
||||
|
||||
// load
|
||||
--- ruby-3.1.2/miniprelude.c 2022-04-12 13:11:17.000000000 +0200
|
||||
+++ ruby/miniprelude.c 2022-06-08 12:49:16.377024871 +0200
|
||||
@@ -545,11 +545,10 @@
|
||||
|
||||
static const char prelude_name2[] = "<internal:gc>";
|
||||
static const struct {
|
||||
- char L0[479]; /* 1..58 */
|
||||
- char L58[508]; /* 59..204 */
|
||||
- char L204[504]; /* 205..275 */
|
||||
- char L275[490]; /* 276..306 */
|
||||
- char L306[128]; /* 307..312 */
|
||||
+ char L0[492]; /* 1..70 */
|
||||
+ char L70[468]; /* 71..197 */
|
||||
+ char L197[470]; /* 198..237 */
|
||||
+ char L237[211]; /* 238..244 */
|
||||
} prelude_code2 = {
|
||||
#line 1 "gc.rb"
|
||||
""/* for gc.c */
|
||||
@@ -593,29 +592,6 @@
|
||||
" end\n"
|
||||
"\n"
|
||||
"\n"/* call-seq: */
|
||||
-"\n"/* GC.auto_compact -> true or false */
|
||||
-"\n"/* */
|
||||
-"\n"/* Returns whether or not automatic compaction has been enabled. */
|
||||
-"\n"/* */
|
||||
-" def self.auto_compact\n"
|
||||
-" Primitive.gc_get_auto_compact\n"
|
||||
-" end\n"
|
||||
-"\n"
|
||||
-"\n"/* call-seq: */
|
||||
-"\n"/* GC.auto_compact = flag */
|
||||
-"\n"/* */
|
||||
-"\n"/* Updates automatic compaction mode. */
|
||||
-"\n"/* */
|
||||
-"\n"/* When enabled, the compactor will execute on every major collection. */
|
||||
-"\n"/* */
|
||||
-"\n"/* Enabling compaction will degrade performance on major collections. */
|
||||
-" def self.auto_compact=(flag)\n"
|
||||
-,
|
||||
-#line 59 "gc.rb"
|
||||
-" Primitive.gc_set_auto_compact(flag)\n"
|
||||
-" end\n"
|
||||
-"\n"
|
||||
-"\n"/* call-seq: */
|
||||
"\n"/* GC.enable -> true or false */
|
||||
"\n"/* */
|
||||
"\n"/* Enables garbage collection, returning +true+ if garbage */
|
||||
@@ -645,6 +621,8 @@
|
||||
"\n"/* GC.stress -> integer, true or false */
|
||||
"\n"/* */
|
||||
"\n"/* Returns current status of GC stress mode. */
|
||||
+,
|
||||
+#line 71 "gc.rb"
|
||||
" def self.stress\n"
|
||||
" Primitive.gc_stress_get\n"
|
||||
" end\n"
|
||||
@@ -758,8 +736,6 @@
|
||||
"\n"/* GC.latest_gc_info(:major_by) -> :malloc */
|
||||
"\n"/* */
|
||||
"\n"/* Returns information about the most recent garbage collection. */
|
||||
-,
|
||||
-#line 205 "gc.rb"
|
||||
"\n"/* */
|
||||
"\n"/* If the optional argument, hash, is given, */
|
||||
"\n"/* it is overwritten and returned. */
|
||||
@@ -768,59 +744,14 @@
|
||||
" Primitive.gc_latest_gc_info hash_or_key\n"
|
||||
" end\n"
|
||||
"\n"
|
||||
-"\n"/* call-seq: */
|
||||
-"\n"/* GC.latest_compact_info -> {:considered=>{:T_CLASS=>11}, :moved=>{:T_CLASS=>11}} */
|
||||
-"\n"/* */
|
||||
-"\n"/* Returns information about object moved in the most recent GC compaction. */
|
||||
-"\n"/* */
|
||||
-"\n"/* The returned hash has two keys :considered and :moved. The hash for */
|
||||
-"\n"/* :considered lists the number of objects that were considered for movement */
|
||||
-"\n"/* by the compactor, and the :moved hash lists the number of objects that */
|
||||
-"\n"/* were actually moved. Some objects can't be moved (maybe they were pinned) */
|
||||
-"\n"/* so these numbers can be used to calculate compaction efficiency. */
|
||||
-" def self.latest_compact_info\n"
|
||||
-" Primitive.gc_compact_stats\n"
|
||||
-" end\n"
|
||||
-"\n"
|
||||
-"\n"/* call-seq: */
|
||||
-"\n"/* GC.compact */
|
||||
-"\n"/* */
|
||||
-"\n"/* This function compacts objects together in Ruby's heap. It eliminates */
|
||||
-"\n"/* unused space (or fragmentation) in the heap by moving objects in to that */
|
||||
-"\n"/* unused space. This function returns a hash which contains statistics about */
|
||||
-"\n"/* which objects were moved. See `GC.latest_gc_info` for details about */
|
||||
-"\n"/* compaction statistics. */
|
||||
-"\n"/* */
|
||||
-"\n"/* This method is implementation specific and not expected to be implemented */
|
||||
-"\n"/* in any implementation besides MRI. */
|
||||
-" def self.compact\n"
|
||||
-" Primitive.gc_compact\n"
|
||||
-" end\n"
|
||||
-"\n"
|
||||
-"\n"/* call-seq: */
|
||||
-"\n"/* GC.verify_compaction_references(toward: nil, double_heap: false) -> hash */
|
||||
-"\n"/* */
|
||||
-"\n"/* Verify compaction reference consistency. */
|
||||
-"\n"/* */
|
||||
-"\n"/* This method is implementation specific. During compaction, objects that */
|
||||
-"\n"/* were moved are replaced with T_MOVED objects. No object should have a */
|
||||
-"\n"/* reference to a T_MOVED object after compaction. */
|
||||
-"\n"/* */
|
||||
-"\n"/* This function doubles the heap to ensure room to move all objects, */
|
||||
-"\n"/* compacts the heap to make sure everything moves, updates all references, */
|
||||
-"\n"/* then performs a full GC. If any object contains a reference to a T_MOVED */
|
||||
-"\n"/* object, that object should be pushed on the mark stack, and will */
|
||||
-"\n"/* make a SEGV. */
|
||||
-" def self.verify_compaction_references(toward: nil, double_heap: false)\n"
|
||||
-" Primitive.gc_verify_compaction_references(double_heap, toward == :empty)\n"
|
||||
-" end\n"
|
||||
-"\n"
|
||||
"\n"/* call-seq: */
|
||||
"\n"/* GC.using_rvargc? -> true or false */
|
||||
"\n"/* */
|
||||
"\n"/* Returns true if using experimental feature Variable Width Allocation, false */
|
||||
"\n"/* otherwise. */
|
||||
" def self.using_rvargc?\n"/* :nodoc: */
|
||||
+,
|
||||
+#line 198 "gc.rb"
|
||||
" GC::INTERNAL_CONSTANTS[:SIZE_POOL_COUNT] > 1\n"
|
||||
" end\n"
|
||||
"\n"
|
||||
@@ -831,8 +762,6 @@
|
||||
"\n"/* Enable to measure GC time. */
|
||||
"\n"/* You can get the result with <tt>GC.stat(:time)</tt>. */
|
||||
"\n"/* Note that GC time measurement can cause some performance overhead. */
|
||||
-,
|
||||
-#line 276 "gc.rb"
|
||||
" def self.measure_total_time=(flag)\n"
|
||||
" Primitive.cstmt! %{\n"
|
||||
" rb_objspace.flags.measure_gc = RTEST(flag) ? TRUE : FALSE;\n"
|
||||
@@ -863,15 +792,15 @@
|
||||
"end\n"
|
||||
"\n"
|
||||
"module ObjectSpace\n"
|
||||
-" def garbage_collect full_mark: true, immediate_mark: true, immediate_sweep: true\n"
|
||||
,
|
||||
-#line 307 "gc.rb"
|
||||
+#line 238 "gc.rb"
|
||||
+" def garbage_collect full_mark: true, immediate_mark: true, immediate_sweep: true\n"
|
||||
" Primitive.gc_start_internal full_mark, immediate_mark, immediate_sweep, false\n"
|
||||
" end\n"
|
||||
"\n"
|
||||
" module_function :garbage_collect\n"
|
||||
"end\n"
|
||||
-#line 875 "miniprelude.c"
|
||||
+#line 804 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name3[] = "<internal:numeric>";
|
||||
@@ -1223,7 +1152,7 @@
|
||||
" end\n"
|
||||
"\n"
|
||||
"end\n"
|
||||
-#line 1227 "miniprelude.c"
|
||||
+#line 1156 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name4[] = "<internal:io>";
|
||||
@@ -1354,7 +1283,7 @@
|
||||
" Primitive.io_write_nonblock(buf, exception)\n"
|
||||
" end\n"
|
||||
"end\n"
|
||||
-#line 1358 "miniprelude.c"
|
||||
+#line 1287 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name5[] = "<internal:marshal>";
|
||||
@@ -1402,7 +1331,7 @@
|
||||
" alias restore load\n"
|
||||
" end\n"
|
||||
"end\n"
|
||||
-#line 1406 "miniprelude.c"
|
||||
+#line 1335 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name6[] = "<internal:pack>";
|
||||
@@ -1724,7 +1653,7 @@
|
||||
" Primitive.pack_unpack1(fmt, offset)\n"
|
||||
" end\n"
|
||||
"end\n"
|
||||
-#line 1728 "miniprelude.c"
|
||||
+#line 1657 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name7[] = "<internal:trace_point>";
|
||||
@@ -2111,7 +2040,7 @@
|
||||
" Primitive.tracepoint_attr_instruction_sequence\n"
|
||||
" end\n"
|
||||
"end\n"
|
||||
-#line 2115 "miniprelude.c"
|
||||
+#line 2044 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name8[] = "<internal:warning>";
|
||||
@@ -2172,7 +2101,7 @@
|
||||
" Primitive.rb_warn_m(msgs, uplevel, category)\n"
|
||||
" end\n"
|
||||
"end\n"
|
||||
-#line 2176 "miniprelude.c"
|
||||
+#line 2105 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name9[] = "<internal:array>";
|
||||
@@ -2249,7 +2178,7 @@
|
||||
" end\n"
|
||||
" end\n"
|
||||
"end\n"
|
||||
-#line 2253 "miniprelude.c"
|
||||
+#line 2182 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name10[] = "<internal:kernel>";
|
||||
@@ -2438,7 +2367,7 @@
|
||||
" end\n"
|
||||
" end\n"
|
||||
"end\n"
|
||||
-#line 2442 "miniprelude.c"
|
||||
+#line 2371 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name11[] = "<internal:ractor>";
|
||||
@@ -3305,7 +3234,7 @@
|
||||
" }\n"
|
||||
" end\n"
|
||||
"end\n"
|
||||
-#line 3309 "miniprelude.c"
|
||||
+#line 3238 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name12[] = "<internal:timev>";
|
||||
@@ -3628,7 +3557,7 @@
|
||||
" Primitive.time_init_args(year, mon, mday, hour, min, sec, zone)\n"
|
||||
" end\n"
|
||||
"end\n"
|
||||
-#line 3632 "miniprelude.c"
|
||||
+#line 3561 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name13[] = "<internal:nilclass>";
|
||||
@@ -3661,7 +3590,7 @@
|
||||
" return 0.0\n"
|
||||
" end\n"
|
||||
"end\n"
|
||||
-#line 3665 "miniprelude.c"
|
||||
+#line 3594 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name14[] = "<internal:prelude>";
|
||||
@@ -3691,7 +3620,7 @@
|
||||
"\n"
|
||||
" private :pp\n"
|
||||
"end\n"
|
||||
-#line 3695 "miniprelude.c"
|
||||
+#line 3624 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name15[] = "<internal:gem_prelude>";
|
||||
@@ -3718,7 +3647,7 @@
|
||||
"rescue LoadError\n"
|
||||
" warn \"`did_you_mean' was not loaded.\"\n"
|
||||
"end if defined?(DidYouMean)\n"
|
||||
-#line 3722 "miniprelude.c"
|
||||
+#line 3651 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name16[] = "<internal:yjit>";
|
||||
@@ -4059,7 +3988,7 @@
|
||||
" end\n"
|
||||
" end\n"
|
||||
"end\n"
|
||||
-#line 4063 "miniprelude.c"
|
||||
+#line 3992 "miniprelude.c"
|
||||
};
|
||||
|
||||
COMPILER_WARNING_POP
|
@ -0,0 +1,31 @@
|
||||
From bfa2f72cfa3bfde34049d26dcb24976316074ad7 Mon Sep 17 00:00:00 2001
|
||||
From: Jun Aruga <jaruga@redhat.com>
|
||||
Date: Mon, 21 Mar 2022 15:36:51 +0100
|
||||
Subject: [PATCH] Fix a test for `bin/bundle update --bundler` to pass on
|
||||
ruby/ruby.
|
||||
|
||||
Consider the case that the latest Bundler version on RubyGems is higher than
|
||||
the `system_bundler_version` (= `Bundler::VERSION`) in `make test-bundler` on
|
||||
ruby/ruby.
|
||||
|
||||
See <https://bugs.ruby-lang.org/issues/18643>.
|
||||
---
|
||||
spec/bundler/commands/binstubs_spec.rb | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/spec/bundler/commands/binstubs_spec.rb b/spec/bundler/commands/binstubs_spec.rb
|
||||
index 198226207bc..2634f43417c 100644
|
||||
--- a/spec/bundler/commands/binstubs_spec.rb
|
||||
+++ b/spec/bundler/commands/binstubs_spec.rb
|
||||
@@ -226,7 +226,10 @@
|
||||
|
||||
it "calls through to the latest bundler version" do
|
||||
sys_exec "bin/bundle update --bundler", :env => { "DEBUG" => "1" }
|
||||
- expect(out).to include %(Using bundler #{system_bundler_version}\n)
|
||||
+ using_bundler_line = /Using bundler ([\w\.]+)\n/.match(out)
|
||||
+ expect(using_bundler_line).to_not be_nil
|
||||
+ latest_version = using_bundler_line[1]
|
||||
+ expect(Gem::Version.new(latest_version)).to be >= Gem::Version.new(system_bundler_version)
|
||||
end
|
||||
|
||||
it "calls through to the explicit bundler version" do
|
39
SOURCES/ruby-exercise.stp
Normal file
39
SOURCES/ruby-exercise.stp
Normal file
@ -0,0 +1,39 @@
|
||||
/* Example tapset file.
|
||||
*
|
||||
* You can execute the tapset using following command (please adjust the path
|
||||
* prior running the command, if needed):
|
||||
*
|
||||
* stap /usr/share/doc/ruby-2.0.0.0/ruby-exercise.stp -c "ruby -e \"puts 'test'\""
|
||||
*/
|
||||
|
||||
probe ruby.cmethod.entry {
|
||||
printf("%d -> %s::%s %s:%d\n", tid(), classname, methodname, file, line);
|
||||
}
|
||||
|
||||
probe ruby.cmethod.return {
|
||||
printf("%d <- %s::%s %s:%d\n", tid(), classname, methodname, file, line);
|
||||
}
|
||||
|
||||
probe ruby.method.entry {
|
||||
printf("%d -> %s::%s %s:%d\n", tid(), classname, methodname, file, line);
|
||||
}
|
||||
|
||||
probe ruby.method.return {
|
||||
printf("%d <- %s::%s %s:%d\n", tid(), classname, methodname, file, line);
|
||||
}
|
||||
|
||||
probe ruby.gc.mark.begin { printf("%d gc.mark.begin\n", tid()); }
|
||||
|
||||
probe ruby.gc.mark.end { printf("%d gc.mark.end\n", tid()); }
|
||||
|
||||
probe ruby.gc.sweep.begin { printf("%d gc.sweep.begin\n", tid()); }
|
||||
|
||||
probe ruby.gc.sweep.end { printf("%d gc.sweep.end\n", tid()); }
|
||||
|
||||
probe ruby.object.create{
|
||||
printf("%d obj.create %s %s:%d\n", tid(), classname, file, line);
|
||||
}
|
||||
|
||||
probe ruby.raise {
|
||||
printf("%d raise %s %s:%d\n", tid(), classname, file, line);
|
||||
}
|
6
SOURCES/rubygems.attr
Normal file
6
SOURCES/rubygems.attr
Normal file
@ -0,0 +1,6 @@
|
||||
%__rubygems_requires %{_rpmconfigdir}/rubygems.req
|
||||
%__rubygems_provides %{_rpmconfigdir}/rubygems.prov
|
||||
%__rubygems_conflicts %{_rpmconfigdir}/rubygems.con
|
||||
# In non-gem packages, the %%{gem_name} macro is not available and the macro
|
||||
# stays unexpanded which leads to "invalid regex" error (rhbz#1154067).
|
||||
%__rubygems_path ^%{?gem_name:%{gem_spec}}%{!?gem_name:this_should_never_match_anything}$
|
52
SOURCES/rubygems.con
Normal file
52
SOURCES/rubygems.con
Normal file
@ -0,0 +1,52 @@
|
||||
#!/usr/bin/ruby
|
||||
|
||||
require 'rubygems/package'
|
||||
|
||||
module RubyGemsReq
|
||||
module Helpers
|
||||
# Keep only '!=' requirements.
|
||||
def self.conflicts(requirements)
|
||||
conflicts = requirements.select {|r| r.first == '!='}
|
||||
end
|
||||
|
||||
# Converts Gem::Requirement into array of requirements strings compatible
|
||||
# with RPM .spec file.
|
||||
def self.requirement_versions_to_rpm(requirement)
|
||||
self.conflicts(requirement.requirements).map do |op, version|
|
||||
version == Gem::Version.new(0) ? "" : "= #{version}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Report conflicting gem dependencies including their version.
|
||||
def self.gem_depenencies(specification)
|
||||
specification.runtime_dependencies.each do |dependency|
|
||||
conflict_strings = Helpers::requirement_versions_to_rpm(dependency.requirement).map do |requirement|
|
||||
requirement_string = "rubygem(#{dependency.name}) #{requirement}"
|
||||
end
|
||||
if conflict_strings.length > 0
|
||||
conflict_string = conflict_strings.join(' with ')
|
||||
conflict_string.prepend('(').concat(')') if conflict_strings.length > 1
|
||||
puts conflict_string
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Reports all conflicts specified by all provided .gemspec files.
|
||||
def self.conflicts
|
||||
while filename = gets
|
||||
filename.strip!
|
||||
begin
|
||||
specification = Gem::Specification.load filename
|
||||
|
||||
gem_depenencies(specification)
|
||||
rescue => e
|
||||
# Ignore all errors.
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if __FILE__ == $0
|
||||
RubyGemsReq::conflicts
|
||||
end
|
36
SOURCES/rubygems.prov
Normal file
36
SOURCES/rubygems.prov
Normal file
@ -0,0 +1,36 @@
|
||||
#!/usr/bin/ruby
|
||||
|
||||
require 'rubygems/package'
|
||||
|
||||
module RubyGemsProv
|
||||
module Helpers
|
||||
# If there is some prelease version files, such as rc1 (i.e. non-numeric
|
||||
# field), prepend this field by tilde instead of dot.
|
||||
def self.normalize_prerelease(version)
|
||||
if version.prerelease?
|
||||
prerelease = version.version.sub /^#{version.release}\./, ''
|
||||
"#{version.release}~#{prerelease}"
|
||||
else
|
||||
version.release
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Reports all functionality gem provides.
|
||||
def self.provides
|
||||
while filename = gets
|
||||
filename.strip!
|
||||
begin
|
||||
specification = Gem::Specification.load filename
|
||||
|
||||
puts "rubygem(#{specification.name}) = #{Helpers::normalize_prerelease(specification.version)}"
|
||||
rescue => e
|
||||
# Ignore all errors.
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if __FILE__ == $0
|
||||
RubyGemsProv::provides
|
||||
end
|
88
SOURCES/rubygems.req
Normal file
88
SOURCES/rubygems.req
Normal file
@ -0,0 +1,88 @@
|
||||
#!/usr/bin/ruby
|
||||
|
||||
require 'rubygems/package'
|
||||
|
||||
module RubyGemsReq
|
||||
module Helpers
|
||||
# Expands '~>' and '!=' gem requirements.
|
||||
def self.expand_requirement(requirements)
|
||||
requirements.inject([]) do |output, r|
|
||||
output.concat case r.first
|
||||
when '~>'
|
||||
expand_pessimistic_requirement(r)
|
||||
when '!='
|
||||
# If there is only the conflict requirement, we still need to depend
|
||||
# on the specified gem.
|
||||
if requirements.size == 1
|
||||
Gem::Requirement.default.requirements
|
||||
else
|
||||
[]
|
||||
end
|
||||
else
|
||||
[r]
|
||||
end
|
||||
end.reject {|r| r.empty? }
|
||||
end
|
||||
|
||||
# Expands the pessimistic version operator '~>' into equivalent '>=' and
|
||||
# '<' pair.
|
||||
def self.expand_pessimistic_requirement(requirement)
|
||||
next_version = Gem::Version.create(requirement.last).bump
|
||||
return ['>=', requirement.last], ['<', next_version]
|
||||
end
|
||||
|
||||
# Converts Gem::Requirement into array of requirements strings compatible
|
||||
# with RPM .spec file.
|
||||
def self.requirement_versions_to_rpm(requirement)
|
||||
self.expand_requirement(requirement.requirements).map do |op, version|
|
||||
version == Gem::Version.new(0) ? "" : " #{op} #{version}"
|
||||
end
|
||||
end
|
||||
|
||||
# Compose dependency together with its requirements in RPM rich dependency
|
||||
# string.
|
||||
def self.compose_dependency_string(name, requirements)
|
||||
dependency_strings = requirements.map { |requirement| name + requirement }
|
||||
dependency_string = dependency_strings.join(' with ')
|
||||
dependency_string.prepend('(').concat(')') if dependency_strings.length > 1
|
||||
dependency_string
|
||||
end
|
||||
end
|
||||
|
||||
# Report RubyGems dependency, versioned if required.
|
||||
def self.rubygems_dependency(specification)
|
||||
dependency_name = "ruby(rubygems)"
|
||||
requirements = Helpers::requirement_versions_to_rpm(specification.required_rubygems_version)
|
||||
|
||||
puts Helpers::compose_dependency_string(dependency_name, requirements)
|
||||
end
|
||||
|
||||
# Report all gem dependencies including their version.
|
||||
def self.gem_depenencies(specification)
|
||||
specification.runtime_dependencies.each do |dependency|
|
||||
dependency_name = "rubygem(#{dependency.name})"
|
||||
requirements = Helpers::requirement_versions_to_rpm(dependency.requirement)
|
||||
|
||||
puts Helpers::compose_dependency_string(dependency_name, requirements)
|
||||
end
|
||||
end
|
||||
|
||||
# Reports all requirements specified by all provided .gemspec files.
|
||||
def self.requires
|
||||
while filename = gets
|
||||
filename.strip!
|
||||
begin
|
||||
specification = Gem::Specification.load filename
|
||||
|
||||
rubygems_dependency(specification)
|
||||
gem_depenencies(specification)
|
||||
rescue => e
|
||||
# Ignore all errors.
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if __FILE__ == $0
|
||||
RubyGemsReq::requires
|
||||
end
|
7
SOURCES/test_abrt.rb
Normal file
7
SOURCES/test_abrt.rb
Normal file
@ -0,0 +1,7 @@
|
||||
if !!$LOADED_FEATURES.detect { |f| f =~ /abrt\.rb/ }
|
||||
exit true
|
||||
else
|
||||
puts 'ERROR: ABRT hook was not loaded.'
|
||||
|
||||
exit false
|
||||
end
|
65
SOURCES/test_systemtap.rb
Normal file
65
SOURCES/test_systemtap.rb
Normal file
@ -0,0 +1,65 @@
|
||||
require 'set'
|
||||
|
||||
LIBRUBY_SO = 'libruby.so'
|
||||
PROBES_D = 'probes.d'
|
||||
|
||||
# These probes are excluded by VM_COLLECT_USAGE_DETAILS ifdef.
|
||||
EXCLUDE_PROBES = Set.new %w(insn insn__operand)
|
||||
|
||||
## Detect SystemTap section headers presence
|
||||
|
||||
stap_headers = [
|
||||
'\.stapsdt\.base',
|
||||
'\.note\.stapsdt'
|
||||
]
|
||||
|
||||
header_regexp = %r{ (#{stap_headers.join('|')}) }
|
||||
|
||||
section_headers = `readelf -S "#{LIBRUBY_SO}"`
|
||||
detected_stap_headers = section_headers.scan(header_regexp).flatten
|
||||
|
||||
# Assume there are both headers until this is proven wrong ;)
|
||||
unless detected_stap_headers.size == 2
|
||||
puts 'ERROR: SystemTap (DTrace) headers were not detected in resulting library.'
|
||||
exit false
|
||||
end
|
||||
|
||||
## Find if every declared probe is propagated to resulting library
|
||||
|
||||
# Colect probes specified in probes.d file.
|
||||
probes_declared = []
|
||||
|
||||
File.open(PROBES_D) do |file|
|
||||
file.each_line do |line|
|
||||
if probe = line[/probe (\S+)\(.*\);/, 1]
|
||||
probes_declared << probe
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
probes_declared = Set.new probes_declared
|
||||
|
||||
unless EXCLUDE_PROBES.subset? probes_declared
|
||||
puts 'ERROR: Change in SystemTap (DTrace) probes definition file detected.'
|
||||
exit false
|
||||
end
|
||||
|
||||
probes_declared -= EXCLUDE_PROBES
|
||||
|
||||
# Detect probes in resulting library.
|
||||
get_probes_detected = %r{
|
||||
^\s*Provider:\s+ruby,\s+Name:\s+(\S+),\s+.*$
|
||||
}
|
||||
|
||||
probes_detected = `eu-readelf -n "#{LIBRUBY_SO}"`
|
||||
|
||||
probes_detected = Set.new probes_detected.scan(get_probes_detected).flatten
|
||||
|
||||
# Both sets must be equal, otherwise something is wrong.
|
||||
unless probes_declared == probes_detected
|
||||
puts 'ERROR: SystemTap (DTrace) probes were not correctly propagated into resulting library.'
|
||||
puts " Undetected probes: #{(probes_declared - probes_detected).sort.join(', ')}\n",
|
||||
" Additional detected probes: #{(probes_detected - probes_declared).sort.join(', ')}"
|
||||
|
||||
exit false
|
||||
end
|
3009
SPECS/ruby.spec
Normal file
3009
SPECS/ruby.spec
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user