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
|
#! ./miniruby
dir = File.expand_path("../..", __FILE__)
$:.unshift(dir)
$:.unshift(".")
if $".grep(/mkmf/).empty?
$" << "mkmf.rb"
load File.expand_path("lib/mkmf.rb", dir)
end
require 'erb'
CONFIG["MAKEDIRS"] ||= '$(MINIRUBY) -run -e mkdir -- -p'
BUILTIN_ENCS = []
BUILTIN_TRANSES = []
ENC_PATTERNS = []
NOENC_PATTERNS = []
module_type = :dynamic
until ARGV.empty?
case ARGV[0]
when /\A--builtin-encs=/
BUILTIN_ENCS.concat $'.split.map {|e| File.basename(e, '.*') << '.c'}
ARGV.shift
when /\A--builtin-transes=/
BUILTIN_TRANSES.concat $'.split.map {|e| File.basename(e, '.*') }
ARGV.shift
when /\A--encs=/
ENC_PATTERNS.concat $'.split
ARGV.shift
when /\A--no-encs=/
NOENC_PATTERNS.concat $'.split
ARGV.shift
when /\A--module$/
ARGV.shift
when /\A--modulestatic$/
module_type = :static
ARGV.shift
else
break
end
end
ALPHANUMERIC_ORDER = proc {|e| e.scan(/(\d+)|(\D+)/).map {|n,a| a||[n.size,n.to_i]}.flatten}
def target_encodings
encs = Dir.open($srcdir) {|d| d.grep(/.+\.c\z/)} - BUILTIN_ENCS - ["mktable.c"]
encs.each {|e| e.chomp!(".c")}
encs.reject! {|e| !ENC_PATTERNS.any? {|p| File.fnmatch?(p, e)}} if !ENC_PATTERNS.empty?
encs.reject! {|e| NOENC_PATTERNS.any? {|p| File.fnmatch?(p, e)}}
encs = encs.sort_by(&ALPHANUMERIC_ORDER)
encs.unshift(encs.delete("encdb"))
return encs
end
def target_transcoders
atrans = []
trans = Dir.open($srcdir+"/trans") {|d|
d.select {|e|
if e.chomp!('.trans')
atrans << e
true
elsif e.chomp!('.c')
true
end
}
}
trans -= BUILTIN_TRANSES
atrans -= BUILTIN_TRANSES
trans.uniq!
atrans = atrans.sort_by(&ALPHANUMERIC_ORDER)
trans = trans.sort_by(&ALPHANUMERIC_ORDER)
trans.unshift(trans.delete("transdb"))
trans.compact!
trans |= atrans
trans.map! {|e| "trans/#{e}"}
return atrans, trans
end
# Constants that "depend" needs.
MODULE_TYPE = module_type
ENCS = target_encodings
ATRANS, TRANS = target_transcoders
if File.exist?(depend = File.join($srcdir, "depend"))
erb = ERB.new(File.read(depend), nil, '%')
erb.filename = depend
tmp = erb.result(binding)
dep = "\n#### depend ####\n\n" << depend_rules(tmp).join
else
dep = ""
end
mkin = File.read(File.join($srcdir, "Makefile.in"))
mkin.gsub!(/@(#{CONFIG.keys.join('|')})@/) {CONFIG[$1]}
open(ARGV[0], 'wb') {|f|
f.puts mkin, dep
}
if MODULE_TYPE == :static
erb = ERB.new(File.read(File.join($srcdir, "encinit.c.erb")), nil, '%-')
erb.filename = "enc/encinit.c.cerb"
tmp = erb.result(binding)
begin
Dir.mkdir 'enc'
rescue Errno::EEXIST
end
File.open("enc/encinit.c", "w") {|f|
f.puts "/* Automatically generated from enc/encinit.c.erb"
f.puts " * Do not edit."
f.puts " */"
f.puts tmp
}
end
|