summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorKOBAYASHI Shuji <[email protected]>2020-12-01 12:16:55 +0900
committerKOBAYASHI Shuji <[email protected]>2020-12-01 12:16:55 +0900
commit5c205e6ea14ac1fad40720da0689256103739b60 (patch)
treea5acbce10b7b8e120e67d23f0ded318fc3236682
parent98d5aa8d742dfd314e492a0649aef6fd324665f4 (diff)
downloadmruby-5c205e6ea14ac1fad40720da0689256103739b60.tar.gz
mruby-5c205e6ea14ac1fad40720da0689256103739b60.zip
Revert "Create presym files for each build target" (58ba883e)
Due to the above changes, it may not work with the existing build configurations in cross-compilation (even if we can build without presym), therefore revert it once (ref https://github.com/mruby/mruby/pull/5202#issuecomment-735412643). Sorry for the lack of consideration.
-rw-r--r--Rakefile142
-rw-r--r--include/mruby/presym.h2
-rw-r--r--lib/mruby/build.rb8
-rw-r--r--src/symbol.c2
-rw-r--r--tasks/presym.rake139
5 files changed, 140 insertions, 153 deletions
diff --git a/Rakefile b/Rakefile
index 8be192155..8ac1f7f8f 100644
--- a/Rakefile
+++ b/Rakefile
@@ -25,9 +25,9 @@ end
# load custom rules
load "#{MRUBY_ROOT}/tasks/core.rake"
load "#{MRUBY_ROOT}/tasks/mrblib.rake"
+
load "#{MRUBY_ROOT}/tasks/mrbgems.rake"
load "#{MRUBY_ROOT}/tasks/libmruby.rake"
-load "#{MRUBY_ROOT}/tasks/presym.rake"
load "#{MRUBY_ROOT}/tasks/benchmark.rake"
@@ -55,6 +55,9 @@ else
depfiles = []
end
+cfiles = Dir.glob("#{MRUBY_ROOT}/src/*.c")
+rbfiles = Dir.glob("#{MRUBY_ROOT}/mrblib/**/*.rb")
+psfiles = []
MRuby.each_target do |target|
gems.each do |gem|
current_dir = gem.dir.relative_path_from(Dir.pwd)
@@ -89,13 +92,142 @@ MRuby.each_target do |target|
depfiles += [ exec ]
end
end
+
+ cfiles += Dir.glob(gem.dir+"/{src,core,tools/*}/*.c")
+ if gem.cdump?
+ rbfiles += Dir.glob(gem.dir+"/mrblib/**/*.rb")
+ psfiles += Dir.glob(gem.dir+"/**/presym")
+ end
end
end
-desc "preallocated symbols"
-task :gensym do
- MRuby.each_target{|build| Rake::Task[build.presym_file].invoke}
+mkdir_p "#{MRUBY_ROOT}/build"
+symbols = []
+psfiles.each do |file|
+ symbols += File.readlines(file).grep_v(/^# /)
end
+symbols.each{|x| x.chomp!}
+presym_file="#{MRUBY_ROOT}/build/presym"
+presym_inc="#{presym_file}.inc"
+op_table = {
+ "!" => "not",
+ "!=" => "neq",
+ "!~" => "nmatch",
+ "%" => "mod",
+ "&" => "and",
+ "&&" => "andand",
+ "*" => "mul",
+ "**" => "pow",
+ "+" => "add",
+ "+@" => "plus",
+ "-" => "sub",
+ "-@" => "minus",
+ "/" => "div",
+ "<" => "lt",
+ "<=" => "le",
+ "<<" => "lshift",
+ "<=>" => "cmp",
+ "==" => "eq",
+ "===" => "eqq",
+ "=~" => "match",
+ ">" => "gt",
+ ">=" => "ge",
+ ">>" => "rshift",
+ "[]" => "aref",
+ "[]=" => "aset",
+ "^" => "xor",
+ "`" => "tick",
+ "|" => "or",
+ "||" => "oror",
+ "~" => "neg",
+}
+macro_to_symbol = {
+# Macro Symbol
+# [prefix, suffix] => [prefix, suffix]
+ ["CV" , "" ] => ["@@" , "" ],
+ ["IV" , "" ] => ["@" , "" ],
+ ["" , "_B" ] => ["" , "!" ],
+ ["" , "_Q" ] => ["" , "?" ],
+ ["" , "_E" ] => ["" , "=" ],
+ ["" , "" ] => ["" , "" ],
+}
+
+file presym_file => cfiles+rbfiles+psfiles+[__FILE__] do
+ prefix_re = Regexp.union(*macro_to_symbol.keys.map(&:first).uniq)
+ suffix_re = Regexp.union(*macro_to_symbol.keys.map(&:last).uniq)
+ macro_re = /MRB_(#{prefix_re})SYM(#{suffix_re})\((\w+)\)/o
+ csymbols = cfiles.map do |f|
+ src = File.read(f)
+ src.gsub!(/\/\/.+(\n|$)/, "\n")
+ [src.scan(/intern_lit\([^\n"]*"([^\n "]*)"/),
+ src.scan(/mrb_define_method\([^\n"]*"([^\n"]*)"/),
+ src.scan(/mrb_define_class_method\([^\n"]*"([^\n"]*)"/),
+ src.scan(/mrb_define_class\([^\n"]*"([^\n"]*)"/),
+ src.scan(/mrb_define_module\([^\n"]*"([^\n"]*)"/),
+ src.scan(/mrb_define_module_function\([^\n"]*"([^\n"]*)"/),
+ src.scan(/mrb_define_const\([^\n"]*"([^\n"]*)"/),
+ src.scan(/mrb_define_global_const\([^\n"]*"([^\n"]*)"/),
+ src.scan(macro_re).map{|prefix, suffix, name|
+ macro_to_symbol[[prefix, suffix]] * name
+ }]
+ end
+ csymbols += File.readlines("#{MRUBY_ROOT}/include/mruby.h").grep(/define E_/).join.scan(/MRB_SYM\((\w+)\)/)
+
+ rbsymbols = rbfiles.map do |f|
+ src = File.read(f)
+ src.force_encoding(Encoding::BINARY)
+ [src.scan(/\bclass +([A-Z]\w*)/),
+ src.scan(/\bmodule +([A-Z]\w*)/),
+ src.scan(/\bdef +(\w+[!?=]?)/),
+ src.scan(/\balias +(\w+[!?]?)/),
+ src.scan(/\b([A-Z]\w*) *=[^=]/),
+ src.scan(/(\$[a-zA-Z_]\w*)/),
+ src.scan(/(\$[$!?0-9]\w*)/),
+ src.scan(/(@@?[a-zA-Z_]\w*)/),
+ src.scan(/[^.]\.([a-zA-Z_]\w*[!?]?)/),
+ src.scan(/\.([a-zA-Z_]\w* *=)/).map{|x|x.map{|s|s.gsub(' ', '')}},
+ src.scan(/\b([a-zA-Z_]\w*):/),
+ src.scan(/:([a-zA-Z_]\w*[!?=]?)/),
+ src.scan(/[\(\[\{ ]:"([^"]+)"/).map{|x|x.map{|s|s.gsub('\#', '#')}},
+ src.scan(/[ \(\[\{]:'([^']+)'/)
+ ]
+ end
+ symbols = (symbols+csymbols+rbsymbols+op_table.keys).flatten.compact.uniq.grep_v(/#/).map{|x| x.gsub("\n", '\n')}.sort_by!{|x| [x.bytesize, x]}
+ presyms = File.readlines(presym_file) rescue []
+ presyms.each{|x| x.chomp!}
+ if presyms != symbols
+ _pp "GEN", presym_file.relative_path
+ File.write(presym_file, symbols.join("\n"))
+ Rake::Task[presym_inc].invoke
+ end
+end
+
+task presym_inc do
+ presyms = File.readlines(presym_file)
+ presyms.each{|x| x.chomp!}
+ symbol_to_macro = macro_to_symbol.invert
+ prefix_re = Regexp.union(*symbol_to_macro.keys.map(&:first).uniq)
+ suffix_re = Regexp.union(*symbol_to_macro.keys.map(&:last).uniq)
+ sym_re = /\A(#{prefix_re})?([\w&&\D]\w*)(#{suffix_re})?\z/o
+ _pp "GEN", presym_inc.relative_path
+ File.open(presym_inc, "w") do |f|
+ f.puts "/* MRB_PRESYM_NAMED(lit, num, type, name) */"
+ f.puts "/* MRB_PRESYM_UNNAMED(lit, num) */"
+ presyms.each.with_index(1) do |sym, num|
+ if sym_re =~ sym && (affixes = symbol_to_macro[[$1, $3]])
+ f.puts %|MRB_PRESYM_NAMED("#{sym}", #{num}, #{affixes * 'SYM'}, #{$2})|
+ elsif name = op_table[sym]
+ f.puts %|MRB_PRESYM_NAMED("#{sym}", #{num}, OPSYM, #{name})|
+ elsif
+ f.puts %|MRB_PRESYM_UNNAMED("#{sym}", #{num})|
+ end
+ end
+ f.print "#define MRB_PRESYM_MAX #{presyms.size}"
+ end
+end
+
+desc "preallocated symbols"
+task :gensym => presym_file
depfiles += MRuby.targets.map { |n, t|
t.libraries
@@ -154,5 +286,7 @@ task :deep_clean => ["clean", "clean_doc"] do
MRuby.each_target do |t|
rm_rf t.gem_clone_dir
end
+ rm_f presym_file
+ rm_f presym_inc
puts "Cleaned up mrbgems build folder"
end
diff --git a/include/mruby/presym.h b/include/mruby/presym.h
index 876e4f4fb..fd08a24da 100644
--- a/include/mruby/presym.h
+++ b/include/mruby/presym.h
@@ -16,7 +16,7 @@
#define MRB_PRESYM_UNNAMED(lit, num)
enum mruby_presym {
-#include <mruby/presym.inc>
+#include <../build/presym.inc>
};
#undef MRB_PRESYM_NAMED
diff --git a/lib/mruby/build.rb b/lib/mruby/build.rb
index 1ada8b657..a03c5fefe 100644
--- a/lib/mruby/build.rb
+++ b/lib/mruby/build.rb
@@ -373,14 +373,6 @@ EOS
def libraries
[libmruby_static]
end
-
- def presym_file
- "#{build_dir}/presym"
- end
-
- def presym_inc
- "#{build_dir}/include/mruby/presym.inc"
- end
end # Build
class CrossBuild < Build
diff --git a/src/symbol.c b/src/symbol.c
index 18ef44e77..c78f41f63 100644
--- a/src/symbol.c
+++ b/src/symbol.c
@@ -20,7 +20,7 @@ static const struct {
const char *name;
uint16_t len;
} presym_table[] = {
-#include <mruby/presym.inc>
+#include <../build/presym.inc>
};
static mrb_sym
diff --git a/tasks/presym.rake b/tasks/presym.rake
deleted file mode 100644
index 1d6ef490e..000000000
--- a/tasks/presym.rake
+++ /dev/null
@@ -1,139 +0,0 @@
-op_table = {
- "!" => "not",
- "!=" => "neq",
- "!~" => "nmatch",
- "%" => "mod",
- "&" => "and",
- "&&" => "andand",
- "*" => "mul",
- "**" => "pow",
- "+" => "add",
- "+@" => "plus",
- "-" => "sub",
- "-@" => "minus",
- "/" => "div",
- "<" => "lt",
- "<=" => "le",
- "<<" => "lshift",
- "<=>" => "cmp",
- "==" => "eq",
- "===" => "eqq",
- "=~" => "match",
- ">" => "gt",
- ">=" => "ge",
- ">>" => "rshift",
- "[]" => "aref",
- "[]=" => "aset",
- "^" => "xor",
- "`" => "tick",
- "|" => "or",
- "||" => "oror",
- "~" => "neg",
-}
-macro_to_symbol = {
-# Macro Symbol
-# [prefix, suffix] => [prefix, suffix]
- ["CV" , "" ] => ["@@" , "" ],
- ["IV" , "" ] => ["@" , "" ],
- ["" , "_B" ] => ["" , "!" ],
- ["" , "_Q" ] => ["" , "?" ],
- ["" , "_E" ] => ["" , "=" ],
- ["" , "" ] => ["" , "" ],
-}
-
-core_cfiles = Dir.glob("#{MRUBY_ROOT}/src/*.c")
-core_rbfiles = Dir.glob("#{MRUBY_ROOT}/mrblib/*.rb")
-MRuby.each_target do |build|
- cfiles = core_cfiles.dup
- rbfiles = core_rbfiles.dup
- psfiles = []
- presym_file = build.presym_file
- presym_inc = build.presym_inc
-
- build.compilers.each {|c| c.include_paths << "#{build.build_dir}/include"}
- build.gems.each do |gem|
- cfiles.concat(Dir.glob(gem.dir+"/{src,core,tools/*}/*.c"))
- if gem.cdump?
- rbfiles.concat(gem.rbfiles)
- psfiles.concat(Dir.glob(gem.dir+"/**/presym"))
- end
- gem.compilers.each {|c| c.include_paths << "#{build.build_dir}/include"}
- end
-
- file presym_file => [*cfiles, *rbfiles, *psfiles, __FILE__] do
- prefix_re = Regexp.union(*macro_to_symbol.keys.map(&:first).uniq)
- suffix_re = Regexp.union(*macro_to_symbol.keys.map(&:last).uniq)
- macro_re = /MRB_(#{prefix_re})SYM(#{suffix_re})\((\w+)\)/o
- csymbols = cfiles.map do |f|
- src = File.read(f)
- src.gsub!(/\/\/.+(\n|$)/, "\n")
- [src.scan(/intern_lit\([^\n"]*"([^\n "]*)"/),
- src.scan(/mrb_define_method\([^\n"]*"([^\n"]*)"/),
- src.scan(/mrb_define_class_method\([^\n"]*"([^\n"]*)"/),
- src.scan(/mrb_define_class\([^\n"]*"([^\n"]*)"/),
- src.scan(/mrb_define_module\([^\n"]*"([^\n"]*)"/),
- src.scan(/mrb_define_module_function\([^\n"]*"([^\n"]*)"/),
- src.scan(/mrb_define_const\([^\n"]*"([^\n"]*)"/),
- src.scan(/mrb_define_global_const\([^\n"]*"([^\n"]*)"/),
- src.scan(macro_re).map{|prefix, suffix, name|
- macro_to_symbol[[prefix, suffix]] * name
- }]
- end
- csymbols += File.readlines("#{MRUBY_ROOT}/include/mruby.h").grep(/define E_/).join.scan(/MRB_SYM\((\w+)\)/)
-
- rbsymbols = rbfiles.map do |f|
- src = File.read(f)
- src.force_encoding(Encoding::BINARY)
- [src.scan(/\bclass +([A-Z]\w*)/),
- src.scan(/\bmodule +([A-Z]\w*)/),
- src.scan(/\bdef +(\w+[!?=]?)/),
- src.scan(/\balias +(\w+[!?]?)/),
- src.scan(/\b([A-Z]\w*) *=[^=]/),
- src.scan(/(\$[a-zA-Z_]\w*)/),
- src.scan(/(\$[$!?0-9]\w*)/),
- src.scan(/(@@?[a-zA-Z_]\w*)/),
- src.scan(/[^.]\.([a-zA-Z_]\w*[!?]?)/),
- src.scan(/\.([a-zA-Z_]\w* *=)/).map{|x|x.map{|s|s.gsub(' ', '')}},
- src.scan(/\b([a-zA-Z_]\w*):/),
- src.scan(/:([a-zA-Z_]\w*[!?=]?)/),
- src.scan(/[\(\[\{ ]:"([^"]+)"/).map{|x|x.map{|s|s.gsub('\#', '#')}},
- src.scan(/[ \(\[\{]:'([^']+)'/)
- ]
- end
- symbols = [csymbols, rbsymbols, op_table.keys, psfiles.map{|file| symbols.concat(File.readlines(file).grep_v(/^# /))}]
- symbols = symbols.flatten.compact.uniq.grep_v(/#/).map{|x| x.gsub("\n", '\n')}.sort_by!{|x| [x.bytesize, x]}
- presyms = File.readlines(presym_file) rescue []
- presyms.each{|x| x.chomp!}
- if presyms != symbols
- _pp "GEN", presym_file.relative_path
- mkdir_p(File.dirname(presym_file))
- File.write(presym_file, symbols.join("\n"))
- Rake::Task["gensym:#{presym_inc}"].invoke
- end
- end
-
- task "gensym:#{presym_inc}" do
- presyms = File.readlines(presym_file)
- presyms.each{|x| x.chomp!}
- symbol_to_macro = macro_to_symbol.invert
- prefix_re = Regexp.union(*symbol_to_macro.keys.map(&:first).uniq)
- suffix_re = Regexp.union(*symbol_to_macro.keys.map(&:last).uniq)
- macro_re = /\A(#{prefix_re})?([\w&&\D]\w*)(#{suffix_re})?\z/o
- mkdir_p(File.dirname(presym_inc))
- _pp "GEN", presym_inc.relative_path
- File.open(presym_inc, "w") do |f|
- f.puts "/* MRB_PRESYM_NAMED(lit, num, type, name) */"
- f.puts "/* MRB_PRESYM_UNNAMED(lit, num) */"
- presyms.each.with_index(1) do |sym, num|
- if macro_re =~ sym && (affixes = symbol_to_macro[[$1, $3]])
- f.puts %|MRB_PRESYM_NAMED("#{sym}", #{num}, #{affixes * 'SYM'}, #{$2})|
- elsif name = op_table[sym]
- f.puts %|MRB_PRESYM_NAMED("#{sym}", #{num}, OPSYM, #{name})|
- elsif
- f.puts %|MRB_PRESYM_UNNAMED("#{sym}", #{num})|
- end
- end
- f.print "#define MRB_PRESYM_MAX #{presyms.size}"
- end
- end
-end