Class GNUMakefileParser
In: gnumakefileparser.rb
Parent: Object

GNU Make の Makefile パーサ

Authors:Yasuhiro MORIKAWA
Version:$Id: gnumakefileparser.rb,v 1.2 2007/03/05 15:22:55 morikawa Exp $
Tag Name:$Name: gt4f90io-20070628 $
Copyright:Copyright (C) GFD Dennou Club, 2007-. All rights reserved.
License:See COPYRIGHT

GNU Make 用 Makefile の解析スクリプト

Methods

+   add   new   parse   to_s  

Classes and Modules

Class GNUMakefileParser::MkOther
Class GNUMakefileParser::MkTarget
Class GNUMakefileParser::MkVariable

Attributes

body  [R] 
file  [R] 
list  [RW] 

Public Class methods

引数 file には Makefile 名または組み込み変数 STDIN を与えます. Makefile を読み込めない場合にはエラーを返します. 空文字を与えると, 空の Makefile を与えることと同様になります. 複数の Makefile を開く場合には, ファイル名を ’,’ で区切って 与えます.

Makefile から読み込まれた内容は解析され, 個々をオブジェクトに変換 されて @list に格納されます. GNUMake の全ての要素が解析 されるわけでないので注意してください.

[Source]

    # 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

Public Instance methods

[Source]

    # 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 のオブジェクトに追加します.

[Source]

    # File gnumakefileparser.rb, line 57
57:   def add(body)
58:     @list += self.parse(body)
59:   end

引数 body に与えられた文字列を Makefile 内の要素として解析し, 個々をオブジェクトに変換して配列として返します. GNUMake の全ての要素を解析 できるわけでないので注意してください.

[Source]

     # 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 用のテキストに変換.

[Source]

     # 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

[Validate]