Class: MRuby::Build
- Includes:
- LoadGems, Rake::DSL
- Defined in:
- ext/enterprise_script_service/mruby/lib/mruby/build.rb
Direct Known Subclasses
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
-
.current ⇒ Object
Returns the value of attribute current.
Instance Attribute Summary collapse
-
#bins ⇒ Object
Returns the value of attribute bins.
-
#build_dir ⇒ Object
Returns the value of attribute build_dir.
- #enable_bintest ⇒ Object
- #enable_test ⇒ Object
-
#exts ⇒ Object
Returns the value of attribute exts.
-
#file_separator ⇒ Object
Returns the value of attribute file_separator.
-
#gem_clone_dir ⇒ Object
Returns the value of attribute gem_clone_dir.
-
#gem_dir_to_repo_url ⇒ Object
readonly
Returns the value of attribute gem_dir_to_repo_url.
-
#gems ⇒ Object
readonly
Returns the value of attribute gems.
-
#libmruby_objs ⇒ Object
(also: #libmruby)
readonly
Returns the value of attribute libmruby_objs.
-
#name ⇒ Object
Returns the value of attribute name.
-
#toolchains ⇒ Object
readonly
Returns the value of attribute toolchains.
Instance Method Summary collapse
- #bintest_enabled? ⇒ Boolean
- #build_mrbc_exec ⇒ Object
- #build_mrbtest ⇒ Object
- #build_mrbtest_lib_only ⇒ Object
- #build_mrbtest_lib_only? ⇒ Boolean
- #compile_as_cxx(src, cxx_src, obj = nil, includes = []) ⇒ Object
- #compilers ⇒ Object
- #cxx_abi_enabled? ⇒ Boolean
- #cxx_exception_enabled? ⇒ Boolean
- #debug_enabled? ⇒ Boolean
- #define_rules ⇒ Object
- #disable_cxx_exception ⇒ Object
- #disable_lock ⇒ Object
- #enable_cxx_abi ⇒ Object
- #enable_cxx_exception ⇒ Object
- #enable_debug ⇒ Object
- #exefile(name) ⇒ Object
- #filename(name) ⇒ Object
-
#initialize(name = 'host', build_dir = nil, &block) ⇒ Build
constructor
A new instance of Build.
- #libfile(name) ⇒ Object
- #libmruby_core_static ⇒ Object
- #libmruby_static ⇒ Object
- #libraries ⇒ Object
- #lock_enabled? ⇒ Boolean
- #locks ⇒ Object
- #mrbcfile ⇒ Object
- #objfile(name) ⇒ Object
- #primary_toolchain ⇒ Object
- #print_build_summary ⇒ Object
- #root ⇒ Object
- #run_bintest ⇒ Object
- #run_test ⇒ Object
- #test_enabled? ⇒ Boolean
- #toolchain(name, params = {}) ⇒ Object
- #verbose_flag ⇒ Object
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
.current ⇒ Object
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
#bins ⇒ Object
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 |
#exts ⇒ Object
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 (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 |
#gems ⇒ Object (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_objs ⇒ Object (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 |
#name ⇒ Object
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 |
#toolchains ⇒ Object (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
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, "#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 |
#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.(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. += ' -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_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 |
#locks ⇒ Object
242 243 244 |
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 242 def locks Lockfile.build(@name) end |
#mrbcfile ⇒ Object
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_toolchain ⇒ Object
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 |
#root ⇒ Object
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 |
#run_test ⇒ Object
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 |
#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_flag ⇒ Object
314 315 316 |
# File 'ext/enterprise_script_service/mruby/lib/mruby/build.rb', line 314 def verbose_flag Rake.verbose ? ' -v' : '' end |