| Class | GNUMakefileParser |
| In: |
gnumakefileparser.rb
|
| Parent: | Object |
| Authors: | Yasuhiro MORIKAWA |
| Version: | $Id: gnumakefileparser.rb,v 1.1.1.1 2008-09-23 09:56:36 morikawa Exp $ |
| Tag Name: | $Name: gtool5-20081005 $ |
| Copyright: | Copyright (C) GFD Dennou Club, 2007-. All rights reserved. |
| License: | See COPYRIGHT |
GNU Make 用 Makefile の解析スクリプト
引数 file には Makefile 名または組み込み変数 STDIN を与えます. Makefile を読み込めない場合にはエラーを返します. 空文字を与えると, 空の Makefile を与えることと同様になります. 複数の Makefile を開く場合には, ファイル名を ’,’ で区切って 与えます.
Makefile から読み込まれた内容は解析され, 個々をオブジェクトに変換 されて @list に格納されます. GNUMake の全ての要素が解析 されるわけでないので注意してください.
# File gnumakefileparser.rb, line 33
33: def initialize(file=nil)
34: @file = file
35: @body = ''
36: if @file.class == String
37: if !@file.empty?
38: files = @file.split(/,/)
39: files.each{ |fi|
40: @body << File.open(fi, 'r') {|f| f.read}
41: @body << "\n"
42: }
43: end
44: elsif @file == STDIN
45: @body = STDIN.read || ''
46: else
47: raise " argument \"file\" must be String or STDIN"
48: end
49: @list = []
50: @list += self.parse(@body)
51: end
# File gnumakefileparser.rb, line 61
61: def +(other)
62: newmk = self.dup
63: newmk.list = @list + other.list
64: return newmk
65: end
引数 body に与えられた文字列を Makefile 内の要素として解析し, GNUMakefileParser のオブジェクトに追加します.
# File gnumakefileparser.rb, line 57
57: def add(body)
58: @list += self.parse(body)
59: end
引数 body に与えられた文字列を Makefile 内の要素として解析し, 個々をオブジェクトに変換して配列として返します. GNUMake の全ての要素を解析 できるわけでないので注意してください.
# File gnumakefileparser.rb, line 77
77: def parse(body)
78: list = []
79: body.gsub!(/\s*\\\s*\n/, ' ')
80: unit = ''
81: kind = nil
82: body.split("\n").each{|line|
83: if line =~ /^\t/
84: unit = unit + "\n" + line
85: elsif line =~ /^\s*\#/
86: next
87: elsif line =~ /^\s*$/
88: next
89: else
90: if kind == :mktarget
91: list << MkTarget.new(unit)
92: kind = false
93: elsif kind == :mkvariable
94: list << MkVariable.new(unit)
95: kind = false
96: end
97: if line =~ /^\s*\w+\s*:?\??\=/
98: kind = :mkvariable
99: unit = line
100: elsif line =~ /^[\w\s\-\.\,\$\(\)\%]+:/
101: kind = :mktarget
102: unit = line
103: else
104: list << MkOther.new(line)
105: end
106: end
107: }
108: if kind == :mktarget
109: list << MkTarget.new(unit)
110: elsif kind == :mkvariable
111: list << MkVariable.new(unit)
112: end
113: return list
114: end
オブジェクトの内容を Makefile 用のテキストに変換.
# File gnumakefileparser.rb, line 119
119: def to_s(target=true, variable=true, other=true)
120: str = ''
121: @list.each{|obj|
122: if obj.class == GNUMakefileParser::MkTarget
123: next if !target
124: elsif obj.class == GNUMakefileParser::MkVariable
125: next if !variable
126: elsif obj.class == GNUMakefileParser::MkOther
127: next if !other
128: elsif !obj
129: next
130: end
131: str << obj.to_s
132: }
133: return str
134: end