Class: MRuby::Build

Inherits:
#Object show all
Includes:
LoadGems, Rake::DSL
Defined in:
ext/enterprise_script_service/mruby/lib/mruby/build.rb

Direct Known Subclasses

CrossBuild

Defined Under Namespace

Classes: Exts

Constant Summary collapse

COMPILERS =
%w(cc cxx objc asm)
COMMANDS =
COMPILERS + %w(linker archiver yacc gperf git exts mrbc)

Class Attribute Summary collapse

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from LoadGems

#enable_gems?, #gem, #gembox, #load_special_path_gem

Constructor Details

#initialize(name = 'host', build_dir = nil, &block) ⇒ Build

Returns a new instance of Build.



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 59

def initialize(name='host', build_dir=nil, &block)
  @name = name.to_s

  unless MRuby.targets[@name]
    if ENV['OS'] == 'Windows_NT'
      @exts = Exts.new('.o', '.exe', '.a')
    else
      @exts = Exts.new('.o', '', '.a')
    end

    build_dir = build_dir || ENV['MRUBY_BUILD_DIR'] || "#{MRUBY_ROOT}/build"

    @file_separator = '/'
    @build_dir = "#{build_dir}/#{@name}"
    @gem_clone_dir = "#{build_dir}/mrbgems"
    @cc = Command::Compiler.new(self, %w(.c))
    @cxx = Command::Compiler.new(self, %w(.cc .cxx .cpp))
    @objc = Command::Compiler.new(self, %w(.m))
    @asm = Command::Compiler.new(self, %w(.S .asm))
    @linker = Command::Linker.new(self)
    @archiver = Command::Archiver.new(self)
    @yacc = Command::Yacc.new(self)
    @gperf = Command::Gperf.new(self)
    @git = Command::Git.new(self)
    @mrbc = Command::Mrbc.new(self)

    @bins = []
    @gems, @libmruby_objs = MRuby::Gem::List.new, []
    @build_mrbtest_lib_only = false
    @cxx_exception_enabled = false
    @cxx_exception_disabled = false
    @cxx_abi_enabled = false
    @enable_bintest = false
    @enable_test = false
    @toolchains = []

    MRuby.targets[@name] = self
  end

  MRuby::Build.current = MRuby.targets[@name]
  MRuby.targets[@name].instance_eval(&block)

  build_mrbc_exec if name == 'host'
  build_mrbtest if test_enabled?
end

Class Attribute Details

.currentObject

Returns the value of attribute current.



43
44
45
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 43

def current
  @current
end

Instance Attribute Details

#binsObject

Returns the value of attribute bins.



47
48
49
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 47

def bins
  @bins
end

#build_dirObject

Returns the value of attribute build_dir.



47
48
49
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 47

def build_dir
  @build_dir
end

#enable_bintestObject



190
191
192
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 190

def enable_bintest
  @enable_bintest = true
end

#enable_testObject



213
214
215
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 213

def enable_test
  @enable_test = true
end

#extsObject

Returns the value of attribute exts.



47
48
49
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 47

def exts
  @exts
end

#file_separatorObject

Returns the value of attribute file_separator.



47
48
49
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 47

def file_separator
  @file_separator
end

#gem_clone_dirObject

Returns the value of attribute gem_clone_dir.



47
48
49
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 47

def gem_clone_dir
  @gem_clone_dir
end

#gemsObject (readonly)

Returns the value of attribute gems.



48
49
50
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 48

def gems
  @gems
end

#libmruby_objsObject (readonly) Also known as: libmruby

Returns the value of attribute libmruby_objs.



48
49
50
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 48

def libmruby_objs
  @libmruby_objs
end

#nameObject

Returns the value of attribute name.



47
48
49
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 47

def name
  @name
end

#toolchainsObject (readonly)

Returns the value of attribute toolchains.



48
49
50
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 48

def toolchains
  @toolchains
end

Instance Method Details

#bintest_enabled?Boolean

Returns:

  • (Boolean)


194
195
196
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 194

def bintest_enabled?
  @enable_bintest
end

#build_mrbc_execObject



225
226
227
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 225

def build_mrbc_exec
  gem :core => 'mruby-bin-mrbc'
end

#build_mrbtestObject



221
222
223
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 221

