Class: ESRuby::Build

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/esruby/build.rb,
lib/esruby/build/configuration.rb

Defined Under Namespace

Classes: Configuration

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

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

.buildObject (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_sourcesObject



58
59
60
61
62
63
64
65
# File 'lib/esruby/build.rb', line 58

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

#buildObject



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_appObject



122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/esruby/build.rb', line 122

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 -I #{mruby_directory}/include #{build_directory}/app.c -o #{build_directory}/app.o #{build_directory}/emscripten/lib/libmruby.a -lm #{js_arguments} #{optimization_argument} #{closure_argument} #{debug_argument}"
  RakeFileUtils.sh "emcc -std=c++11 --bind -I #{mruby_directory}/include #{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}"
  RakeFileUtils.sh "emcc --bind -I #{mruby_directory}/include -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}"
  #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_mrubyObject



116
117
118
119
120
# File 'lib/esruby/build.rb', line 116

def build_mruby
  Dir.chdir(mruby_directory) do
    RakeFileUtils.sh "rake"
  end
end

#build_mruby_configObject



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/esruby/build.rb', line 71

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
  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_argumentObject



111
112
113
114
# File 'lib/esruby/build.rb', line 111

def closure_argument
  #"--closure 0"
  ""
end

#debug_argumentObject



100
101
102
103
104
105
106
107
108
109
# File 'lib/esruby/build.rb', line 100

def debug_argument
  case build_mode
  when 'production'
    "-g0"
  when 'development'
    ""
  else
    raise
  end
end

#gem_directoryObject



32
33
34
# File 'lib/esruby/build.rb', line 32

def gem_directory
  ESRuby.gem_directory
end

#gem_paths_fileObject



45
46
47
# File 'lib/esruby/build.rb', line 45

def gem_paths_file
  "#{build_directory}/gem_paths.json"
end

#load_gemsObject



36
37
38
39
40
41
42
43
# File 'lib/esruby/build.rb', line 36

def load_gems
  gem_paths = JSON.parse(File.read(gem_paths_file))
  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_argumentObject



89
90
91
92
93
94
95
96
97
98
# File 'lib/esruby/build.rb', line 89

def optimization_argument
  case build_mode
  when 'production'
    "-O2"
  when 'development'
    "-O0"
  else
    raise
  end
end

#prepended_js_sourcesObject



49
50
51
52
53
54
55
56
# File 'lib/esruby/build.rb', line 49

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_sourcesObject



67
68
69
# File 'lib/esruby/build.rb', line 67

def ruby_sources
  @configuration.ruby_sources + ["#{gem_directory}/resources/rb/append.rb"]
end