Class: MRuby::Build
- Inherits:
-
#Object
show all
- Includes:
- LoadGems, Rake::DSL
- Defined in:
- ext/enterprise_script_service/mruby/lib/mruby/build.rb
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
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
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_dir ⇒ Object
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_bintest ⇒ Object
198
199
200
|
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 198
def enable_bintest
@enable_bintest = true
end
|
#enable_test ⇒ Object
226
227
228
|
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 226
def enable_test
@enable_test = true
end
|
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_separator ⇒ Object
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_dir ⇒ Object
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_url ⇒ Object
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
|
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_objs ⇒ Object
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
|
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
|
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
202
203
204
|
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 202
def bintest_enabled?
@enable_bintest
end
|
#build_mrbc_exec ⇒ Object
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_mrbtest ⇒ Object
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_only ⇒ Object
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
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, <<EOS
#define __STDC_CONSTANT_MACROS
#define __STDC_LIMIT_MACROS
#ifndef MRB_ENABLE_CXX_ABI
extern "C" {
#endif
#include "#{File.absolute_path src}"
#ifndef MRB_ENABLE_CXX_ABI
}
#endif
EOS
end
file obj => cxx_src do |t|
cxx.run t.name, t.prerequisites.first, [], ["#{MRUBY_ROOT}/src"] + includes
end
obj
end
|
#compilers ⇒ Object
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
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
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
105
106
107
|
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 105
def debug_enabled?
@enable_debug
end
|
#define_rules ⇒ Object
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_exception ⇒ Object
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_lock ⇒ Object
121
122
123
|
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 121
def disable_lock
@enable_lock = false
end
|
#enable_cxx_abi ⇒ Object
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_exception ⇒ Object
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_debug ⇒ Object
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
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_static ⇒ Object
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_static ⇒ Object
351
352
353
|
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 351
def libmruby_static
libfile("#{build_dir}/lib/libmruby")
end
|
#libraries ⇒ Object
359
360
361
|
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 359
def libraries
[libmruby_static]
end
|
#lock_enabled? ⇒ Boolean
125
126
127
|
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 125
def lock_enabled?
Lockfile.enabled? && @enable_lock
end
|
242
243
244
|
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 242
def locks
Lockfile.build(@name)
end
|
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
|
218
219
220
|
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 218
def primary_toolchain
@toolchains.first
end
|
#print_build_summary ⇒ Object
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
|
222
223
224
|
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 222
def root
MRUBY_ROOT
end
|
#run_bintest ⇒ Object
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
|
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
230
231
232
|
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 230
def test_enabled?
@enable_test
end
|
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_flag ⇒ Object
314
315
316
|
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 314
def verbose_flag
Rake.verbose ? ' -v' : ''
end
|