Compile C files by C compiler when C++ files mixed.

ref #3267 #3470

By this commit, mruby do not use C++ ABI mode unless
you specify explicitly. It compiles C files by C
compilers, with C++ exception enabled when it sees
C++ files in your configured mrbgems.

I haven't tried visualcpp, so please submit an issue
if you see any problem with C++ gems on Windows.
This commit is contained in:
Yukihiro "Matz" Matsumoto
2017-02-28 23:27:13 +09:00
parent dc56bbecc8
commit 1a1f834ade
6 changed files with 33 additions and 7 deletions
+15 -3
View File
@@ -242,9 +242,19 @@ conf.enable_bintest
### C++ ABI
mruby can use C++ exception to raise exception internally.
It is called C++ ABI mode.
By using C++ exception it can release C++ stack object correctly.
Whenever you mix C++ code C++ ABI mode would be enabled automatically.
There are two levels of C++ exception handling. The one is
C++ exception enabled (but still C files are compiled by C
compiler), and the other is C++ ABI mode where all files are
compiled by C++ compiler.
When you mix C++ code, C++ exception would be enabled automatically.
If you need to enable C++ exception explicitly add the following:
```ruby
conf.enable_cxx_exception
```
If you need to enable C++ ABI mode explicitly add the following:
```ruby
conf.enable_cxx_abi
@@ -252,8 +262,10 @@ conf.enable_cxx_abi
#### C++ exception disabling.
If you need to force C++ exception disable
(For example using a compiler option to disable C++ exception)
(For example using a compiler option to disable C++ exception),
but still want to use C++ ABI mode,
add following:
```ruby
conf.disable_cxx_exception
+12 -2
View File
@@ -113,13 +113,23 @@ module MRuby
@cxx_exception_disabled = true
end
def enable_cxx_exception
@cxx_exception_disabled = false
compilers.each { |c|
c.defines += %w(MRB_ENABLE_CXX_EXCEPTION)
c.flags << c.cxx_exception_flag
}
end
def cxx_abi_enabled?
@cxx_abi_enabled
end
def enable_cxx_abi
return if @cxx_exception_disabled or @cxx_abi_enabled
compilers.each { |c| c.defines += %w(MRB_ENABLE_CXX_EXCEPTION) }
return if @cxx_abi_enabled
unless @cxx_exception_disabled
enable_cxx_exception
end
compilers.each { |c| c.flags << c.cxx_compile_flag }
linker.command = cxx.command if toolchains.find { |v| v == 'gcc' }
@cxx_abi_enabled = true
+1 -1
View File
@@ -41,7 +41,7 @@ module MRuby
class Command::Compiler < Command
attr_accessor :flags, :include_paths, :defines, :source_exts
attr_accessor :compile_options, :option_define, :option_include_path, :out_ext
attr_accessor :cxx_compile_flag
attr_accessor :cxx_compile_flag, :cxx_exception_flag
def initialize(build, source_exts=[])
super(build)
+1 -1
View File
@@ -38,7 +38,7 @@ module MRuby
cxx_srcs = ['src', 'test', 'tools'].map do |subdir|
Dir.glob("#{Gem.current.dir}/#{subdir}/*.{cpp,cxx,cc}")
end.flatten
enable_cxx_abi unless cxx_srcs.empty?
enable_cxx_exception unless cxx_srcs.empty?
Gem.current
end
+2
View File
@@ -7,6 +7,7 @@ MRuby::Toolchain.new(:gcc) do |conf, _params|
cc.option_define = '-D%s'
cc.compile_options = '%{flags} -MMD -o %{outfile} -c %{infile}'
cc.cxx_compile_flag = '-x c++ -std=c++03'
cc.cxx_exception_flag = '-fexceptions'
end
[conf.cxx].each do |cxx|
@@ -17,6 +18,7 @@ MRuby::Toolchain.new(:gcc) do |conf, _params|
cxx.option_define = '-D%s'
cxx.compile_options = '%{flags} -MMD -o %{outfile} -c %{infile}'
cxx.cxx_compile_flag = '-x c++ -std=c++03'
cxx.cxx_exception_flag = '-fexceptions'
end
conf.linker do |linker|
+2
View File
@@ -8,6 +8,7 @@ MRuby::Toolchain.new(:visualcpp) do |conf, _params|
cc.option_define = '/D%s'
cc.compile_options = "%{flags} /Fo%{outfile} %{infile}"
cc.cxx_compile_flag = '/TP'
cc.cxx_exception_flag = '/EHs'
end
conf.cxx do |cxx|
@@ -18,6 +19,7 @@ MRuby::Toolchain.new(:visualcpp) do |conf, _params|
cxx.option_define = '/D%s'
cxx.compile_options = "%{flags} /Fo%{outfile} %{infile}"
cxx.cxx_compile_flag = '/TP'
cxx.cxx_exception_flag = '/EHs'
end
conf.linker do |linker|