* io.c (rb_open_file): encoding in mode string was ignored if perm is
[ruby-svn.git] / mkconfig.rb
blob19e456c160657f17aae2a7a5bd4db0ac157b497e
1 #!./miniruby -s
3 # avoid warnings with -d.
4 $install_name ||= nil
5 $so_name ||= nil
7 srcdir = File.dirname(__FILE__)
8 $:.replace [srcdir+"/lib"] unless defined?(CROSS_COMPILING)
9 $:.unshift(".")
11 require "fileutils"
12 mkconfig = File.basename($0)
14 rbconfig_rb = ARGV[0] || 'rbconfig.rb'
15 unless File.directory?(dir = File.dirname(rbconfig_rb))
16   FileUtils.makedirs(dir, :verbose => true)
17 end
19 version = RUBY_VERSION
20 config = ""
21 def config.write(arg)
22   concat(arg.to_s)
23 end
24 $stdout = config
26 fast = {'prefix'=>TRUE, 'ruby_install_name'=>TRUE, 'INSTALL'=>TRUE, 'EXEEXT'=>TRUE}
27 print %[
28 # This file was created by #{mkconfig} when ruby was built.  Any
29 # changes made to this file will be lost the next time ruby is built.
31 module RbConfig
32   RUBY_VERSION == "#{version}" or
33     raise "ruby lib version (#{version}) doesn't match executable version (\#{RUBY_VERSION})"
37 v_fast = []
38 v_others = []
39 vars = {}
40 has_version = false
41 continued_name = nil
42 continued_line = nil
43 File.foreach "config.status" do |line|
44   next if /^#/ =~ line
45   name = nil
46   case line
47   when /^s([%,])@(\w+)@\1(?:\|\#_!!_\#\|)?(.*)\1/
48     name = $2
49     val = $3.gsub(/\\(?=,)/, '')
50   when /^S\["(\w+)"\]\s*=\s*"(.*)"\s*(\\)?$/
51     name = $1
52     val = $2
53     if $3
54       continued_line = []
55       continued_line << val
56       continued_name = name
57       next
58     end
59   when /^"(.+)"\s*(\\)?$/
60     if continued_line
61       continued_line <<  $1
62       unless $2
63         val = continued_line.join("")
64         name = continued_name
65         continued_line = nil
66       end
67     end
68   when /^(?:ac_given_)?INSTALL=(.*)/
69     v_fast << "  CONFIG[\"INSTALL\"] = " + $1 + "\n"
70   end
72   if name
73     next if /^(?:ac_.*|configure_input|(?:top_)?srcdir|\w+OBJS)$/ =~ name
74     next if /^\$\(ac_\w+\)$/ =~ val
75     next if /^\$\{ac_\w+\}$/ =~ val
76     next if /^\$ac_\w+$/ =~ val
77     next if $install_name and /^RUBY_INSTALL_NAME$/ =~ name
78     next if $so_name and /^RUBY_SO_NAME$/ =~  name
79     next if /^(?:X|(?:MINI|RUN)RUBY$)/ =~ name
80     if /^program_transform_name$/ =~ name and /^s(\\?.)(.*)\1$/ =~ val
81       next if $install_name
82       sep = %r"#{Regexp.quote($1)}"
83       ptn = $2.sub(/\$\$/, '$').split(sep, 2)
84       name = "ruby_install_name"
85       val = "ruby".sub(/#{ptn[0]}/, ptn[1])
86     end
87     val.gsub!(/ +(?!-)/, "=") if name == "configure_args" && /mswin32/ =~ RUBY_PLATFORM
88     val = val.gsub(/\$(?:\$|\{?(\w+)\}?)/) {$1 ? "$(#{$1})" : $&}.dump
89     if /^prefix$/ =~ name
90       val = "(TOPDIR || DESTDIR + #{val})"
91     end
92     v = "  CONFIG[\"#{name}\"] #{vars[name] ? '<< "\n"' : '='} #{val}\n"
93     vars[name] = true
94     if fast[name]
95       v_fast << v
96     else
97       v_others << v
98     end
99     has_version = true if name == "MAJOR"
100   end
101 #  break if /^CEOF/
104 drive = File::PATH_SEPARATOR == ';'
106 prefix = '/lib/ruby/' + RUBY_VERSION + '/' + RUBY_PLATFORM
107 print "  TOPDIR = File.dirname(__FILE__).chomp!(#{prefix.dump})\n"
108 print "  DESTDIR = ", (drive ? "TOPDIR && TOPDIR[/\\A[a-z]:/i] || " : ""), "'' unless defined? DESTDIR\n"
109 print "  CONFIG = {}\n"
110 print "  CONFIG[\"DESTDIR\"] = DESTDIR\n"
112 unless has_version
113   RUBY_VERSION.scan(/(\d+)\.(\d+)\.(\d+)/) {
114     print "  CONFIG[\"MAJOR\"] = \"" + $1 + "\"\n"
115     print "  CONFIG[\"MINOR\"] = \"" + $2 + "\"\n"
116     print "  CONFIG[\"TEENY\"] = \"" + $3 + "\"\n"
117   }
118   patchlevel = IO.foreach(File.join(srcdir, "version.h")) {|l|
119     m = /^\s*#\s*define\s+RUBY_PATCHLEVEL\s+(\d+)/.match(l) and break m[1]
120   }
121   print "  CONFIG[\"PATCHLEVEL\"] = \"#{patchlevel}\"\n"
124 dest = drive ? /= \"(?!\$[\(\{])(?:[a-z]:)?/i : /= \"(?!\$[\(\{])/
125 v_others.collect! do |x|
126   if /^\s*CONFIG\["(?!abs_|old)[a-z]+(?:_prefix|dir)"\]/ === x
127     x.sub(dest, '= "$(DESTDIR)')
128   else
129     x
130   end
133 if $install_name
134   v_fast << "  CONFIG[\"ruby_install_name\"] = \"" + $install_name + "\"\n"
135   v_fast << "  CONFIG[\"RUBY_INSTALL_NAME\"] = \"" + $install_name + "\"\n"
137 if $so_name
138   v_fast << "  CONFIG[\"RUBY_SO_NAME\"] = \"" + $so_name + "\"\n"
141 print(*v_fast)
142 print(*v_others)
143 print <<EOS
144   CONFIG["rubylibdir"] = "$(libdir)/ruby/$(ruby_version)"
145   CONFIG["archdir"] = "$(rubylibdir)/$(arch)"
146   CONFIG["sitelibdir"] = "$(sitedir)/$(ruby_version)"
147   CONFIG["sitearchdir"] = "$(sitelibdir)/$(sitearch)"
148   CONFIG["vendorlibdir"] = "$(vendordir)/$(ruby_version)"
149   CONFIG["vendorarchdir"] = "$(vendorlibdir)/$(sitearch)"
150   CONFIG["topdir"] = File.dirname(__FILE__)
151   MAKEFILE_CONFIG = {}
152   CONFIG.each{|k,v| MAKEFILE_CONFIG[k] = v.dup}
153   def RbConfig::expand(val, config = CONFIG)
154     val.gsub!(/\\$\\$|\\$\\(([^()]+)\\)|\\$\\{([^{}]+)\\}/) do
155       var = $&
156       if !(v = $1 || $2)
157         '$'
158       elsif key = config[v = v[/\\A[^:]+(?=(?::(.*?)=(.*))?\\z)/]]
159         pat, sub = $1, $2
160         config[v] = false
161         RbConfig::expand(key, config)
162         config[v] = key
163         key = key.gsub(/\#{Regexp.quote(pat)}(?=\\s|\\z)/n) {sub} if pat
164         key
165       else
166         var
167       end
168     end
169     val
170   end
171   CONFIG.each_value do |val|
172     RbConfig::expand(val)
173   end
175 Config = RbConfig # compatibility for ruby-1.8.4 and older.
176 CROSS_COMPILING = nil unless defined? CROSS_COMPILING
179 $stdout = STDOUT
180 mode = IO::RDWR|IO::CREAT
181 mode |= IO::BINARY if defined?(IO::BINARY)
182 open(rbconfig_rb, mode) do |f|
183   if $timestamp and f.stat.size == config.size and f.read == config
184     puts "#{rbconfig_rb} unchanged"
185   else
186     puts "#{rbconfig_rb} updated"
187     f.rewind
188     f.truncate(0)
189     f.print(config)
190   end
192 if String === $timestamp
193   FileUtils.touch($timestamp)
196 # vi:set sw=2: