source: asp3_wo_tecs/trunk/cfg/cfg.rb@ 304

Last change on this file since 304 was 304, checked in by ertl-honda, 7 years ago

コンフィギュレータをruby版に変更

File size: 14.3 KB
Line 
1#!/usr/bin/env ruby
2# -*- coding: utf-8 -*-
3#
4# TOPPERS Configurator by Ruby
5#
6# Copyright (C) 2015 by FUJI SOFT INCORPORATED, JAPAN
7# Copyright (C) 2015,2016 by Embedded and Real-Time Systems Laboratory
8# Graduate School of Information Science, Nagoya Univ., JAPAN
9#
10# 上記著作権者
11は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
12# ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13# 変・再é…
14å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
15# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17# スコード中に含まれていること.
18# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19# 用できる形で再é…
20å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
21å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
22# 者
23マニュアルなど)に,上記の著作権表示,この利用条件および下記
24# の無保証規定を掲載すること.
25# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
26# 用できない形で再é…
27å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
28# と.
29# (a) 再é…
30å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
31マニュアルなど)に,上記の著
32# 作権表示,この利用条件および下記の無保証規定を掲載すること.
33# (b) 再é…
34å¸ƒã®å½¢æ…
35‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
36# 報告すること.
37# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
38# 害からも,上記著作権者
39およびTOPPERSプロジェクトをå…
40è²¬ã™ã‚‹ã“と.
41# また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
42# 由に基づく請求からも,上記著作権者
43およびTOPPERSプロジェクトを
44# å…
45è²¬ã™ã‚‹ã“と.
46#
47# 本ソフトウェアは,無保証で提供されているものである.上記著作権者
48お
49# よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
50# に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
51# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
52# の責任を負わない.
53#
54# $Id: cfg.rb 32 2016-01-31 14:45:59Z ertl-hiro $
55#
56
57if ($0 == __FILE__)
58 TOOL_ROOT = File.expand_path(File.dirname(__FILE__)) + "/"
59 $LOAD_PATH.unshift(TOOL_ROOT)
60end
61
62require "pp"
63require "csv"
64require "optparse"
65require "pstore"
66require "common/GenFile.rb"
67require "common/StrVal.rb"
68require "common/SRecord.rb"
69
70#
71# 定数定義
72#
73# å…
74±é€š
75VERSION = "1.0.0"
76
77# cfg1_out関係
78CFG1_PREFIX = "TOPPERS_cfg_"
79CFG1_MAGIC_NUM = "TOPPERS_magic_number"
80CFG1_SIZEOF_SIGNED = "TOPPERS_sizeof_signed_t"
81CFG1_OUT_C = "cfg1_out.c"
82CFG1_OUT_DB = "cfg1_out.db"
83CFG1_OUT_SREC = "cfg1_out.srec"
84CFG1_OUT_SYMS = "cfg1_out.syms"
85CFG1_OUT_TIMESTAMP = "cfg1_out.timestamp"
86
87# cfg2_out関係
88CFG2_OUT_DB = "cfg2_out.db"
89
90#
91# エラー発生有無フラグ
92#
93$errorFlag = false
94
95#
96# エラー/警告表示関数
97#
98# 一般的なエラー表示(処理を中断)
99def error_exit(message, location = "")
100 location += " " if location != ""
101 abort("#{location}error: #{message}")
102end
103
104# 一般的なエラー表示(処理を継続)
105def error(message, location = "")
106 location += " " if location != ""
107 STDERR.puts("#{location}error: #{message}")
108 $errorFlag = true
109end
110
111# 一般的な警告表示
112def warning(message, location = "")
113 location += " " if location != ""
114 STDERR.puts("#{location}warning: #{message}")
115end
116
117# システムコンフィギュレーションファイルの構文解析時のエラー
118$no_parse_error = 0
119def parse_error(cfgFile, message)
120 error(message, "#{cfgFile.getFileName()}:#{cfgFile.getLineNo}:")
121 if ($no_parse_error += 1) >= 10
122 error_exit("too many errors emitted, stopping now")
123 end
124end
125
126# 静的API処理時のエラー
127def error_api(params, message)
128 error(message, "#{params[:_file_]}:#{params[:_line_]}:")
129end
130
131# 静的API処理時のエラー(エラーコード付き)
132def error_ercd(errorCode, params, message)
133 error_api(params, "#{errorCode}: #{message}")
134end
135
136# 静的API処理時の警告
137def warning_api(params, message)
138 warning(message, "#{params[:_file_]}:#{params[:_line_]}:")
139end
140
141# パラメータのエラー
142def error_wrong(errorCode, params, symbol, wrong)
143 error_ercd(errorCode, params, "#{symbol.to_s} `#{params[symbol]}'" \
144 " is #{wrong} in #{params[:apiname]}")
145end
146
147def error_wrong_id(errorCode, params, symbol, objid, wrong)
148 error_ercd(errorCode, params, "#{symbol.to_s} `#{params[symbol]}'" \
149 " is #{wrong} in #{params[:apiname]} of #{params[objid]}")
150end
151
152def error_wrong_sym(errorCode, params, symbol, symbol2, wrong)
153 error_ercd(errorCode, params, "#{symbol.to_s} `#{params[symbol]}'" \
154 " is #{wrong} in #{params[:apiname]}" \
155 " of #{symbol2.to_s} `#{params[symbol2]}'")
156end
157
158# パラメータ不正のエラー
159def error_illegal(errorCode, params, symbol)
160 error_ercd(errorCode, params, "illegal #{symbol.to_s} `#{params[symbol]}'" \
161 " in #{params[:apiname]}")
162end
163
164def error_illegal_id(errorCode, params, symbol, objid)
165 error_ercd(errorCode, params, "illegal #{symbol.to_s} `#{params[symbol]}'" \
166 " in #{params[:apiname]} of #{params[objid]}")
167end
168
169def error_illegal_sym(errorCode, params, symbol, symbol2)
170 error_ercd(errorCode, params, "illegal #{symbol.to_s} `#{params[symbol]}'" \
171 " in #{params[:apiname]} of #{symbol2.to_s} `#{params[symbol2]}'")
172end
173
174#
175# Stringクラスの拡張(二重引用符で囲まれた文字列の作成/展開)
176#
177class String
178 #
179 # 二重引用符で囲まれた文字列の作成
180 #
181 def quote
182 result = ""
183 self.chars do |c|
184 case c
185 when "'"
186 result += "\\\'"
187 when "\""
188 result += "\\\""
189 when "\0"
190 result += "\\0"
191 when "\a"
192 result += "\\a"
193 when "\b"
194 result += "\\b"
195 when "\f"
196 result += "\\f"
197 when "\n"
198 result += "\\n"
199 when "\r"
200 result += "\\r"
201 when "\t"
202 result += "\\t"
203 when "\v"
204 result += "\\v"
205 when "\\"
206 result += "\\\\"
207 else
208 result += c
209 end
210 end
211 return("\"" + result + "\"")
212 end
213
214 #
215 # 二重引用符で囲まれた文字列の展開
216 #
217 def unquote
218 if /^\"(.*)\"$/m =~ self
219 str = $1
220 result = ""
221 while (/^(.*)\\(.*)$/m =~ str)
222 result += $1
223 str = $2
224 case str
225 when /^[aA](.*)$/m
226 result += "\a"
227 str = $1
228 when /^[bB](.*)$/m
229 result += "\b"
230 str = $1
231 when /^[fF](.*)$/m
232 result += "\f"
233 str = $1
234 when /^[nN](.*)$/m
235 result += "\n"
236 str = $1
237 when /^[rR](.*)$/m
238 result += "\r"
239 str = $1
240 when /^[tT](.*)$/m
241 result += "\t"
242 str = $1
243 when /^[vV](.*)$/m
244 result += "\v"
245 str = $1
246 when /^[xX]([0-9a-fA-F][0-9a-fA-F]?)(.*)$/m
247 result += $1.hex
248 str = $2
249 when /^([0-7][0-7]?[0-7]?)(.*)$/m
250 result += $1.oct
251 str = $2
252 when /^\\(.*)$/m
253 result += "\\"
254 str = $1
255 end
256 end
257 return(result + str)
258 else
259 return(self.dup)
260 end
261 end
262end
263
264#
265# シンボルファイルの読み込み
266#
267# 以下のメソッドは,GNUのnmが生成するシンボルファイルに対応している.
268# 別のツールに対応する場合には,このメソッドを書き換えればよい.
269#
270def ReadSymbolFile(symbolFileName)
271 begin
272 symbolFile = File.open(symbolFileName)
273 rescue Errno::ENOENT, Errno::EACCES => ex
274 abort(ex.message)
275 end
276
277 symbolAddress = {}
278 symbolFile.each do |line|
279 # スペース区切りで分解
280 fields = line.split(/\s+/)
281
282 # 3列になっていない行は除外
283 if (fields.size == 3)
284 symbolAddress[fields[2]] = fields[0].hex
285 end
286 end
287 symbolFile.close
288 return(symbolAddress)
289end
290
291#
292# 値取得シンボルをグローバル変数として定義する
293#
294def DefineSymbolValue
295 $symbolValueTable.each do |symbolName, symbolData|
296 if symbolData.has_key?(:VALUE)
297 eval("$#{symbolName} = " \
298 "StrVal.new(\"#{symbolName}\", #{symbolData[:VALUE]})")
299 end
300 end
301end
302
303#
304# インクルードパスからファイルを探す
305#
306def SearchFilePath(fileName)
307 if File.exist?(fileName)
308 # 指定したファイルパスに存在する
309 return fileName
310 elsif /^\./ =~ fileName
311 # 相対パスを指定していて見つからなかった場合,存在しないものとする
312 #(意図しないファイルが対象となることを防止)
313 return nil
314 else
315 # 各インクルードパスからファイル存在チェック
316 $includePaths.each do |includePath|
317 path = includePath + "/" + fileName
318 # 見つかったら相対パスを返す
319 if File.exist?(path)
320 return path
321 end
322 end
323 return nil
324 end
325end
326
327#
328# 指定した生成スクリプト(trbファイル)を検索してloadする
329#
330def IncludeTrb(fileName)
331 filePath = SearchFilePath(fileName)
332 if filePath.nil?
333 error_exit("`#{fileName}' not found")
334 else
335 load(filePath)
336 end
337end
338
339#
340# パス3の処理
341#
342def Pass3
343 #
344 # パス2から引き渡される情
345報をファイルから読み込む
346 #
347 db = PStore.new(CFG2_OUT_DB)
348 db.transaction(true) do
349 $apiDefinition = db[:apiDefinition]
350 $symbolValueTable = db[:symbolValueTable]
351 $cfgFileInfo = db[:cfgFileInfo]
352 $includeFiles = db[:includeFiles]
353 $cfgData = db[:cfgData]
354 $asmLabel = db[:asmLabel]
355 $bLittleEndian = db[:bLittleEndian]
356 end
357
358 #
359 # 値取得シンボルをグローバル変数として定義する
360 #
361 DefineSymbolValue()
362
363 #
364 # 生成スクリプト(trbファイル)を実行する
365 #
366 $trbFileNames.each do |trbFileName|
367 IncludeTrb(trbFileName)
368 end
369end
370
371#
372# 生成スクリプト(trbファイル)向けの関数
373#
374def SYMBOL(symbol)
375 if !$romSymbol.nil? && $romSymbol.has_key?($asmLabel + symbol)
376 return $romSymbol[$asmLabel + symbol]
377 else
378 return nil
379 end
380end
381
382def BCOPY(startIData, startData, size)
383 if !$romImage.nil?
384 copyData = $romImage.get_data(startIData, size)
385 $romImage.set_data(startData, copyData)
386 end
387end
388
389def PEEK(address, size)
390 if !$romImage.nil?
391 return $romImage.get_value(address, size, false)
392 else
393 return nil
394 end
395end
396
397#
398# グローバル変数の初期化
399#
400$kernel = nil
401$pass = nil
402$includePaths = []
403$trbFileNames = []
404$apiTableFileNames = []
405$symvalTableFileNames = []
406$romImageFileName = nil
407$romSymbolFileName = nil
408$dependencyFileName = nil
409$idInputFileName = nil
410$idOutputFileName = nil
411
412#
413# オプションの処理
414#
415opt = OptionParser.new(banner="Usage: cfg.rb [options] CONFIG-FILE", 40)
416opt.version = VERSION
417opt.on("-k KERNEL", "--kernel KERNEL", "kernel profile name") do |val|
418 $kernel = val
419end
420opt.on("-p NUM", "--pass NUM", "processing pass number") do |val|
421 $pass = val
422end
423opt.on("-I PATH", "--include-path PATH", "include directory path") do |val|
424 $includePaths.push(val)
425end
426opt.on("-T TRB-FILE", "--trb-file TRB-FILE",
427 "generation script (trb file)") do |val|
428 $trbFileNames.push(val)
429end
430opt.on("--api-table API-TABLE-FILE", "static API table file") do |val|
431 $apiTableFileNames.push(val)
432end
433opt.on("--symval-table SYMVAL-TABLE-FILE", "symbol-value table file") do |val|
434 $symvalTableFileNames.push(val)
435end
436opt.on("--rom-image SREC-FILE", "rom image file (s-record)") do |val|
437 $romImageFileName = val
438end
439opt.on("--rom-symbol SYMS-FILE", "rom symbol table file (nm)") do |val|
440 $romSymbolFileName = val
441end
442opt.on("--id-input-file ID-FILE", "ID input file") do |val|
443 $idInputFileName = val
444end
445opt.on("--id-output-file ID-FILE", "ID output file") do |val|
446 $idOutputFileName = val
447end
448opt.on("--external-id", "generate object ID variables") do
449 $USE_EXTERNAL_ID = true
450end
451opt.on("-M [DEPEND-FILE]", "--print-dependencies [DEPEND-FILE]",
452 "dependency file") do |val|
453 $dependencyFileName = val.nil? ? "" : val
454end
455opt.on("-O", "--omit-output-db", "omit DB file output") do
456 $omitOutputDb = true
457end
458opt.on("-v", "--version", "show version number") do
459 abort(opt.ver)
460end
461opt.on("-h", "--help", "show help (this)") do
462 abort(opt.help)
463end
464
465begin
466 $configFileNames = opt.parse(ARGV)
467rescue OptionParser::ParseError
468 abort(opt.help)
469end
470
471#
472# オプションのチェック
473#
474# 依存関係出力モード
475if $pass.nil?
476 # パスの指定は必
477須
478 STDERR.puts("`--pass' option is mandatory")
479 abort(opt.help)
480elsif /^[123]$/ !~ $pass
481 STDERR.puts("pass number `#{$pass}' is not valid")
482 abort(opt.help)
483end
484
485# パス1では,静的APIテーブルは必
486須
487if ($pass == "1" && $apiTableFileNames.empty?)
488 STDERR.puts("`--api-table' option must be specified in pass 1")
489 abort(opt.help)
490end
491
492# パス1以外では,生成スクリプト(trbファイル)が必
493須
494if ($pass != "1" && $trbFileNames.empty?)
495 STDERR.puts("`--trb-file' must be specified except in pass 1")
496 abort(opt.help)
497end
498
499#
500# 指定されたシンボルファイルの読み込み
501#
502if !$romSymbolFileName.nil?
503 if File.exist?($romSymbolFileName)
504 $romSymbol = ReadSymbolFile($romSymbolFileName)
505 else
506 error_exit("`#{$romSymbolFileName}' not found")
507 end
508end
509
510#
511# 指定されたSレコードファイルの読み込み
512#
513if !$romImageFileName.nil?
514 if File.exist?($romImageFileName)
515 $romImage = SRecord.new($romImageFileName)
516 else
517 error_exit("`#{$romImageFileName}' not found")
518 end
519end
520
521#
522# パスに従って各処理を実行
523#
524case $pass
525when "1"
526 load("pass1.rb")
527 Pass1()
528when "2"
529 load("pass2.rb")
530 Pass2()
531when "3"
532 Pass3()
533else
534 error_exit("invalid pass: #{$pass}")
535end
536
537# エラー発生時はabortする
538if $errorFlag
539 if ($0 == __FILE__)
540 abort()
541 else
542 # simplecov対応
543 raise()
544 end
545end
546
547#
548# 作成したすべてのファイルを出力する
549#
550GenFile.output
551
552#
553# タイムスタンプファイルの生成
554#
555if !$timeStampFileName.nil?
556 File.open($timeStampFileName, "w").close
557end
Note: See TracBrowser for help on using the repository browser.