~ubuntu-branches/ubuntu/quantal/ruby1.9.1/quantal

« back to all changes in this revision

Viewing changes to tool/update-deps

  • Committer: Bazaar Package Importer
  • Author(s): Lucas Nussbaum
  • Date: 2011-09-24 19:16:17 UTC
  • mfrom: (1.1.8 upstream) (13.1.7 experimental)
  • Revision ID: james.westby@ubuntu.com-20110924191617-o1qz4rcmqjot8zuy
Tags: 1.9.3~rc1-1
* New upstream release: 1.9.3 RC1.
  + Includes load.c fixes. Closes: #639959.
* Upload to unstable.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/ruby
 
2
 
 
3
# tool/update-deps assists you to update dependencies in common.mk.
 
4
 
 
5
# This script uses preprocessed source files (*.i) to extract
 
6
# dependencies.
 
7
# It is possible to generate *.i using gcc with -save-temps option as:
 
8
#
 
9
#   ./configure CFLAGS='-save-temps'
 
10
#   make all golf
 
11
#
 
12
# After that, tool/update-deps generate common.mk with up-to-date dependencies.
 
13
# Currently, the result is not perfect around version.o, compile.o, etc.
 
14
# So you must see each changes and incorporate right changes.
 
15
#
 
16
#   ./tool/update-deps > z
 
17
#   wdiff =(sed -e 's/\\$//' common.mk ) =(sed -e 's/\\$//' z) |less -j 5 -p '\{\+|\+\}|\[-|-\]'
 
18
#   vi common.mk
 
19
 
 
20
src = File.read("common.mk")
 
21
 
 
22
includes_macro = {}
 
23
src.scan(/^([A-Z_]+_H_INCLUDES)[ \t]*=(([^\\\n]|\\(.|\n))*)\n/) {
 
24
  name = $1
 
25
  vals = $2
 
26
  #STDERR.puts vals.inspect
 
27
  vals.gsub!(/\\\n/, ' ')
 
28
  vals.gsub!(/\{\$\(VPATH\)\}/, '')
 
29
  vals.gsub!(/thread_\$\(THREAD_MODEL\)/, 'thread_pthread')
 
30
  vals = vals.strip.split(/\s+/)
 
31
  includes_macro[name] = vals
 
32
  #STDERR.puts  [name, vals].inspect
 
33
}
 
34
 
 
35
begin
 
36
  again = false
 
37
  includes_macro.each  {|name, vals|
 
38
    vals.map! {|val|
 
39
      if /\A\$\((.*_H_INCLUDES)\)\z/ =~ val
 
40
        again = true
 
41
        includes_macro.fetch($1)
 
42
      else
 
43
        val
 
44
      end
 
45
    }
 
46
    vals.flatten!
 
47
  }
 
48
end while again
 
49
 
 
50
src.gsub!(/^([0-9a-z._]+)\.\$\(OBJEXT\):(.*\n(?:[       ].*\n)*)/) {
 
51
  #STDERR.puts  $&.inspect
 
52
  matched = $&
 
53
  basename = $1
 
54
  deps = $2
 
55
  dd = deps.dup
 
56
  dd.gsub!(/\{\$\(VPATH\)\}/, '')
 
57
  dd.gsub!(/\\\n/, ' ')
 
58
  dd.gsub!(/thread_\$\(THREAD_MODEL\)/, 'thread_pthread')
 
59
  used_imacro = {}
 
60
  includes_macro.each {|k, v|
 
61
    if dd.sub!(/\$\(#{Regexp.escape k}\)/) { v.join(' ') }
 
62
      used_imacro[k] = true
 
63
    end
 
64
  }
 
65
  dd = dd.strip.split(/\s+/)
 
66
  if !File.file?("#{basename}.o")
 
67
    warn "#{basename}.o not found."
 
68
  else
 
69
    unless File.file? "#{basename}.i"
 
70
      puts "#{basename}.i not found."
 
71
      next
 
72
    end
 
73
    incs = []
 
74
    File.foreach("#{basename}.i") {|line|
 
75
      next unless /^# \d+ "([^"]*)"/ =~ line
 
76
      inc = $1
 
77
      next if %r{\A[/<]} =~ inc
 
78
      inc.sub!(%r{\A\./}, '')
 
79
      inc.sub!(%r{\Ainclude/ruby/}, '') or
 
80
      inc.sub!(%r{\Ainclude/}, '') or
 
81
      inc.sub!(%r{\A\.ext/include/[^/]+/ruby/}, '') or
 
82
      inc.sub!(%r{\Aenc/}, '') or
 
83
      inc.sub!(%r{\Amissing/}, '')
 
84
      #p inc
 
85
      incs << inc
 
86
    }
 
87
    incs.uniq!
 
88
    incs = incs.sort_by {|inc| [(dd.index(inc) || dd.length), incs.index(inc)] }
 
89
    add = incs - dd
 
90
    if !add.empty? || true
 
91
      if incs[0] != dd[0]
 
92
        raise "first file not matched: #{incs[0].inspect} v.s. #{dd[0].inspect}"
 
93
      end
 
94
      depline = "#{basename}.$(OBJEXT):"
 
95
      used_imacro.each_key {|k|
 
96
        if includes_macro[k].all? {|v| incs.include? v }
 
97
          im = "$(#{k})"
 
98
          incs.map! {|inc|
 
99
            if includes_macro[k].include? inc
 
100
              im0 = im
 
101
              im = nil
 
102
              im0
 
103
            else
 
104
              inc
 
105
            end
 
106
          }
 
107
          incs.compact!
 
108
        else
 
109
          needless = includes_macro[k].reject {|v| incs.include? v }
 
110
          STDERR.puts "#{basename}.$(OBJEXT) can't use #{k}. #{needless.join(' ')} is not used."
 
111
        end
 
112
      }
 
113
 
 
114
      incs.each {|inc|
 
115
        inc = inc.sub(/\Athread_pthread/, 'thread_$(THREAD_MODEL)')
 
116
        if /_INCLUDES\)\z/ =~ inc
 
117
          # use $(RUBY_H_INCLUDES) as is.
 
118
        elsif inc == 'revision.h'
 
119
          inc = '$(srcdir)/revision.h'
 
120
        else
 
121
          inc = "{$(VPATH)}#{inc}"
 
122
        end
 
123
        depline << " #{inc}"
 
124
      }
 
125
      lines = []
 
126
      while 72 < depline.length && depline.sub!(/\A(.{0,72}|.{72}.*?) /, '')
 
127
        lines << $&
 
128
      end
 
129
      lines << depline
 
130
      matched = lines.join("\\\n  ")
 
131
      matched << "\n"
 
132
    end
 
133
  end
 
134
  #STDERR.puts  matched.inspect
 
135
  matched
 
136
}
 
137
 
 
138
puts src
 
139