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.



57
58
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 57

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}/repos/#{@name}"
    @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
    @enable_lock = true
    @toolchains = []
    @gem_dir_to_repo_url = {}

    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.



41
42
43
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 41

def current
  @current
end

Instance Attribute Details

#binsObject

Returns the value of attribute bins.



45
46
47
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 45

def bins
  @bins
end

#build_dirObject

Returns the value of attribute build_dir.



45
46
47
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 45

def build_dir
  @build_dir
end

#enable_bintestObject



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

def enable_bintest
  @enable_bintest = true
end

#enable_testObject



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

def enable_test
  @enable_test = true
end

#extsObject

Returns the value of attribute exts.



45
46
47
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 45

def exts
  @exts
end

#file_separatorObject

Returns the value of attribute file_separator.



45
46
47
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 45

def file_separator
  @file_separator
end

#gem_clone_dirObject

Returns the value of attribute gem_clone_dir.



45
46
47
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 45

def gem_clone_dir
  @gem_clone_dir
end

#gem_dir_to_repo_urlObject (readonly)

Returns the value of attribute gem_dir_to_repo_url.



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

def gem_dir_to_repo_url
  @gem_dir_to_repo_url
end

#gemsObject (readonly)

Returns the value of attribute gems.



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

def gems
  @gems
end

#libmruby_objsObject (readonly) Also known as: libmruby

Returns the value of attribute libmruby_objs.



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

def libmruby_objs
  @libmruby_objs
end

#nameObject

Returns the value of attribute name.



45
46
47
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 45

def name
  @name
end

#toolchainsObject (readonly)

Returns the value of attribute toolchains.



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

def toolchains
  @toolchains
end

Instance Method Details

#bintest_enabled?Boolean

Returns:

  • (Boolean)


202
203
204
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 202

def bintest_enabled?
  @enable_bintest
end

#build_mrbc_execObject



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

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

#build_mrbtestObject



234
235
236
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 234

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

#build_mrbtest_lib_onlyObject



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

def build_mrbtest_lib_only
  @build_mrbtest_lib_only = true
end

#build_mrbtest_lib_only?Boolean

Returns:

  • (Boolean)


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

def build_mrbtest_lib_only?
  @build_mrbtest_lib_only
end

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



172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 172

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

  file cxx_src => [src, __FILE__] do |t|
    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



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

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

#cxx_abi_enabled?Boolean

Returns:

  • (Boolean)


154
155
156
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 154

def cxx_abi_enabled?
  @cxx_abi_enabled
end

#cxx_exception_enabled?Boolean

Returns:

  • (Boolean)


150
151
152
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 150

def cxx_exception_enabled?
  @cxx_exception_enabled
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



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

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



129
130
131
132
133
134
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 129

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

#disable_lockObject



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

def disable_lock
  @enable_lock = false
end

#enable_cxx_abiObject



158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 158

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
    c.flags = c.flags.flatten - c.cxx_invalid_flags.flatten
  }
  linker.command = cxx.command if toolchains.find { |v| v == 'gcc' }
  @cxx_abi_enabled = true
end

#enable_cxx_exceptionObject



136
137
138
139
140
141
142
143
144
145
146
147
148
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 136

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



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

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



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

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

#libfile(name) ⇒ Object



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

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

#libmruby_core_staticObject



355
356
357
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 355

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

#libmruby_staticObject



351
352
353
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 351

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

#librariesObject



359
360
361
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 359

def libraries
  [libmruby_static]
end

#lock_enabled?Boolean

Returns:

  • (Boolean)


125
126
127
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 125

def lock_enabled?
  Lockfile.enabled? && @enable_lock
end

#locksObject



242
243
244
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 242

def locks
  Lockfile.build(@name)
end

#mrbcfileObject



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

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



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

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

#primary_toolchainObject



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

def primary_toolchain
  @toolchains.first
end


332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 332

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 = @gems.sort_by { |gem| gem.name }
    gems.each 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



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

def root
  MRUBY_ROOT
end

#run_bintestObject



325
326
327
328
329
330
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 325

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



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

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)


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

def test_enabled?
  @enable_test
end

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



206
207
208
209
210
211
212
213
214
215
216
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 206

def toolchain(name, params={})
  name = name.to_s
  tc = Toolchain.toolchains[name] || begin
    path = "#{MRUBY_ROOT}/tasks/toolchains/#{name}.rake"
    fail "Unknown #{name} toolchain" unless File.exist?(path)
    load path
    Toolchain.toolchains[name]
  end
  tc.setup(self, params)
  @toolchains.unshift name
end

#verbose_flagObject



314
315
316
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 314

def verbose_flag
  Rake.verbose ? ' -v' : ''
end