summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/build_tasks.rb
blob: 4f0d1175f0b90c190d858afe277e1d46d19ff7ae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
MRBGEMS_PATH = File.dirname(__FILE__)

GEM_INIT = "#{MRBGEMS_PATH}/gem_init"
GEM_MAKEFILE = "#{MRBGEMS_PATH}/g/Makefile"
GEM_MAKEFILE_LIST = "#{MRBGEMS_PATH}/g/MakefileGemList"
MAKEFILE_4_GEM = "#{MRUBY_ROOT}/mrbgems/Makefile4gem"

def gem_make_flags
  if ENV['OS'] == 'Windows_NT'
    "#{MAKE_FLAGS rescue ''} MAKEFILE_4_GEM=\"#{MAKEFILE_4_GEM}\""
  else
    "#{MAKE_FLAGS rescue ''} MAKEFILE_4_GEM='#{MAKEFILE_4_GEM}'"
  end
end

task :mrbgems_all => ["#{GEM_INIT}.a", :mrbgems_generate_gem_makefile_list] do
  for_each_gem do |path, gemname|
    sh "#{MAKE} -C #{path} #{gem_make_flags}"
  end
end

task :load_mrbgems_flags do
  for_each_gem do |path, gemname|
    sh "#{MAKE} gem-flags -C #{path} #{gem_make_flags}"
    CFLAGS << File.read("#{path}/gem-cflags.tmp").chomp
    LDFLAGS << File.read("#{path}/gem-ldflags.tmp").chomp
  end
end

task :mrbgems_clean do
  sh "cd #{MRUBY_ROOT}/mrbgems && #{RM_F} *.c *.d *.a *.o"
  sh "cd #{MRUBY_ROOT}/mrbgems/g && #{RM_F} *.c *.d *.rbtmp *.ctmp *.o mrbtest"
  for_each_gem do |path, gemname|
    sh "#{MAKE} gem-clean -C #{path} #{gem_make_flags}"
  end
end

task :mrbgems_prepare_test do
  for_each_gem do |path, gemname, escaped_gemname|
    sh "#{MAKE} gem-test -C #{path} #{gem_make_flags}"
  end
  open("#{MRUBY_ROOT}/mrbgems/g/mrbgemtest.ctmp", 'w') do |f|
    for_each_gem do |path, gemname, escaped_gemname|
      f.puts "void mrb_#{escaped_gemname}_gem_test_init(mrb_state *mrb);"
      f.puts "extern const char gem_mrblib_irep_#{escaped_gemname}_test[];"
    end
    f.puts "void mrbgemtest_init(mrb_state* mrb) {"
    for_each_gem do |path, gemname, escaped_gemname|
      f.puts "mrb_#{escaped_gemname}_gem_test_init(mrb);"
    end
    for_each_gem do |path, gemname, escaped_gemname|
      f.puts "mrb_load_irep(mrb, gem_mrblib_irep_#{escaped_gemname}_test);"
    end
    f.puts "}"

  end
  sh "#{CAT} #{for_each_gem{|path, gemname| "#{path}/gem_test.ctmp "}} >> #{MRUBY_ROOT}/mrbgems/g/mrbgemtest.ctmp"
end

file "#{GEM_INIT}.a" => ["#{GEM_INIT}.c", "#{GEM_INIT}.o"] do |t|
  sh "#{AR} rs #{t.name} #{GEM_INIT}.o"
end

rule ".o" => [".c"] do |t|
  puts "Build the driver which initializes all gems"
  sh "#{CC} #{CFLAGS.join(' ')} -I#{MRUBY_ROOT}/include -MMD -c #{t.source} -o #{t.name}"
end

file "#{GEM_INIT}.c" do |t|
  puts "Generate Gem driver: #{t.name}"
  open(t.name, 'w') do |f|
    f.puts <<__EOF__
/*
 * This file contains a list of all
 * initializing methods which are
 * necessary to bootstrap all gems.
 *
 * IMPORTANT:
 *   This file was generated!
 *   All manual changes will get lost.
 */

#include "mruby.h"

#{for_each_gem{|path, gemname, escaped_gemname| "void GENERATED_TMP_mrb_%s_gem_init(mrb_state*);" % [escaped_gemname]}}

void
mrb_init_mrbgems(mrb_state *mrb) {
#{for_each_gem{|path, gemname, escaped_gemname| "  GENERATED_TMP_mrb_%s_gem_init(mrb);" % [escaped_gemname]}}
}
__EOF__
  end
end

def for_each_gem(&block)
  IO.readlines(ACTIVE_GEMS).map { |line|
    path = line.chomp
    if not File.exist?(path)
      path2 = File.join MRUBY_ROOT, 'mrbgems', 'g', path
      path = path2 if File.exist? path2
    end
    gemname = File.basename(path)
    escaped_gemname = gemname.gsub(/-/, '_')
    block.call(path, gemname, escaped_gemname)
  }.join('')
end

task :mrbgems_generate_gem_makefile_list do
  open(GEM_MAKEFILE_LIST, 'w') do |f|
    f.puts <<__EOF__
GEM_LIST := #{for_each_gem{|path, gemname| "#{path}/mrb-#{gemname}-gem.a "}}

GEM_ARCHIVE_FILES := #{MRUBY_ROOT}/mrbgems/gem_init.a
GEM_ARCHIVE_FILES += $(GEM_LIST)

GEM_INCLUDE_LIST := #{for_each_gem{|path, gemname| "-I#{path}/include "}}
__EOF__
  end
end