c8-stream-3.0
imports/c8-stream-3.0/ruby-3.0.4-141.module+el8.6.0+16311+3e5e17e9
commit
9a1de4f3d5
@ -0,0 +1 @@
|
|||||||
|
SOURCES/ruby-3.0.4.tar.xz
|
@ -0,0 +1 @@
|
|||||||
|
14461adca874d42a06a11851029dec877d9d28de SOURCES/ruby-3.0.4.tar.xz
|
@ -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
|
||||||
|
}
|
@ -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$ \
|
||||||
|
}
|
@ -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}
|
@ -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
|
@ -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
|
||||||
|
@@ -1930,7 +1930,7 @@ def configuration(srcdir)
|
||||||
|
SHELL = /bin/sh
|
||||||
|
|
||||||
|
# V=0 quiet, V=1 verbose. other values don't work.
|
||||||
|
-V = 0
|
||||||
|
+V = 1
|
||||||
|
Q1 = $(V:1=)
|
||||||
|
Q = $(Q1:0=@)
|
||||||
|
ECHO1 = $(V:1=@ #{CONFIG['NULLCMD']})
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
@ -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
|
||||||
|
@@ -3240,6 +3240,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
|
||||||
|
@@ -3886,7 +3886,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
|
||||||
|
@@ -114,7 +114,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
|
||||||
|
|
@ -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
|
||||||
|
@@ -3950,6 +3950,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
|
||||||
|
|
@ -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
|
||||||
|
@@ -3922,6 +3922,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=''
|
||||||
|
@@ -3946,6 +3950,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
|
||||||
|
@@ -349,6 +349,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'
|
||||||
|
@@ -581,7 +582,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
|
||||||
|
|
@ -0,0 +1,288 @@
|
|||||||
|
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
|
||||||
|
@@ -3837,9 +3837,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],
|
||||||
|
@@ -3862,56 +3859,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)
|
||||||
|
@@ -3928,6 +3931,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
|
||||||
|
@@ -9,6 +9,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@
|
||||||
|
RUBY_BASE_NAME=@RUBY_BASE_NAME@
|
||||||
|
--
|
||||||
|
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
|
||||||
|
@@ -439,7 +439,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 | 9 +++++----
|
||||||
|
test/rubygems/test_gem.rb | 5 +++--
|
||||||
|
2 files changed, 8 insertions(+), 6 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
|
||||||
|
@@ -38,13 +38,13 @@ def self.default_dir
|
||||||
|
[
|
||||||
|
File.dirname(RbConfig::CONFIG['sitedir']),
|
||||||
|
'Gems',
|
||||||
|
- RbConfig::CONFIG['ruby_version'],
|
||||||
|
+ RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
|
||||||
|
]
|
||||||
|
else
|
||||||
|
[
|
||||||
|
RbConfig::CONFIG['rubylibprefix'],
|
||||||
|
'gems',
|
||||||
|
- RbConfig::CONFIG['ruby_version'],
|
||||||
|
+ RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
@@ -117,7 +117,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
|
||||||
|
|
||||||
|
@@ -252,7 +253,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
|
||||||
|
@@ -1440,7 +1440,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)
|
||||||
|
|
||||||
|
@@ -1516,7 +1517,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
|
||||||
|
@@ -107,7 +107,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
|
||||||
|
|
@ -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
|
||||||
|
@@ -81,7 +81,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
|
||||||
|
@@ -1489,10 +1489,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
|
||||||
|
@@ -21,7 +21,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
|
||||||
|
@@ -446,7 +446,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
|
||||||
|
|
@ -0,0 +1,93 @@
|
|||||||
|
From 96684439e96aa92e10376b5be45f006772028295 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||||
|
Date: Thu, 21 Oct 2021 13:02:38 +0200
|
||||||
|
Subject: [PATCH] Properly exclude test cases.
|
||||||
|
|
||||||
|
Lets consider the following scenario:
|
||||||
|
|
||||||
|
~~~
|
||||||
|
irb(#<Test::Unit::AutoRunner::Runner:0x0000560f68afc3c8>):001:0> p suite
|
||||||
|
OpenSSL::TestEC
|
||||||
|
=> OpenSSL::TestEC
|
||||||
|
|
||||||
|
irb(#<Test::Unit::AutoRunner::Runner:0x0000560f68afc3c8>):002:0> p all_test_methods
|
||||||
|
["test_ECPrivateKey", "test_ECPrivateKey_encrypted", "test_PUBKEY", "test_check_key", "test_derive_key", "test_dh_compute_key", "test_dsa_sign_asn1_FIPS186_3", "test_ec_group", "test_ec_key", "test_ec_point", "test_ec_point_add", "test_ec_point_mul", "test_generate", "test_marshal", "test_sign_verify", "test_sign_verify_raw"]
|
||||||
|
=>
|
||||||
|
["test_ECPrivateKey",
|
||||||
|
"test_ECPrivateKey_encrypted",
|
||||||
|
"test_PUBKEY",
|
||||||
|
"test_check_key",
|
||||||
|
"test_derive_key",
|
||||||
|
"test_dh_compute_key",
|
||||||
|
"test_dsa_sign_asn1_FIPS186_3",
|
||||||
|
"test_ec_group",
|
||||||
|
"test_ec_key",
|
||||||
|
"test_ec_point",
|
||||||
|
"test_ec_point_add",
|
||||||
|
"test_ec_point_mul",
|
||||||
|
"test_generate",
|
||||||
|
"test_marshal",
|
||||||
|
"test_sign_verify",
|
||||||
|
"test_sign_verify_raw"]
|
||||||
|
|
||||||
|
irb(#<Test::Unit::AutoRunner::Runner:0x0000560f68afc3c8>):003:0> p filter
|
||||||
|
/\A(?=.*)(?!.*(?-mix:(?-mix:memory_leak)|(?-mix:OpenSSL::TestEC.test_check_key)))/
|
||||||
|
=> /\A(?=.*)(?!.*(?-mix:(?-mix:memory_leak)|(?-mix:OpenSSL::TestEC.test_check_key)))/
|
||||||
|
|
||||||
|
irb(#<Test::Unit::AutoRunner::Runner:0x0000560f68afc3c8>):004:0> method = "test_check_key"
|
||||||
|
=> "test_check_key"
|
||||||
|
~~~
|
||||||
|
|
||||||
|
The intention here is to exclude the `test_check_key` test case.
|
||||||
|
Unfortunately this does not work as expected, because the negative filter
|
||||||
|
is never checked:
|
||||||
|
|
||||||
|
~~~
|
||||||
|
|
||||||
|
irb(#<Test::Unit::AutoRunner::Runner:0x0000560f68afc3c8>):005:0> filter === method
|
||||||
|
=> true
|
||||||
|
|
||||||
|
irb(#<Test::Unit::AutoRunner::Runner:0x0000560f68afc3c8>):006:0> filter === "#{suite}##{method}"
|
||||||
|
=> false
|
||||||
|
|
||||||
|
irb(#<Test::Unit::AutoRunner::Runner:0x0000560f68afc3c8>):007:0> filter === method || filter === "#{suite}##{method}"
|
||||||
|
=> true
|
||||||
|
~~~
|
||||||
|
|
||||||
|
Therefore always filter against the fully qualified method name
|
||||||
|
`#{suite}##{method}`, which should provide the expected result.
|
||||||
|
|
||||||
|
However, if plain string filter is used, keep checking also only the
|
||||||
|
method name.
|
||||||
|
|
||||||
|
This resolves [Bug #16936].
|
||||||
|
---
|
||||||
|
tool/lib/minitest/unit.rb | 12 +++++++++---
|
||||||
|
1 file changed, 9 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/tool/lib/minitest/unit.rb b/tool/lib/minitest/unit.rb
|
||||||
|
index c58a609bfa..d5af6cb906 100644
|
||||||
|
--- a/tool/lib/minitest/unit.rb
|
||||||
|
+++ b/tool/lib/minitest/unit.rb
|
||||||
|
@@ -956,9 +956,15 @@ def _run_suite suite, type
|
||||||
|
|
||||||
|
all_test_methods = suite.send "#{type}_methods"
|
||||||
|
|
||||||
|
- filtered_test_methods = all_test_methods.find_all { |m|
|
||||||
|
- filter === m || filter === "#{suite}##{m}"
|
||||||
|
- }
|
||||||
|
+ filtered_test_methods = if Regexp === filter
|
||||||
|
+ all_test_methods.find_all { |m|
|
||||||
|
+ filter === "#{suite}##{m}"
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ all_test_methods.find_all {|m|
|
||||||
|
+ filter === m || filter === "#{suite}##{m}"
|
||||||
|
+ }
|
||||||
|
+ end
|
||||||
|
|
||||||
|
leakchecker = LeakChecker.new
|
||||||
|
|
||||||
|
--
|
||||||
|
2.32.0
|
||||||
|
|
@ -0,0 +1,229 @@
|
|||||||
|
From 3b91792d3d644d6d6b0059cb315c9fe5d3626bab Mon Sep 17 00:00:00 2001
|
||||||
|
From: Yusuke Endoh <mame@ruby-lang.org>
|
||||||
|
Date: Sat, 6 Mar 2021 00:03:57 +0900
|
||||||
|
Subject: [PATCH] Support GCC's DWARF 5 [Bug #17585]
|
||||||
|
|
||||||
|
Co-Authored-By: xtkoba (Tee KOBAYASHI) <xtkoba+ruby@gmail.com>
|
||||||
|
---
|
||||||
|
addr2line.c | 119 ++++++++++++++++++++++++++++++++++++++++++----------
|
||||||
|
1 file changed, 97 insertions(+), 22 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/addr2line.c b/addr2line.c
|
||||||
|
index 0029cffbca..855efb40d4 100644
|
||||||
|
--- a/addr2line.c
|
||||||
|
+++ b/addr2line.c
|
||||||
|
@@ -159,11 +159,12 @@ typedef struct obj_info {
|
||||||
|
struct dwarf_section debug_info;
|
||||||
|
struct dwarf_section debug_line;
|
||||||
|
struct dwarf_section debug_ranges;
|
||||||
|
+ struct dwarf_section debug_rnglists;
|
||||||
|
struct dwarf_section debug_str;
|
||||||
|
struct obj_info *next;
|
||||||
|
} obj_info_t;
|
||||||
|
|
||||||
|
-#define DWARF_SECTION_COUNT 5
|
||||||
|
+#define DWARF_SECTION_COUNT 6
|
||||||
|
|
||||||
|
static struct dwarf_section *
|
||||||
|
obj_dwarf_section_at(obj_info_t *obj, int n)
|
||||||
|
@@ -173,6 +174,7 @@ obj_dwarf_section_at(obj_info_t *obj, int n)
|
||||||
|
&obj->debug_info,
|
||||||
|
&obj->debug_line,
|
||||||
|
&obj->debug_ranges,
|
||||||
|
+ &obj->debug_rnglists,
|
||||||
|
&obj->debug_str
|
||||||
|
};
|
||||||
|
if (n < 0 || DWARF_SECTION_COUNT <= n) {
|
||||||
|
@@ -411,7 +413,7 @@ parse_debug_line_cu(int num_traces, void **traces, char **debug_line,
|
||||||
|
FILL_LINE();
|
||||||
|
break;
|
||||||
|
case DW_LNS_advance_pc:
|
||||||
|
- a = uleb128((char **)&p);
|
||||||
|
+ a = uleb128((char **)&p) * header.minimum_instruction_length;
|
||||||
|
addr += a;
|
||||||
|
break;
|
||||||
|
case DW_LNS_advance_line: {
|
||||||
|
@@ -451,7 +453,7 @@ parse_debug_line_cu(int num_traces, void **traces, char **debug_line,
|
||||||
|
/* isa = (unsigned int)*/(void)uleb128((char **)&p);
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
- a = *(unsigned char *)p++;
|
||||||
|
+ a = uleb128((char **)&p);
|
||||||
|
op = *p++;
|
||||||
|
switch (op) {
|
||||||
|
case DW_LNE_end_sequence:
|
||||||
|
@@ -808,6 +810,18 @@ enum
|
||||||
|
DW_FORM_addrx4 = 0x2c
|
||||||
|
};
|
||||||
|
|
||||||
|
+/* Range list entry encodings */
|
||||||
|
+enum {
|
||||||
|
+ DW_RLE_end_of_list = 0x00,
|
||||||
|
+ DW_RLE_base_addressx = 0x01,
|
||||||
|
+ DW_RLE_startx_endx = 0x02,
|
||||||
|
+ DW_RLE_startx_length = 0x03,
|
||||||
|
+ DW_RLE_offset_pair = 0x04,
|
||||||
|
+ DW_RLE_base_address = 0x05,
|
||||||
|
+ DW_RLE_start_end = 0x06,
|
||||||
|
+ DW_RLE_start_length = 0x07
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
enum {
|
||||||
|
VAL_none = 0,
|
||||||
|
VAL_cstr = 1,
|
||||||
|
@@ -961,6 +975,23 @@ debug_info_reader_init(DebugInfoReader *reader, obj_info_t *obj)
|
||||||
|
reader->current_low_pc = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+di_skip_die_attributes(char **p)
|
||||||
|
+{
|
||||||
|
+ for (;;) {
|
||||||
|
+ uint64_t at = uleb128(p);
|
||||||
|
+ uint64_t form = uleb128(p);
|
||||||
|
+ if (!at && !form) break;
|
||||||
|
+ switch (form) {
|
||||||
|
+ default:
|
||||||
|
+ break;
|
||||||
|
+ case DW_FORM_implicit_const:
|
||||||
|
+ sleb128(p);
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
di_read_debug_abbrev_cu(DebugInfoReader *reader)
|
||||||
|
{
|
||||||
|
@@ -975,12 +1006,7 @@ di_read_debug_abbrev_cu(DebugInfoReader *reader)
|
||||||
|
prev = abbrev_number;
|
||||||
|
uleb128(&p); /* tag */
|
||||||
|
p++; /* has_children */
|
||||||
|
- /* skip content */
|
||||||
|
- for (;;) {
|
||||||
|
- uint64_t at = uleb128(&p);
|
||||||
|
- uint64_t form = uleb128(&p);
|
||||||
|
- if (!at && !form) break;
|
||||||
|
- }
|
||||||
|
+ di_skip_die_attributes(&p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1244,12 +1270,7 @@ di_find_abbrev(DebugInfoReader *reader, uint64_t abbrev_number)
|
||||||
|
/* skip 255th record */
|
||||||
|
uleb128(&p); /* tag */
|
||||||
|
p++; /* has_children */
|
||||||
|
- /* skip content */
|
||||||
|
- for (;;) {
|
||||||
|
- uint64_t at = uleb128(&p);
|
||||||
|
- uint64_t form = uleb128(&p);
|
||||||
|
- if (!at && !form) break;
|
||||||
|
- }
|
||||||
|
+ di_skip_die_attributes(&p);
|
||||||
|
for (uint64_t n = uleb128(&p); abbrev_number != n; n = uleb128(&p)) {
|
||||||
|
if (n == 0) {
|
||||||
|
fprintf(stderr,"%d: Abbrev Number %"PRId64" not found\n",__LINE__, abbrev_number);
|
||||||
|
@@ -1257,12 +1278,7 @@ di_find_abbrev(DebugInfoReader *reader, uint64_t abbrev_number)
|
||||||
|
}
|
||||||
|
uleb128(&p); /* tag */
|
||||||
|
p++; /* has_children */
|
||||||
|
- /* skip content */
|
||||||
|
- for (;;) {
|
||||||
|
- uint64_t at = uleb128(&p);
|
||||||
|
- uint64_t form = uleb128(&p);
|
||||||
|
- if (!at && !form) break;
|
||||||
|
- }
|
||||||
|
+ di_skip_die_attributes(&p);
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
@@ -1390,6 +1406,21 @@ ranges_set(ranges_t *ptr, DebugInfoValue *v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+static uint64_t
|
||||||
|
+read_dw_form_addr(DebugInfoReader *reader, char **ptr)
|
||||||
|
+{
|
||||||
|
+ char *p = *ptr;
|
||||||
|
+ *ptr = p + reader->format;
|
||||||
|
+ if (reader->format == 4) {
|
||||||
|
+ return read_uint32(&p);
|
||||||
|
+ } else if (reader->format == 8) {
|
||||||
|
+ return read_uint64(&p);
|
||||||
|
+ } else {
|
||||||
|
+ fprintf(stderr,"unknown address_size:%d", reader->address_size);
|
||||||
|
+ abort();
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static uintptr_t
|
||||||
|
ranges_include(DebugInfoReader *reader, ranges_t *ptr, uint64_t addr)
|
||||||
|
{
|
||||||
|
@@ -1403,8 +1434,50 @@ ranges_include(DebugInfoReader *reader, ranges_t *ptr, uint64_t addr)
|
||||||
|
}
|
||||||
|
else if (ptr->ranges_set) {
|
||||||
|
/* TODO: support base address selection entry */
|
||||||
|
- char *p = reader->obj->debug_ranges.ptr + ptr->ranges;
|
||||||
|
+ char *p;
|
||||||
|
uint64_t base = ptr->low_pc_set ? ptr->low_pc : reader->current_low_pc;
|
||||||
|
+ if (reader->obj->debug_rnglists.ptr) {
|
||||||
|
+ p = reader->obj->debug_rnglists.ptr + ptr->ranges;
|
||||||
|
+ for (;;) {
|
||||||
|
+ uint8_t rle = read_uint8(&p);
|
||||||
|
+ uintptr_t base_address = 0;
|
||||||
|
+ uintptr_t from, to;
|
||||||
|
+ if (rle == DW_RLE_end_of_list) break;
|
||||||
|
+ switch (rle) {
|
||||||
|
+ case DW_RLE_base_addressx:
|
||||||
|
+ uleb128(&p);
|
||||||
|
+ break;
|
||||||
|
+ case DW_RLE_startx_endx:
|
||||||
|
+ uleb128(&p);
|
||||||
|
+ uleb128(&p);
|
||||||
|
+ break;
|
||||||
|
+ case DW_RLE_startx_length:
|
||||||
|
+ uleb128(&p);
|
||||||
|
+ uleb128(&p);
|
||||||
|
+ break;
|
||||||
|
+ case DW_RLE_offset_pair:
|
||||||
|
+ from = base_address + uleb128(&p);
|
||||||
|
+ to = base_address + uleb128(&p);
|
||||||
|
+ if (base + from <= addr && addr < base + to) {
|
||||||
|
+ return from;
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
+ case DW_RLE_base_address:
|
||||||
|
+ base_address = read_dw_form_addr(reader, &p);
|
||||||
|
+ break;
|
||||||
|
+ case DW_RLE_start_end:
|
||||||
|
+ read_dw_form_addr(reader, &p);
|
||||||
|
+ read_dw_form_addr(reader, &p);
|
||||||
|
+ break;
|
||||||
|
+ case DW_RLE_start_length:
|
||||||
|
+ read_dw_form_addr(reader, &p);
|
||||||
|
+ uleb128(&p);
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+ p = reader->obj->debug_ranges.ptr + ptr->ranges;
|
||||||
|
for (;;) {
|
||||||
|
uintptr_t from = read_uintptr(&p);
|
||||||
|
uintptr_t to = read_uintptr(&p);
|
||||||
|
@@ -1750,6 +1823,7 @@ fill_lines(int num_traces, void **traces, int check_debuglink,
|
||||||
|
".debug_info",
|
||||||
|
".debug_line",
|
||||||
|
".debug_ranges",
|
||||||
|
+ ".debug_rnglists",
|
||||||
|
".debug_str"
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -2006,6 +2080,7 @@ found_mach_header:
|
||||||
|
"__debug_info",
|
||||||
|
"__debug_line",
|
||||||
|
"__debug_ranges",
|
||||||
|
+ "__debug_rnglists",
|
||||||
|
"__debug_str"
|
||||||
|
};
|
||||||
|
struct LP(segment_command) *scmd = (struct LP(segment_command) *)lcmd;
|
@ -0,0 +1,359 @@
|
|||||||
|
From bcab8c3cd877506de75f50e0f9ed98827ed554b0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Peter Zhu <peter@peterzhu.ca>
|
||||||
|
Date: Tue, 23 Feb 2021 16:28:56 -0500
|
||||||
|
Subject: [PATCH] Use mmap for allocating heap pages
|
||||||
|
|
||||||
|
---
|
||||||
|
configure.ac | 16 ++++
|
||||||
|
gc.c | 149 ++++++++++++++++++++++++++---------
|
||||||
|
test/ruby/test_gc_compact.rb | 41 ++++++----
|
||||||
|
3 files changed, 155 insertions(+), 51 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/configure.ac b/configure.ac
|
||||||
|
index 2dcebdde9f..b1b190004d 100644
|
||||||
|
--- a/configure.ac
|
||||||
|
+++ b/configure.ac
|
||||||
|
@@ -1944,6 +1944,7 @@ AC_CHECK_FUNCS(memmem)
|
||||||
|
AC_CHECK_FUNCS(mkfifo)
|
||||||
|
AC_CHECK_FUNCS(mknod)
|
||||||
|
AC_CHECK_FUNCS(mktime)
|
||||||
|
+AC_CHECK_FUNCS(mmap)
|
||||||
|
AC_CHECK_FUNCS(openat)
|
||||||
|
AC_CHECK_FUNCS(pipe2)
|
||||||
|
AC_CHECK_FUNCS(poll)
|
||||||
|
@@ -2666,6 +2667,21 @@ main(int argc, char *argv[])
|
||||||
|
rb_cv_fork_with_pthread=yes)])
|
||||||
|
test x$rb_cv_fork_with_pthread = xyes || AC_DEFINE(CANNOT_FORK_WITH_PTHREAD)
|
||||||
|
])
|
||||||
|
+
|
||||||
|
+AC_CHECK_HEADERS([sys/user.h])
|
||||||
|
+AS_IF([test "x$ac_cv_func_mmap" = xyes], [
|
||||||
|
+ AC_CACHE_CHECK([whether PAGE_SIZE is compile-time const], rb_cv_const_page_size,
|
||||||
|
+ [malloc_headers=`sed -n '/MALLOC_HEADERS_BEGIN/,/MALLOC_HEADERS_END/p' ${srcdir}/gc.c`
|
||||||
|
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[$malloc_headers
|
||||||
|
+ typedef char conftest_page[PAGE_SIZE];
|
||||||
|
+ ]], [[]])],
|
||||||
|
+ [rb_cv_const_page_size=yes],
|
||||||
|
+ [rb_cv_const_page_size=no])])
|
||||||
|
+])
|
||||||
|
+AS_IF([test "x$rb_cv_const_page_size" = xyes],
|
||||||
|
+ [AC_DEFINE(HAVE_CONST_PAGE_SIZE, 1)],
|
||||||
|
+ [AC_DEFINE(HAVE_CONST_PAGE_SIZE, 0)]
|
||||||
|
+)
|
||||||
|
}
|
||||||
|
|
||||||
|
: "runtime section" && {
|
||||||
|
diff --git a/gc.c b/gc.c
|
||||||
|
index f6acf3e117..6f8e5f242d 100644
|
||||||
|
--- a/gc.c
|
||||||
|
+++ b/gc.c
|
||||||
|
@@ -32,6 +32,7 @@
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
+/* MALLOC_HEADERS_BEGIN */
|
||||||
|
#ifndef HAVE_MALLOC_USABLE_SIZE
|
||||||
|
# ifdef _WIN32
|
||||||
|
# define HAVE_MALLOC_USABLE_SIZE
|
||||||
|
@@ -54,6 +55,12 @@
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#if !defined(PAGE_SIZE) && defined(HAVE_SYS_USER_H)
|
||||||
|
+/* LIST_HEAD conflicts with sys/queue.h on macOS */
|
||||||
|
+# include <sys/user.h>
|
||||||
|
+#endif
|
||||||
|
+/* MALLOC_HEADERS_END */
|
||||||
|
+
|
||||||
|
#ifdef HAVE_SYS_TIME_H
|
||||||
|
# include <sys/time.h>
|
||||||
|
#endif
|
||||||
|
@@ -821,6 +828,25 @@ enum {
|
||||||
|
HEAP_PAGE_BITMAP_SIZE = (BITS_SIZE * HEAP_PAGE_BITMAP_LIMIT),
|
||||||
|
HEAP_PAGE_BITMAP_PLANES = 4 /* RGENGC: mark, unprotected, uncollectible, marking */
|
||||||
|
};
|
||||||
|
+#define HEAP_PAGE_ALIGN (1 << HEAP_PAGE_ALIGN_LOG)
|
||||||
|
+#define HEAP_PAGE_SIZE HEAP_PAGE_ALIGN
|
||||||
|
+
|
||||||
|
+#ifdef HAVE_MMAP
|
||||||
|
+# if HAVE_CONST_PAGE_SIZE
|
||||||
|
+/* If we have the HEAP_PAGE and it is a constant, then we can directly use it. */
|
||||||
|
+static const bool USE_MMAP_ALIGNED_ALLOC = (PAGE_SIZE <= HEAP_PAGE_SIZE);
|
||||||
|
+# elif defined(PAGE_MAX_SIZE) && (PAGE_MAX_SIZE <= HEAP_PAGE_SIZE)
|
||||||
|
+/* PAGE_SIZE <= HEAP_PAGE_SIZE */
|
||||||
|
+static const bool USE_MMAP_ALIGNED_ALLOC = true;
|
||||||
|
+# else
|
||||||
|
+/* Otherwise, fall back to determining if we can use mmap during runtime. */
|
||||||
|
+# define USE_MMAP_ALIGNED_ALLOC (use_mmap_aligned_alloc != false)
|
||||||
|
+
|
||||||
|
+static bool use_mmap_aligned_alloc;
|
||||||
|
+# endif
|
||||||
|
+#elif !defined(__MINGW32__) && !defined(_WIN32)
|
||||||
|
+static const bool USE_MMAP_ALIGNED_ALLOC = false;
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
struct heap_page {
|
||||||
|
short total_slots;
|
||||||
|
@@ -1760,14 +1786,14 @@ heap_unlink_page(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *pag
|
||||||
|
heap->total_slots -= page->total_slots;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void rb_aligned_free(void *ptr);
|
||||||
|
+static void rb_aligned_free(void *ptr, size_t size);
|
||||||
|
|
||||||
|
static void
|
||||||
|
heap_page_free(rb_objspace_t *objspace, struct heap_page *page)
|
||||||
|
{
|
||||||
|
heap_allocated_pages--;
|
||||||
|
objspace->profile.total_freed_pages++;
|
||||||
|
- rb_aligned_free(GET_PAGE_BODY(page->start));
|
||||||
|
+ rb_aligned_free(GET_PAGE_BODY(page->start), HEAP_PAGE_SIZE);
|
||||||
|
free(page);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1819,7 +1845,7 @@ heap_page_allocate(rb_objspace_t *objspace)
|
||||||
|
/* assign heap_page entry */
|
||||||
|
page = calloc1(sizeof(struct heap_page));
|
||||||
|
if (page == 0) {
|
||||||
|
- rb_aligned_free(page_body);
|
||||||
|
+ rb_aligned_free(page_body, HEAP_PAGE_SIZE);
|
||||||
|
rb_memerror();
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -3159,15 +3185,18 @@ Init_heap(void)
|
||||||
|
{
|
||||||
|
rb_objspace_t *objspace = &rb_objspace;
|
||||||
|
|
||||||
|
-#if defined(HAVE_SYSCONF) && defined(_SC_PAGE_SIZE)
|
||||||
|
- /* If Ruby's heap pages are not a multiple of the system page size, we
|
||||||
|
- * cannot use mprotect for the read barrier, so we must disable automatic
|
||||||
|
- * compaction. */
|
||||||
|
- int pagesize;
|
||||||
|
- pagesize = (int)sysconf(_SC_PAGE_SIZE);
|
||||||
|
- if ((HEAP_PAGE_SIZE % pagesize) != 0) {
|
||||||
|
- ruby_enable_autocompact = 0;
|
||||||
|
- }
|
||||||
|
+#if defined(HAVE_MMAP) && !HAVE_CONST_PAGE_SIZE && !defined(PAGE_MAX_SIZE)
|
||||||
|
+ /* Need to determine if we can use mmap at runtime. */
|
||||||
|
+# ifdef PAGE_SIZE
|
||||||
|
+ /* If the PAGE_SIZE macro can be used. */
|
||||||
|
+ use_mmap_aligned_alloc = PAGE_SIZE <= HEAP_PAGE_SIZE;
|
||||||
|
+# elif defined(HAVE_SYSCONF) && defined(_SC_PAGE_SIZE)
|
||||||
|
+ /* If we can use sysconf to determine the page size. */
|
||||||
|
+ use_mmap_aligned_alloc = sysconf(_SC_PAGE_SIZE) <= HEAP_PAGE_SIZE;
|
||||||
|
+# else
|
||||||
|
+ /* Otherwise we can't determine the system page size, so don't use mmap. */
|
||||||
|
+ use_mmap_aligned_alloc = FALSE;
|
||||||
|
+# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
objspace->next_object_id = INT2FIX(OBJ_ID_INITIAL);
|
||||||
|
@@ -8533,6 +8562,14 @@ 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
|
||||||
|
+
|
||||||
|
reason |= GPR_FLAG_COMPACT;
|
||||||
|
} else {
|
||||||
|
if (!RTEST(full_mark)) reason &= ~GPR_FLAG_FULL_MARK;
|
||||||
|
@@ -9944,16 +9981,14 @@ gc_disable(rb_execution_context_t *ec, VALUE _)
|
||||||
|
static VALUE
|
||||||
|
gc_set_auto_compact(rb_execution_context_t *ec, VALUE _, VALUE v)
|
||||||
|
{
|
||||||
|
-#if defined(HAVE_SYSCONF) && defined(_SC_PAGE_SIZE)
|
||||||
|
- /* If Ruby's heap pages are not a multiple of the system page size, we
|
||||||
|
- * cannot use mprotect for the read barrier, so we must disable automatic
|
||||||
|
- * compaction. */
|
||||||
|
- int pagesize;
|
||||||
|
- pagesize = (int)sysconf(_SC_PAGE_SIZE);
|
||||||
|
- if ((HEAP_PAGE_SIZE % pagesize) != 0) {
|
||||||
|
+ /* 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;
|
||||||
|
}
|
||||||
|
@@ -10350,22 +10385,54 @@ rb_aligned_malloc(size_t alignment, size_t size)
|
||||||
|
#elif defined _WIN32
|
||||||
|
void *_aligned_malloc(size_t, size_t);
|
||||||
|
res = _aligned_malloc(size, alignment);
|
||||||
|
-#elif defined(HAVE_POSIX_MEMALIGN)
|
||||||
|
- if (posix_memalign(&res, alignment, size) == 0) {
|
||||||
|
- return res;
|
||||||
|
+#else
|
||||||
|
+ if (USE_MMAP_ALIGNED_ALLOC) {
|
||||||
|
+ GC_ASSERT(alignment % sysconf(_SC_PAGE_SIZE) == 0);
|
||||||
|
+
|
||||||
|
+ char *ptr = mmap(NULL, alignment + size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||||
|
+ if (ptr == MAP_FAILED) {
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ char *aligned = ptr + alignment;
|
||||||
|
+ aligned -= ((VALUE)aligned & (alignment - 1));
|
||||||
|
+ GC_ASSERT(aligned > ptr);
|
||||||
|
+ GC_ASSERT(aligned <= ptr + alignment);
|
||||||
|
+
|
||||||
|
+ size_t start_out_of_range_size = aligned - ptr;
|
||||||
|
+ GC_ASSERT(start_out_of_range_size % sysconf(_SC_PAGE_SIZE) == 0);
|
||||||
|
+ if (start_out_of_range_size > 0) {
|
||||||
|
+ if (munmap(ptr, start_out_of_range_size)) {
|
||||||
|
+ rb_bug("rb_aligned_malloc: munmap failed for start");
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ size_t end_out_of_range_size = alignment - start_out_of_range_size;
|
||||||
|
+ GC_ASSERT(end_out_of_range_size % sysconf(_SC_PAGE_SIZE) == 0);
|
||||||
|
+ if (end_out_of_range_size > 0) {
|
||||||
|
+ if (munmap(aligned + size, end_out_of_range_size)) {
|
||||||
|
+ rb_bug("rb_aligned_malloc: munmap failed for end");
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ res = (void *)aligned;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
- return NULL;
|
||||||
|
+# if defined(HAVE_POSIX_MEMALIGN)
|
||||||
|
+ if (posix_memalign(&res, alignment, size) != 0) {
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+# elif defined(HAVE_MEMALIGN)
|
||||||
|
+ res = memalign(alignment, size);
|
||||||
|
+# else
|
||||||
|
+ char* aligned;
|
||||||
|
+ res = malloc(alignment + size + sizeof(void*));
|
||||||
|
+ aligned = (char*)res + alignment + sizeof(void*);
|
||||||
|
+ aligned -= ((VALUE)aligned & (alignment - 1));
|
||||||
|
+ ((void**)aligned)[-1] = res;
|
||||||
|
+ res = (void*)aligned;
|
||||||
|
+# endif
|
||||||
|
}
|
||||||
|
-#elif defined(HAVE_MEMALIGN)
|
||||||
|
- res = memalign(alignment, size);
|
||||||
|
-#else
|
||||||
|
- char* aligned;
|
||||||
|
- res = malloc(alignment + size + sizeof(void*));
|
||||||
|
- aligned = (char*)res + alignment + sizeof(void*);
|
||||||
|
- aligned -= ((VALUE)aligned & (alignment - 1));
|
||||||
|
- ((void**)aligned)[-1] = res;
|
||||||
|
- res = (void*)aligned;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* alignment must be a power of 2 */
|
||||||
|
@@ -10375,16 +10442,26 @@ rb_aligned_malloc(size_t alignment, size_t size)
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
-rb_aligned_free(void *ptr)
|
||||||
|
+rb_aligned_free(void *ptr, size_t size)
|
||||||
|
{
|
||||||
|
#if defined __MINGW32__
|
||||||
|
__mingw_aligned_free(ptr);
|
||||||
|
#elif defined _WIN32
|
||||||
|
_aligned_free(ptr);
|
||||||
|
-#elif defined(HAVE_MEMALIGN) || defined(HAVE_POSIX_MEMALIGN)
|
||||||
|
- free(ptr);
|
||||||
|
#else
|
||||||
|
- free(((void**)ptr)[-1]);
|
||||||
|
+ if (USE_MMAP_ALIGNED_ALLOC) {
|
||||||
|
+ GC_ASSERT(size % sysconf(_SC_PAGE_SIZE) == 0);
|
||||||
|
+ if (munmap(ptr, size)) {
|
||||||
|
+ rb_bug("rb_aligned_free: munmap failed");
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ else {
|
||||||
|
+# if defined(HAVE_POSIX_MEMALIGN) || defined(HAVE_MEMALIGN)
|
||||||
|
+ free(ptr);
|
||||||
|
+# else
|
||||||
|
+ free(((void**)ptr)[-1]);
|
||||||
|
+# endif
|
||||||
|
+ }
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/test/ruby/test_gc_compact.rb b/test/ruby/test_gc_compact.rb
|
||||||
|
index 4a8cff33f4..f5cab55ba7 100644
|
||||||
|
--- a/test/ruby/test_gc_compact.rb
|
||||||
|
+++ b/test/ruby/test_gc_compact.rb
|
||||||
|
@@ -4,12 +4,32 @@
|
||||||
|
require 'etc'
|
||||||
|
|
||||||
|
class TestGCCompact < Test::Unit::TestCase
|
||||||
|
- class AutoCompact < Test::Unit::TestCase
|
||||||
|
+ module SupportsCompact
|
||||||
|
def setup
|
||||||
|
skip "autocompact not supported on this platform" unless supports_auto_compact?
|
||||||
|
super
|
||||||
|
end
|
||||||
|
|
||||||
|
+ private
|
||||||
|
+
|
||||||
|
+ def supports_auto_compact?
|
||||||
|
+ return true unless defined?(Etc::SC_PAGE_SIZE)
|
||||||
|
+
|
||||||
|
+ begin
|
||||||
|
+ return GC::INTERNAL_CONSTANTS[:HEAP_PAGE_SIZE] % Etc.sysconf(Etc::SC_PAGE_SIZE) == 0
|
||||||
|
+ rescue NotImplementedError
|
||||||
|
+ rescue ArgumentError
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
+ true
|
||||||
|
+ end
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
+ include SupportsCompact
|
||||||
|
+
|
||||||
|
+ class AutoCompact < Test::Unit::TestCase
|
||||||
|
+ include SupportsCompact
|
||||||
|
+
|
||||||
|
def test_enable_autocompact
|
||||||
|
before = GC.auto_compact
|
||||||
|
GC.auto_compact = true
|
||||||
|
@@ -59,26 +79,17 @@ def test_implicit_compaction_does_something
|
||||||
|
ensure
|
||||||
|
GC.auto_compact = before
|
||||||
|
end
|
||||||
|
-
|
||||||
|
- private
|
||||||
|
-
|
||||||
|
- def supports_auto_compact?
|
||||||
|
- return true unless defined?(Etc::SC_PAGE_SIZE)
|
||||||
|
-
|
||||||
|
- begin
|
||||||
|
- return GC::INTERNAL_CONSTANTS[:HEAP_PAGE_SIZE] % Etc.sysconf(Etc::SC_PAGE_SIZE) == 0
|
||||||
|
- rescue NotImplementedError
|
||||||
|
- rescue ArgumentError
|
||||||
|
- end
|
||||||
|
-
|
||||||
|
- true
|
||||||
|
- end
|
||||||
|
end
|
||||||
|
|
||||||
|
def os_page_size
|
||||||
|
return true unless defined?(Etc::SC_PAGE_SIZE)
|
||||||
|
end
|
||||||
|
|
||||||
|
+ def setup
|
||||||
|
+ skip "autocompact not supported on this platform" unless supports_auto_compact?
|
||||||
|
+ super
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
def test_gc_compact_stats
|
||||||
|
list = []
|
||||||
|
|
||||||
|
--
|
||||||
|
2.30.1 (Apple Git-130)
|
||||||
|
|
@ -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);
|
||||||
|
}
|
@ -0,0 +1,261 @@
|
|||||||
|
From e80e7a3d0b3d72f7af7286b935702b3fab117008 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||||
|
Date: Wed, 8 Dec 2021 21:12:24 +0100
|
||||||
|
Subject: [PATCH 1/5] More explicit require
|
||||||
|
|
||||||
|
This class does not use `rubygems/deprecate`. It uses
|
||||||
|
`rubygems/version`, which in turn uses `rubygems/deprecate`. Make this
|
||||||
|
explicit.
|
||||||
|
---
|
||||||
|
lib/rubygems/requirement.rb | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/lib/rubygems/requirement.rb b/lib/rubygems/requirement.rb
|
||||||
|
index d2e28fab5b4..9edd6aa7d3c 100644
|
||||||
|
--- a/lib/rubygems/requirement.rb
|
||||||
|
+++ b/lib/rubygems/requirement.rb
|
||||||
|
@@ -1,5 +1,5 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
-require_relative "deprecate"
|
||||||
|
+require_relative "version"
|
||||||
|
|
||||||
|
##
|
||||||
|
# A Requirement is a set of one or more version restrictions. It supports a
|
||||||
|
|
||||||
|
From 4e46dcc17ee5cabbde43b8a34063b8ab042536f9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||||
|
Date: Wed, 8 Dec 2021 21:17:30 +0100
|
||||||
|
Subject: [PATCH 2/5] Remove ineffective autoloads
|
||||||
|
|
||||||
|
These files are loaded on startup unconditionally, so we can require
|
||||||
|
them relatively when needed.
|
||||||
|
---
|
||||||
|
lib/rubygems.rb | 4 +---
|
||||||
|
lib/rubygems/specification.rb | 2 ++
|
||||||
|
2 files changed, 3 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/rubygems.rb b/lib/rubygems.rb
|
||||||
|
index f803e47628e..b8747409304 100644
|
||||||
|
--- a/lib/rubygems.rb
|
||||||
|
+++ b/lib/rubygems.rb
|
||||||
|
@@ -1310,19 +1310,17 @@ def default_gem_load_paths
|
||||||
|
autoload :Licenses, File.expand_path('rubygems/util/licenses', __dir__)
|
||||||
|
autoload :NameTuple, File.expand_path('rubygems/name_tuple', __dir__)
|
||||||
|
autoload :PathSupport, File.expand_path('rubygems/path_support', __dir__)
|
||||||
|
- autoload :Platform, File.expand_path('rubygems/platform', __dir__)
|
||||||
|
autoload :RequestSet, File.expand_path('rubygems/request_set', __dir__)
|
||||||
|
- autoload :Requirement, File.expand_path('rubygems/requirement', __dir__)
|
||||||
|
autoload :Resolver, File.expand_path('rubygems/resolver', __dir__)
|
||||||
|
autoload :Source, File.expand_path('rubygems/source', __dir__)
|
||||||
|
autoload :SourceList, File.expand_path('rubygems/source_list', __dir__)
|
||||||
|
autoload :SpecFetcher, File.expand_path('rubygems/spec_fetcher', __dir__)
|
||||||
|
- autoload :Specification, File.expand_path('rubygems/specification', __dir__)
|
||||||
|
autoload :Util, File.expand_path('rubygems/util', __dir__)
|
||||||
|
autoload :Version, File.expand_path('rubygems/version', __dir__)
|
||||||
|
end
|
||||||
|
|
||||||
|
require_relative 'rubygems/exceptions'
|
||||||
|
+require_relative 'rubygems/specification'
|
||||||
|
|
||||||
|
# REFACTOR: This should be pulled out into some kind of hacks file.
|
||||||
|
begin
|
||||||
|
diff --git a/lib/rubygems/specification.rb b/lib/rubygems/specification.rb
|
||||||
|
index d3b96491a28..dc5e5ba0138 100644
|
||||||
|
--- a/lib/rubygems/specification.rb
|
||||||
|
+++ b/lib/rubygems/specification.rb
|
||||||
|
@@ -9,6 +9,8 @@
|
||||||
|
require_relative 'deprecate'
|
||||||
|
require_relative 'basic_specification'
|
||||||
|
require_relative 'stub_specification'
|
||||||
|
+require_relative 'platform'
|
||||||
|
+require_relative 'requirement'
|
||||||
|
require_relative 'specification_policy'
|
||||||
|
require_relative 'util/list'
|
||||||
|
|
||||||
|
|
||||||
|
From 96b6b3e04e8e4fec17f63079a0caf999a2709d71 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||||
|
Date: Wed, 8 Dec 2021 21:45:16 +0100
|
||||||
|
Subject: [PATCH 3/5] Load `operating_system.rb` customizations before setting
|
||||||
|
up default gems
|
||||||
|
|
||||||
|
It's very common for packagers to configure gem paths in this file, for
|
||||||
|
example, `Gem.default_dir`. Also, setting up default gems requires these
|
||||||
|
paths to be set, so that we know which default gems need to be setup.
|
||||||
|
|
||||||
|
If we setup default gems before loading `operatin_system.rb`
|
||||||
|
customizations, the wrong default gems will be setup.
|
||||||
|
|
||||||
|
Unfortunately, default gems loaded by `operating_system.rb` can't be
|
||||||
|
upgraded if we do this, but it seems much of a smaller issue. I wasn't
|
||||||
|
even fully sure it was the right thing to do when I added that, and it
|
||||||
|
was not the culprit of the end user issue that led to making that
|
||||||
|
change.
|
||||||
|
---
|
||||||
|
lib/rubygems.rb | 32 ++++++++++++++++----------------
|
||||||
|
test/rubygems/test_rubygems.rb | 23 +++++++++++++++++++++++
|
||||||
|
2 files changed, 39 insertions(+), 16 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/rubygems.rb b/lib/rubygems.rb
|
||||||
|
index b8747409304..11474b6554c 100644
|
||||||
|
--- a/lib/rubygems.rb
|
||||||
|
+++ b/lib/rubygems.rb
|
||||||
|
@@ -1323,22 +1323,6 @@ def default_gem_load_paths
|
||||||
|
require_relative 'rubygems/specification'
|
||||||
|
|
||||||
|
# REFACTOR: This should be pulled out into some kind of hacks file.
|
||||||
|
-begin
|
||||||
|
- ##
|
||||||
|
- # Defaults the Ruby implementation wants to provide for RubyGems
|
||||||
|
-
|
||||||
|
- require "rubygems/defaults/#{RUBY_ENGINE}"
|
||||||
|
-rescue LoadError
|
||||||
|
-end
|
||||||
|
-
|
||||||
|
-##
|
||||||
|
-# Loads the default specs.
|
||||||
|
-Gem::Specification.load_defaults
|
||||||
|
-
|
||||||
|
-require_relative 'rubygems/core_ext/kernel_gem'
|
||||||
|
-require_relative 'rubygems/core_ext/kernel_require'
|
||||||
|
-require_relative 'rubygems/core_ext/kernel_warn'
|
||||||
|
-
|
||||||
|
begin
|
||||||
|
##
|
||||||
|
# Defaults the operating system (or packager) wants to provide for RubyGems.
|
||||||
|
@@ -1354,3 +1338,19 @@ def default_gem_load_paths
|
||||||
|
"the problem and ask for help."
|
||||||
|
raise e.class, msg
|
||||||
|
end
|
||||||
|
+
|
||||||
|
+begin
|
||||||
|
+ ##
|
||||||
|
+ # Defaults the Ruby implementation wants to provide for RubyGems
|
||||||
|
+
|
||||||
|
+ require "rubygems/defaults/#{RUBY_ENGINE}"
|
||||||
|
+rescue LoadError
|
||||||
|
+end
|
||||||
|
+
|
||||||
|
+##
|
||||||
|
+# Loads the default specs.
|
||||||
|
+Gem::Specification.load_defaults
|
||||||
|
+
|
||||||
|
+require_relative 'rubygems/core_ext/kernel_gem'
|
||||||
|
+require_relative 'rubygems/core_ext/kernel_require'
|
||||||
|
+require_relative 'rubygems/core_ext/kernel_warn'
|
||||||
|
diff --git a/test/rubygems/test_rubygems.rb b/test/rubygems/test_rubygems.rb
|
||||||
|
index 493b9fdf4a3..fa77a299322 100644
|
||||||
|
--- a/test/rubygems/test_rubygems.rb
|
||||||
|
+++ b/test/rubygems/test_rubygems.rb
|
||||||
|
@@ -22,6 +22,29 @@ def test_operating_system_other_exceptions
|
||||||
|
"the problem and ask for help."
|
||||||
|
end
|
||||||
|
|
||||||
|
+ def test_operating_system_customizing_default_dir
|
||||||
|
+ pend "does not apply to truffleruby" if RUBY_ENGINE == 'truffleruby'
|
||||||
|
+ pend "loads a custom defaults/jruby file that gets in the middle" if RUBY_ENGINE == 'jruby'
|
||||||
|
+
|
||||||
|
+ # On a non existing default dir, there should be no gems
|
||||||
|
+
|
||||||
|
+ path = util_install_operating_system_rb <<-RUBY
|
||||||
|
+ module Gem
|
||||||
|
+ def self.default_dir
|
||||||
|
+ File.expand_path("foo")
|
||||||
|
+ end
|
||||||
|
+ end
|
||||||
|
+ RUBY
|
||||||
|
+
|
||||||
|
+ output = Gem::Util.popen(
|
||||||
|
+ *ruby_with_rubygems_and_fake_operating_system_in_load_path(path),
|
||||||
|
+ '-e',
|
||||||
|
+ "require \"rubygems\"; puts Gem::Specification.stubs.map(&:full_name)",
|
||||||
|
+ {:err => [:child, :out]}
|
||||||
|
+ ).strip
|
||||||
|
+ assert_empty output
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
private
|
||||||
|
|
||||||
|
def util_install_operating_system_rb(content)
|
||||||
|
|
||||||
|
From 52cfdd14fd1213a97aac12f01177e27779de9035 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||||
|
Date: Thu, 9 Dec 2021 06:08:31 +0100
|
||||||
|
Subject: [PATCH 4/5] Install default fiddle on latest ruby on specs that need
|
||||||
|
it
|
||||||
|
|
||||||
|
Otherwise first OS customizations load and activate that fiddle version,
|
||||||
|
but then when we change to `Gem.default_dir`, that fiddle version is no
|
||||||
|
longer there.
|
||||||
|
---
|
||||||
|
spec/bundler/commands/clean_spec.rb | 2 +-
|
||||||
|
spec/bundler/install/gems/standalone_spec.rb | 2 +-
|
||||||
|
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/spec/bundler/commands/clean_spec.rb b/spec/bundler/commands/clean_spec.rb
|
||||||
|
index ffaf22dbb32..65231b35fac 100644
|
||||||
|
--- a/spec/bundler/commands/clean_spec.rb
|
||||||
|
+++ b/spec/bundler/commands/clean_spec.rb
|
||||||
|
@@ -638,7 +638,7 @@ def should_not_have_gems(*gems)
|
||||||
|
s.executables = "irb"
|
||||||
|
end
|
||||||
|
|
||||||
|
- realworld_system_gems "fiddle --version 1.0.6", "tsort --version 0.1.0", "pathname --version 0.1.0", "set --version 1.0.1"
|
||||||
|
+ realworld_system_gems "fiddle --version 1.0.8", "tsort --version 0.1.0", "pathname --version 0.1.0", "set --version 1.0.1"
|
||||||
|
|
||||||
|
install_gemfile <<-G
|
||||||
|
source "#{file_uri_for(gem_repo2)}"
|
||||||
|
diff --git a/spec/bundler/install/gems/standalone_spec.rb b/spec/bundler/install/gems/standalone_spec.rb
|
||||||
|
index db16a1b0e13..faefda25f45 100644
|
||||||
|
--- a/spec/bundler/install/gems/standalone_spec.rb
|
||||||
|
+++ b/spec/bundler/install/gems/standalone_spec.rb
|
||||||
|
@@ -113,7 +113,7 @@
|
||||||
|
skip "does not work on rubygems versions where `--install_dir` doesn't respect --default" unless Gem::Installer.for_spec(loaded_gemspec, :install_dir => "/foo").default_spec_file == "/foo/specifications/default/bundler-#{Bundler::VERSION}.gemspec" # Since rubygems 3.2.0.rc.2
|
||||||
|
skip "does not work on old rubies because the realworld gems that need to be installed don't support them" if RUBY_VERSION < "2.7.0"
|
||||||
|
|
||||||
|
- realworld_system_gems "fiddle --version 1.0.6", "tsort --version 0.1.0"
|
||||||
|
+ realworld_system_gems "fiddle --version 1.0.8", "tsort --version 0.1.0"
|
||||||
|
|
||||||
|
necessary_system_gems = ["optparse --version 0.1.1", "psych --version 3.3.2", "yaml --version 0.1.1", "logger --version 1.4.3", "etc --version 1.2.0", "stringio --version 3.0.0"]
|
||||||
|
necessary_system_gems += ["shellwords --version 0.1.0", "base64 --version 0.1.0", "resolv --version 0.2.1"] if Gem.rubygems_version < Gem::Version.new("3.3.3.a")
|
||||||
|
|
||||||
|
From c6a9c81021092c9157f5616a2bbe1323411a5bf8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||||
|
Date: Thu, 9 Dec 2021 12:46:23 +0100
|
||||||
|
Subject: [PATCH 5/5] Resolve symlinks in LOAD_PATH when activating
|
||||||
|
pre-required default gems
|
||||||
|
|
||||||
|
Some double load issues were reported a while ago by OS packagers where
|
||||||
|
if a gem has been required before rubygems, and then after, rubygems
|
||||||
|
require would cause a double load.
|
||||||
|
|
||||||
|
We avoid this issue by activating the corresponding gem if we detect
|
||||||
|
that a file in the default LOAD_PATH that belongs to a default gem has
|
||||||
|
already been required when rubygems registers default gems.
|
||||||
|
|
||||||
|
However, the fix does not take into account that the default LOAD_PATH
|
||||||
|
could potentially include symlinks. This change fixes the same double
|
||||||
|
load issue described above but for situations where the default
|
||||||
|
LOAD_PATH includes symlinks.
|
||||||
|
---
|
||||||
|
lib/rubygems.rb | 7 ++++++-
|
||||||
|
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/lib/rubygems.rb b/lib/rubygems.rb
|
||||||
|
index 11474b6554c..b7dda38d522 100644
|
||||||
|
--- a/lib/rubygems.rb
|
||||||
|
+++ b/lib/rubygems.rb
|
||||||
|
@@ -1293,7 +1293,12 @@ def already_loaded?(file)
|
||||||
|
end
|
||||||
|
|
||||||
|
def default_gem_load_paths
|
||||||
|
- @default_gem_load_paths ||= $LOAD_PATH[load_path_insert_index..-1]
|
||||||
|
+ @default_gem_load_paths ||= $LOAD_PATH[load_path_insert_index..-1].map do |lp|
|
||||||
|
+ expanded = File.expand_path(lp)
|
||||||
|
+ next expanded unless File.exist?(expanded)
|
||||||
|
+
|
||||||
|
+ File.realpath(expanded)
|
||||||
|
+ end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -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}$
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue