mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
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:
+15
-3
@@ -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
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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|
|
||||
|
||||
@@ -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|
|
||||
|
||||
Reference in New Issue
Block a user