summaryrefslogtreecommitdiff
path: root/enc/make_encmake.rb
blob: 291774e60c59e8bce4bac1ace6ac18b8248b62cc (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
#! ./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