def build_mrbtest
  gem :core => 'mruby-test'
end

#build_mrbtest_lib_onlyObject



297
298
299
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 297

def build_mrbtest_lib_only
  @build_mrbtest_lib_only = true
end

#build_mrbtest_lib_only?Boolean

Returns:

  • (Boolean)


301
302
303
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 301

def build_mrbtest_lib_only?
  @build_mrbtest_lib_only
end

#compile_as_cxx(src, cxx_src, obj = nil, includes = []) ⇒ Object



164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 164

def compile_as_cxx src, cxx_src, obj = nil, includes = []
  obj = objfile(cxx_src) if obj.nil?

  file cxx_src => [src, __FILE__] do |t|
    FileUtils.mkdir_p File.dirname t.name
    IO.write t.name, "#define __STDC_CONSTANT_MACROS\n#define __STDC_LIMIT_MACROS\n\n#ifndef MRB_ENABLE_CXX_ABI\nextern \"C\" {\n#endif\n#include \"\#{File.absolute_path src}\"\n#ifndef MRB_ENABLE_CXX_ABI\n}\n#endif\n"
  end

  file obj => cxx_src do |t|
    cxx.run t.name, t.prerequisites.first, [], ["#{MRUBY_ROOT}/src"] + includes
  end

  obj
end

#compilersObject



237
238
239
240
241
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 237

def compilers
  COMPILERS.map do |c|
    instance_variable_get("@#{c}")
  end
end

#cxx_abi_enabled?Boolean

Returns:

  • (Boolean)


146
147
148
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 146

def cxx_abi_enabled?
  @cxx_abi_enabled
end

#cxx_exception_enabled?Boolean

Returns:

  • (Boolean)


142
143
144
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 142

def cxx_exception_enabled?
  @cxx_exception_enabled
end

#cygwin_filename(name) ⇒ Object



262
263
264
265
266
267
268
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 262

def cygwin_filename(name)
  if name.is_a?(Array)
    name.flatten.map { |n| cygwin_filename(n) }
  else
    '"%s"' % `cygpath -w "#{filename(name)}"`.strip
  end
end

#debug_enabled?Boolean

Returns:

  • (Boolean)


105
106
107
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 105

def debug_enabled?
  @enable_debug
end

#define_rulesObject



243
244
245
246
247
248
249
250
251
252
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 243

def define_rules
  compilers.each do |compiler|
    if respond_to?(:enable_gems?) && enable_gems?
      compiler.defines -= %w(DISABLE_GEMS)
    else
      compiler.defines += %w(DISABLE_GEMS)
    end
    compiler.define_rules build_dir, File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
  end
end

#disable_cxx_exceptionObject



121
122
123
124
125
126
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 121

def disable_cxx_exception
  if @cxx_exception_enabled or @cxx_abi_enabled
    raise "cxx_exception already enabled"
  end
  @cxx_exception_disabled = true
end

#enable_cxx_abiObject



150
151
152
153
154
155
156
157
158
159
160
161
162
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 150

def enable_cxx_abi
  return if @cxx_abi_enabled
  if @cxx_exception_enabled
    raise "cxx_exception already enabled"
  end
  compilers.each { |c|
    c.defines += %w(MRB_ENABLE_CXX_EXCEPTION MRB_ENABLE_CXX_ABI)
    c.flags << c.cxx_compile_flag
  }
  compilers.each { |c| c.flags << c.cxx_compile_flag }
  linker.command = cxx.command if toolchains.find { |v| v == 'gcc' }
  @cxx_abi_enabled = true
end

#enable_cxx_exceptionObject



128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 128

def enable_cxx_exception
  return if @cxx_exception_enabled
  return if @cxx_abi_enabled
  if @cxx_exception_disabled
    raise "cxx_exception disabled"
  end
  @cxx_exception_enabled = true
  compilers.each { |c|
    c.defines += %w(MRB_ENABLE_CXX_EXCEPTION)
    c.flags << c.cxx_exception_flag
  }
  linker.command = cxx.command if toolchains.find { |v| v == 'gcc' }
end

#enable_debugObject



109
110
111
112
113
114
115
116
117
118
119
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 109

