summaryrefslogtreecommitdiff
path: root/ext/extmk.rb
diff options
context:
space:
mode:
authoryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-05-16 05:39:06 +0000
committeryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-05-16 05:39:06 +0000
commit3fa3f9abb9a187a12089c2c5a650a62dbd82a3dd (patch)
tree5a7f6c9f348469863b60010b02375c06b6704951 /ext/extmk.rb
parent0923ae5ed1711d699ef2923c2223163646634a66 (diff)
Supports static linking of extensions and encodings again.
Fixes --with-static-linked-ext. Patch by Google Inc. [ruby-core:45073]. * Makefile.in (ENCOBJS, EXTOBJS): New variables to specify static linked libraries. Also reintroduces extinit.o, introduces encinit.o introduces encinit.o * common.mk: Builds static libraries rather than shared objects if specified. * configure.in (LD): new substitution. Avoids PIE if s * enc/depend: Supports static linked libraries (libencs, libenc, libtrans): New target. * enc/encinit.c.erb: new template to generate the initialization of statically linked encodings. * enc/make_encmake.rb (--module): new flag to specify whether static or dynamic. * transcode_data.h (TRANS_INIT): New macro to get rid of the name collision of encoding initializers and transcoder initializers. * ext/extmk.rb: Fixes the behavior on $extstatic is true. * lib/mkmf.rb (clean-static): new target to clean up static linked libraries. * ruby.c (process_options): New initializes statically linked encodings here. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35662 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/extmk.rb')
-rwxr-xr-xext/extmk.rb73
1 files changed, 50 insertions, 23 deletions
diff --git a/ext/extmk.rb b/ext/extmk.rb
index 3b2c0c6..c8ff664 100755
--- a/ext/extmk.rb
+++ b/ext/extmk.rb
@@ -10,7 +10,7 @@ $dryrun = false
$clean = nil
$nodynamic = nil
$extinit = nil
-$extobjs = nil
+$extobjs = []
$extflags = ""
$extlibs = nil
$extpath = nil
@@ -26,6 +26,8 @@ alias $0 $progname
$extlist = []
$compiled = {}
+DUMMY_SIGNATURE = "***DUMMY MAKEFILE***"
+
srcdir = File.dirname(File.dirname(__FILE__))
unless defined?(CROSS_COMPILING) and CROSS_COMPILING
$:.replace([File.expand_path("lib", srcdir), Dir.pwd])
@@ -46,7 +48,18 @@ def sysquote(x)
end
def verbose?
- $mflags.defined?("Q") != "@"
+ $mflags.defined?("V") == "1"
+end
+
+def system(*args)
+ if verbose?
+ if args.size == 1
+ puts args
+ else
+ puts args.map{|arg| Shellwords.escape(arg)}.join(' ')
+ end
+ end
+ super
end
def extract_makefile(makefile, keep = true)
@@ -100,7 +113,7 @@ def extract_makefile(makefile, keep = true)
end
def extmake(target)
- unless $configure_only
+ unless $configure_only || verbose?
print "#{$message} #{target}\n"
$stdout.flush
end
@@ -163,7 +176,11 @@ def extmake(target)
then
ok = false
if $configure_only
- print "#{$message} #{target}\n"
+ if verbose?
+ print "#{conf}\n" if conf
+ else
+ print "#{$message} #{target}\n"
+ end
$stdout.flush
end
init_mkmf
@@ -193,9 +210,11 @@ def extmake(target)
$0 = $PROGRAM_NAME
end
end
+ ok &&= File.open(makefile){|f| !f.gets[DUMMY_SIGNATURE]}
ok = yield(ok) if block_given?
unless ok
open(makefile, "w") do |f|
+ f.puts "# " + DUMMY_SIGNATURE
f.print(*dummy_makefile(CONFIG["srcdir"]))
end
print "Failed to configure #{target}. It will not be installed.\n"
@@ -205,9 +224,9 @@ def extmake(target)
unless $destdir.to_s.empty? or $mflags.defined?("DESTDIR")
args += [sysquote("DESTDIR=" + relative_from($destdir, "../"+prefix))]
end
- if $static
+ if $static and %r(\A-test-) !~ target and target != 'json' and ok
args += ["static"] unless $clean
- $extlist.push [$static, $target, File.basename($target), $preload]
+ $extlist.push [$static, target, $target, $preload]
end
FileUtils.rm_f(old_cleanfiles - $distcleanfiles)
FileUtils.rm_f(old_objs - $objs)
@@ -466,7 +485,7 @@ Dir::chdir('ext')
hdrdir = $hdrdir
$hdrdir = ($top_srcdir = relative_from(srcdir, $topdir = "..")) + "/include"
exts.each do |d|
- $static = $force_static ? $static_ext[target] : nil
+ $static = $force_static ? true : $static_ext[target]
if $ignore or !$nodynamic or $static
extmake(d) or abort
@@ -502,7 +521,7 @@ if $ignore
end
$extinit ||= ""
-$extobjs ||= ""
+$extobjs ||= []
$extpath ||= []
$extflags ||= ""
$extlibs ||= []
@@ -519,31 +538,27 @@ unless $extlist.empty?
end
next
end
- f = format("%s/%s.%s", t, i, $LIBEXT)
- if File.exist?(f)
- $extinit << " init(Init_#{i}, \"#{t}.so\");\n"
- $extobjs << "ext/#{f} "
- built << t
- end
+ $extinit << " init(Init_#{File.basename i}, \"#{i}.so\");\n"
+ $extobjs << format("ext/%s/%s.%s", t, File.basename(i), $LIBEXT)
+ built << t
end
src = %{\
-#include "ruby.h"
+#include "ruby/ruby.h"
#define init(func, name) { \\
- extern void func _((void)); \\
+ extern void func(void); \\
ruby_init_ext(name, func); \\
}
-void ruby_init_ext _((const char *name, void (*init)(void)));
+void ruby_init_ext(const char *name, void (*init)(void));
-void Init_ext _((void))\n{\n#$extinit}
+void Init_ext(void)\n{\n#$extinit}
}
if !modified?(extinit.c, MTIMES) || IO.read(extinit.c) != src
open(extinit.c, "w") {|fe| fe.print src}
end
- $extobjs = "ext/#{extinit.o} #{$extobjs}"
if RUBY_PLATFORM =~ /beos/
$extflags.delete("-L/usr/local/lib")
end
@@ -552,7 +567,6 @@ void Init_ext _((void))\n{\n#$extinit}
conf = [
['LIBRUBY_SO_UPDATE', '$(LIBRUBY_EXTS)'],
['SETUP', $setup],
- [enable_config("shared", $enable_shared) ? 'DLDOBJS' : 'EXTOBJS', $extobjs],
['EXTLIBS', $extlibs.join(' ')], ['EXTLDFLAGS', $extflags]
].map {|n, v|
"#{n}=#{v}" if v and !(v = v.strip).empty?
@@ -615,21 +629,34 @@ if $configure_only and $command_output
w += d.size + 1
end
mf.puts
+ if !$extlist.empty?
+ mf.puts "EXTOBJS = ext/extinit.#{$OBJEXT} #{$extobjs.join(' ')}"
+ mf.puts "EXTLIBS = #{$extlibs.join(' ')}"
+ else
+ mf.puts "EXTOBJS = "
+ mf.puts "EXTLIBS = "
+ end
+ mf.puts
targets = %w[all install static install-so install-rb clean distclean realclean]
targets.each do |tgt|
mf.puts "#{tgt}: $(extensions:/.=/#{tgt})"
end
mf.puts
mf.puts "all: #{rubies.join(' ')}"
- mf.puts "#{rubies.join(' ')}: $(extensions:/.=/all)"
+ mf.puts "static: ext/extinit.#{$OBJEXT} #{rubies.join(' ')}"
+ mf.puts "clean:\n\t-$(Q)$(RM) ext/extinit.#{$OBJEXT}"
+ mf.puts "distclean:\n\t-$(Q)$(RM) ext/extinit.c"
+ mf.puts
+ mf.puts "#{rubies.join(' ')}: $(extensions:/.=/#{$force_static ? 'static' : 'all'})"
rubies.each do |tgt|
- mf.puts "#{tgt}:\n\t$(Q)$(MAKE) $(MFLAGS) $@"
+ mf.puts "#{tgt}:\n\t$(Q)$(MAKE) $(MFLAGS) EXTOBJS='$(EXTOBJS)' EXTLIBS='$(EXTLIBS)' $@"
end
+ mf.puts "ext/extinit.#{$OBJEXT}:\n\t$(Q)$(MAKE) $(MFLAGS) V=$(V) $@"
mf.puts
exec = config_string("exec") {|str| str + " "}
targets.each do |tgt|
exts.each do |d|
- mf.puts "#{d[0..-2]}#{tgt}:\n\t$(Q)cd $(@D) && #{exec}$(MAKE) $(MFLAGS) $(@F)"
+ mf.puts "#{d[0..-2]}#{tgt}:\n\t$(Q)cd $(@D) && #{exec}$(MAKE) $(MFLAGS) V=$(V) $(@F)"
end
end
end