Class: Cplus2Ruby::Compiler
- Inherits:
-
Object
- Object
- Cplus2Ruby::Compiler
- Defined in:
- lib/cplus2ruby/compiler.rb
Instance Method Summary collapse
- #commit(file, force_compilation = false, cflags = "", libs = "", &block) ⇒ Object (also: #startup)
-
#compile(file, cflags = "", libs = "") ⇒ Object
Compiles
file. -
#initialize(model = Cplus2Ruby.model) ⇒ Compiler
constructor
A new instance of Compiler.
- #names(file) ⇒ Object
- #write_files(mod_name) ⇒ Object
Constructor Details
#initialize(model = Cplus2Ruby.model) ⇒ Compiler
Returns a new instance of Compiler.
5 6 7 |
# File 'lib/cplus2ruby/compiler.rb', line 5 def initialize(model=Cplus2Ruby.model) @model = model end |
Instance Method Details
#commit(file, force_compilation = false, cflags = "", libs = "", &block) ⇒ Object Also known as: startup
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# File 'lib/cplus2ruby/compiler.rb', line 16 def commit(file, force_compilation=false, cflags="", libs="", &block) n = names(file) if not force_compilation begin require n[:ld] block.call if block return rescue LoadError end end compile(file, cflags, libs) require n[:ld] block.call if block end |
#compile(file, cflags = "", libs = "") ⇒ Object
Compiles file. Returns the name of the shared object to use by require.
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'lib/cplus2ruby/compiler.rb', line 39 def compile(file, cflags="", libs="") n = names(file) require 'win32/process' if RUBY_PLATFORM.match('mswin') require 'fileutils' FileUtils.mkdir_p(n[:dir]) make = RUBY_PLATFORM.match('mswin') ? 'nmake' : 'make' Dir.chdir(n[:dir]) do if File.exist?('Makefile') system("#{make} clean") File.delete('Makefile') end write_files(n[:mod]) end pid = fork do Dir.chdir(n[:dir]) $configure_args = {"--srcdir" => Dir.pwd} require 'mkmf' $CFLAGS = cflags $LIBS << (" -lstdc++ " + libs) create_makefile(n[:mod]) exec "#{make}" end _, status = Process.waitpid2(pid) if RUBY_PLATFORM.match('mswin') raise if status != 0 else raise if status.exitstatus != 0 end return n[:ld] end |
#names(file) ⇒ Object
77 78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/cplus2ruby/compiler.rb', line 77 def names(file) require 'rbconfig' base = File.basename(file) dir = File.dirname(file) mod, ext = base.split(".") ld = "#{dir}/#{mod}.#{Config::CONFIG['DLEXT']}" { :file => file, :base => base, :dir => dir, :mod => mod, :ext => ext, :ld => ld } end |
#write_files(mod_name) ⇒ Object
9 10 11 12 13 14 |
# File 'lib/cplus2ruby/compiler.rb', line 9 def write_files(mod_name) cpp_cg = Cplus2Ruby::CppCodeGenerator.new(@model) wrap_cg = Cplus2Ruby::WrapperCodeGenerator.new(@model) cpp_cg.write_files(mod_name) wrap_cg.write_files(mod_name) end |