def enable_debug
  compilers.each do |c|
    c.defines += %w(MRB_DEBUG)
    if toolchains.any? { |toolchain| toolchain == "gcc" }
      c.flags += %w(-g3 -O0)
    end
  end
  @mrbc.compile_options += ' -g'

  @enable_debug = true
end

#exefile(name) ⇒ Object



270
271
272
273
274
275
276
277
278
279
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 270

def exefile(name)
  if name.is_a?(Array)
    name.flatten.map { |n| exefile(n) }
  elsif File.extname(name).empty?
    "#{name}#{exts.executable}"
  else
    # `name` sometimes have (non-standard) extension (e.g. `.bat`).
    name
  end
end

#filename(name) ⇒ Object



254
255
256
257
258
259
260
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 254

def filename(name)
  if name.is_a?(Array)
    name.flatten.map { |n| filename(n) }
  else
    '"%s"' % name.gsub('/', file_separator)
  end
end

#libfile(name) ⇒ Object



289
290
291
292
293
294
295
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 289

def libfile(name)
  if name.is_a?(Array)
    name.flatten.map { |n| libfile(n) }
  else
    "#{name}#{exts.library}"
  end
end

#libmruby_core_staticObject



345
346
347
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 345

def libmruby_core_static
  libfile("#{build_dir}/lib/libmruby_core")
end

#libmruby_staticObject



341
342
343
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 341

def libmruby_static
  libfile("#{build_dir}/lib/libmruby")
end

#librariesObject



349
350
351
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 349

def libraries
  [libmruby_static]
end

#mrbcfileObject



229
230
231
232
233
234
235
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 229

def mrbcfile
  return @mrbcfile if @mrbcfile

  mrbc_build = MRuby.targets['host']
  gems.each { |v| mrbc_build = self if v.name == 'mruby-bin-mrbc' }
  @mrbcfile = mrbc_build.exefile("#{mrbc_build.build_dir}/bin/mrbc")
end

#objfile(name) ⇒ Object



281
282
283
284
285
286
287
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 281

def objfile(name)
  if name.is_a?(Array)
    name.flatten.map { |n| objfile(n) }
  else
    "#{name}#{exts.object}"
  end
end

#primary_toolchainObject



205
206
207
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 205

def primary_toolchain
  @toolchains.first
end


323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 323

def print_build_summary
  puts "================================================"
  puts "      Config Name: #{@name}"
  puts " Output Directory: #{self.build_dir.relative_path}"
  puts "         Binaries: #{@bins.join(', ')}" unless @bins.empty?
  unless @gems.empty?
    puts "    Included Gems:"
    @gems.map do |gem|
      gem_version = " - #{gem.version}" if gem.version != '0.0.0'
      gem_summary = " - #{gem.summary}" if gem.summary
      puts "             #{gem.name}#{gem_version}#{gem_summary}"
      puts "               - Binaries: #{gem.bins.join(', ')}" unless gem.bins.empty?
    end
  end
  puts "================================================"
  puts
end

#rootObject



209
210
211
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 209

def root
  MRUBY_ROOT
end

#run_bintestObject



316
317
318
319
320
321
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 316

def run_bintest
  puts ">>> Bintest #{name} <<<"
  targets = @gems.select { |v| File.directory? "#{v.dir}/bintest" }.map { |v| filename v.dir }
  targets << filename(".") if File.directory? "./bintest"
  sh "ruby test/bintest.rb#{verbose_flag} #{targets.join ' '}"
end

#run_testObject



309
310
311
312
313
314
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 309

def run_test
  puts ">>> Test #{name} <<<"
  mrbtest = exefile("#{build_dir}/bin/mrbtest")
  sh "#{filename mrbtest.relative_path}#{verbose_flag}"
  puts
end

#test_enabled?Boolean

Returns:

  • (Boolean)


217
218
219
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 217

def test_enabled?
  @enable_test
end

#toolchain(name, params = {}) ⇒ Object



198
199
200
201
202
203
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 198

def toolchain(name, params={})
  tc = Toolchain.toolchains[name.to_s]
  fail "Unknown #{name} toolchain" unless tc
  tc.setup(self, params)
  @toolchains.unshift name.to_s
end

#verbose_flagObject



305
306
307
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 305

def verbose_flag
  $verbose ? ' -v' : ''
end