Class: ESRuby::Build
- Inherits:
-
Object
- Object
- ESRuby::Build
- Extended by:
- Forwardable
- Defined in:
- lib/esruby/build.rb,
lib/esruby/build/configuration.rb
Defined Under Namespace
Classes: Configuration
Class Attribute Summary collapse
-
.build ⇒ Object
readonly
Returns the value of attribute build.
Class Method Summary collapse
Instance Method Summary collapse
- #appended_js_sources ⇒ Object
- #build ⇒ Object
- #build_app ⇒ Object
- #build_mruby ⇒ Object
- #build_mruby_config ⇒ Object
- #closure_argument ⇒ Object
- #cxx_include_argument ⇒ Object
- #debug_argument ⇒ Object
- #flags ⇒ Object
- #gem_directory ⇒ Object
- #gem_paths ⇒ Object
- #gem_paths_file ⇒ Object
-
#initialize(&block) ⇒ Build
constructor
A new instance of Build.
- #load_gems ⇒ Object
- #optimization_argument ⇒ Object
- #prepended_js_sources ⇒ Object
- #ruby_sources ⇒ Object
Constructor Details
#initialize(&block) ⇒ Build
Returns a new instance of Build.
19 20 21 22 |
# File 'lib/esruby/build.rb', line 19 def initialize(&block) @configuration = Configuration.new @configuration.instance_eval(&block) end |
Class Attribute Details
.build ⇒ Object (readonly)
Returns the value of attribute build.
6 7 8 |
# File 'lib/esruby/build.rb', line 6 def build @build end |
Class Method Details
.new(*args) ⇒ Object
9 10 11 12 13 14 |
# File 'lib/esruby/build.rb', line 9 def self.new(*args) raise 'can only build one project at a time' if @build new_build = super @build = new_build new_build end |
Instance Method Details
#appended_js_sources ⇒ Object
69 70 71 72 73 74 75 76 |
# File 'lib/esruby/build.rb', line 69 def appended_js_sources js_files = [] Gem::Specification.specifications.each do |specification| js_files += specification.appended_js_sources end js_files += @configuration.appended_js_sources js_files end |
#build ⇒ Object
24 25 26 27 28 29 30 |
# File 'lib/esruby/build.rb', line 24 def build FileUtils.mkdir_p(build_directory) build_mruby_config build_mruby load_gems build_app end |
#build_app ⇒ Object
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
# File 'lib/esruby/build.rb', line 138 def build_app mrbc = "#{build_directory}/host/bin/mrbc" js_arguments = prepended_js_sources.map { |path| "--pre-js #{path}" }.join(" ") js_arguments += " " js_arguments += appended_js_sources.map { |path| "--post-js #{path}" }.join(" ") RakeFileUtils.sh "#{mrbc} -B app -o #{build_directory}/app.c #{ruby_sources.join(" ")}" RakeFileUtils.sh "emcc --bind #{cxx_include_argument} #{build_directory}/app.c -o #{build_directory}/app.o #{build_directory}/emscripten/lib/libmruby.a -lm #{js_arguments} #{optimization_argument} #{closure_argument} #{debug_argument} #{flags} -s ALLOW_MEMORY_GROWTH=1" RakeFileUtils.sh "emcc -std=c++11 --bind #{cxx_include_argument} #{gem_directory}/resources/cpp/main.cpp -o #{build_directory}/main.o #{build_directory}/emscripten/lib/libmruby.a -lm #{js_arguments} #{optimization_argument} #{closure_argument} #{debug_argument} #{flags} -s ALLOW_MEMORY_GROWTH=1" RakeFileUtils.sh "emcc --bind #{cxx_include_argument} -o #{build_directory}/output.js #{build_directory}/app.o #{build_directory}/main.o #{build_directory}/emscripten/lib/libmruby.a -lm #{js_arguments} #{optimization_argument} #{closure_argument} #{debug_argument} #{flags} -s ALLOW_MEMORY_GROWTH=1 -s WASM=0 -s DISABLE_EXCEPTION_CATCHING=0" #if build.build_mode == 'production' # ENV["EMCC_CLOSURE_ARGS"] = "--language_in=ECMASCRIPT6" #possibly allow setting output: --language_out=ECMASCRIPT6 # sh "java -jar #{PROJECT_DIRECTORY}/emsdk/emscripten/incoming/third_party/closure-compiler/compiler.jar --js #{build.absolute_build_directory}/output.js --js_output_file #{build.absolute_output}" #else FileUtils.cp("#{build_directory}/output.js", "#{output}") #end #--language_in=ECMASCRIPT6 end |
#build_mruby ⇒ Object
132 133 134 135 136 |
# File 'lib/esruby/build.rb', line 132 def build_mruby Dir.chdir(mruby_directory) do RakeFileUtils.sh "rake" end end |
#build_mruby_config ⇒ Object
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'lib/esruby/build.rb', line 86 def build_mruby_config template = File.read("#{gem_directory}/resources/build_config.eruby") eruby = Erubis::Eruby.new(template) config = {} config[:optimization_argument] = optimization_argument config[:closure_argument] = closure_argument config[:debug_argument] = debug_argument config[:build_directory] = build_directory config[:project_directory] = project_directory config[:gems] = gems config[:gem_paths_file] = gem_paths_file config[:flags] = @configuration.flags new_output = eruby.result(config) output_path = "#{build_directory}/build_config.rb" old_output = File.read(output_path) if File.exists?(output_path) File.write(output_path, new_output) if (old_output != new_output) # only write if updated ENV["MRUBY_CONFIG"] = output_path # used by the mruby build process end |
#closure_argument ⇒ Object
127 128 129 130 |
# File 'lib/esruby/build.rb', line 127 def closure_argument #"--closure 0" "" end |
#cxx_include_argument ⇒ Object
52 53 54 55 56 57 58 |
# File 'lib/esruby/build.rb', line 52 def cxx_include_argument paths = [] paths << "#{mruby_directory}/include" paths += gem_paths.map { |gem_path| "#{gem_path}/include" } arguments = paths.map { |path| "-I #{path}" } argument = arguments.join(" ") end |
#debug_argument ⇒ Object
116 117 118 119 120 121 122 123 124 125 |
# File 'lib/esruby/build.rb', line 116 def debug_argument case build_mode when 'production' "-g0" when 'development' "" else raise end end |
#flags ⇒ Object
82 83 84 |
# File 'lib/esruby/build.rb', line 82 def flags @configuration.flags.join(" ") end |
#gem_directory ⇒ Object
32 33 34 |
# File 'lib/esruby/build.rb', line 32 def gem_directory ESRuby.gem_directory end |
#gem_paths ⇒ Object
44 45 46 |
# File 'lib/esruby/build.rb', line 44 def gem_paths JSON.parse(File.read(gem_paths_file)) end |
#gem_paths_file ⇒ Object
48 49 50 |
# File 'lib/esruby/build.rb', line 48 def gem_paths_file "#{build_directory}/gem_paths.json" end |
#load_gems ⇒ Object
36 37 38 39 40 41 42 |
# File 'lib/esruby/build.rb', line 36 def load_gems gem_paths.each do |gem_path| esruby_spec_path = "#{gem_path}/esruby_gem" load(esruby_spec_path) if File.file?(esruby_spec_path) end nil end |
#optimization_argument ⇒ Object
105 106 107 108 109 110 111 112 113 114 |
# File 'lib/esruby/build.rb', line 105 def optimization_argument case build_mode when 'production' "-O2" when 'development' "-O0" else raise end end |
#prepended_js_sources ⇒ Object
60 61 62 63 64 65 66 67 |
# File 'lib/esruby/build.rb', line 60 def prepended_js_sources js_files = [] Gem::Specification.specifications.each do |specification| js_files += specification.prepended_js_sources end js_files += @configuration.prepended_js_sources js_files end |
#ruby_sources ⇒ Object
78 79 80 |
# File 'lib/esruby/build.rb', line 78 def ruby_sources @configuration.ruby_sources end |