diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-04-25 05:39:12 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-04-25 05:39:12 +0000 |
commit | a7dd0947916d84e2179b164a64da644e755a4e90 (patch) | |
tree | e83df381ed2457b103acd40d2d44f0f1f792d840 /template | |
parent | 75a5dcf170049bcae15b18350ff7c7950f598f01 (diff) |
rbconfig/sizeof: calculate at compilation time
* ext/rbconfig/sizeof/extconf.rb: just check the existence of each
types, to reduce configuration time, especially cross-compiling.
* template/sizes.c.tmpl: calculate sizes of checked types at
compilation time.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54759 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'template')
-rw-r--r-- | template/sizes.c.tmpl | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/template/sizes.c.tmpl b/template/sizes.c.tmpl index bd4a7c56de..2d23cacace 100644 --- a/template/sizes.c.tmpl +++ b/template/sizes.c.tmpl @@ -6,13 +6,25 @@ class String strip.upcase.tr_s("^A-Z0-9_*", "_").tr_s("*", "P") end end +headers = Hash.new {[]} +sizes = {} types = ARGF.grep(/^\s*RUBY_CHECK_SIZEOF\((\w[^\[\],#]*)[^#]*\)| ^\s*RUBY_DEFINT\((\w[^\[\],#]*)[^#]*\)| - ^\s*check_sizeof\('(.+?)'/x) {$+} + ^\s*have_type\('(.+?)'(?:,\s*%w\[(.+)\])?\)/x) do + sizes[type = $3] = true + hdrs = $4 and hdrs.split.each {|h| headers[h] <<= type} + type || $+ +end conditions = { "long long" => 'defined(HAVE_TRUE_LONG_LONG)', } %> +% headers.each do |h, type| +#if <%= type.map {|t| "defined(HAVE_TYPE_#{t.tr_cpp})"}.join(' || ') %> +# include <<%= h %>> +#endif + +% end void Init_sizeof(void) { @@ -20,8 +32,15 @@ Init_sizeof(void) rb_define_const(rb_define_module("RbConfig"), "SIZEOF", s); #define DEFINE(type, size) rb_hash_aset(s, rb_str_new_cstr(#type), INT2FIX(SIZEOF_##size)) +#define DEFINE_SIZE(type) rb_hash_aset(s, rb_str_new_cstr(#type), INT2FIX(sizeof(type))) % types.each do |type| +% if sizes[type] +#ifdef HAVE_TYPE_<%= type.tr_cpp %> + DEFINE_SIZE(<%= type %>); +#endif +% next +% end % cond = conditions[type] #if SIZEOF_<%= type.tr_cpp %> != 0<%= " && #{cond}" if cond %> DEFINE(<%= type %>, <%= type.tr_cpp %>); |