summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornagachika <nagachika@ruby-lang.org>2024-05-16 11:36:47 +0900
committernagachika <nagachika@ruby-lang.org>2024-05-16 11:36:47 +0900
commit2d686e1019414f6bbb7ccbfa897b7b665250743d (patch)
tree0489094d1e53b94a73ab5ae1f4e9f3dfeca2e65e
parent449899b38314d0ecbe61e42d34398bdf2561b8e9 (diff)
merge revision(s) ae8990aef098410ecc2b5f48fea9d7d171a3c5f6: [Backport #20183]
Alias init functions The extension library has each initialization function named "Init_" + basename. If multiple extensions have the same base name (such as cgi/escape and erb/escape), the same function will be registered for both names. To fix this conflict, rename the initialization functions under sub directories using using parent names, when statically linking.
-rwxr-xr-xext/extmk.rb16
-rw-r--r--template/extinit.c.tmpl2
-rw-r--r--version.h2
3 files changed, 17 insertions, 3 deletions
diff --git a/ext/extmk.rb b/ext/extmk.rb
index cab9a519c1..c9881a4b0e 100755
--- a/ext/extmk.rb
+++ b/ext/extmk.rb
@@ -136,6 +136,14 @@ def extract_makefile(makefile, keep = true)
true
end
+def create_makefile(target, srcprefix = nil)
+ if $static and target.include?("/")
+ base = File.basename(target)
+ $defs << "-DInit_#{base}=Init_#{target.tr('/', '_')}"
+ end
+ super
+end
+
def extmake(target, basedir = 'ext', maybestatic = true)
FileUtils.mkpath target unless File.directory?(target)
begin
@@ -549,7 +557,13 @@ extend Module.new {
end
def create_makefile(*args, &block)
- return super unless @gemname
+ unless @gemname
+ if $static and (target = args.first).include?("/")
+ base = File.basename(target)
+ $defs << "-DInit_#{base}=Init_#{target.tr('/', '_')}"
+ end
+ return super
+ end
super(*args) do |conf|
conf.find do |s|
s.sub!(%r(^(srcdir *= *)\$\(top_srcdir\)/\.bundle/gems/[^/]+(?=/))) {
diff --git a/template/extinit.c.tmpl b/template/extinit.c.tmpl
index 7a9c910633..e0b076b03c 100644
--- a/template/extinit.c.tmpl
+++ b/template/extinit.c.tmpl
@@ -1,5 +1,5 @@
%# -*- C -*-
-% extinits = ARGV.map {|n| [n[%r[[^/.]+(?=\.[^/]*)?\z]], n]}
+% extinits = ARGV.map {|n| [n.tr('/', '_'), n]}
#include "ruby/ruby.h"
#define init(func, name) { \
diff --git a/version.h b/version.h
index 4d286dd401..a65b6c8239 100644
--- a/version.h
+++ b/version.h
@@ -11,7 +11,7 @@
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
#define RUBY_VERSION_TEENY 4
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
-#define RUBY_PATCHLEVEL 170
+#define RUBY_PATCHLEVEL 171
#include "ruby/version.h"
#include "ruby/internal/abi.h"