Class | GNUMakefileParser |
In: |
gnumakefileparser.rb
|
Parent: | Object |
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 の解析スクリプト
body | [R] | |
file | [R] | |
list | [RW] |
引数 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