ebngen 1.0.5 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/ebngen/adapter/_assert.rb +25 -25
- data/lib/ebngen/adapter/_base.rb +24 -24
- data/lib/ebngen/adapter/_path_modifier.rb +29 -29
- data/lib/ebngen/adapter/_yml_helper.rb +48 -48
- data/lib/ebngen/adapter/cmake.rb +304 -304
- data/lib/ebngen/adapter/iar/ewd.rb +5 -5
- data/lib/ebngen/adapter/iar/ewp.rb +269 -269
- data/lib/ebngen/adapter/iar/eww.rb +61 -61
- data/lib/ebngen/adapter/iar.rb +459 -459
- data/lib/ebngen/assembly.rb +22 -22
- data/lib/ebngen/generate.rb +47 -47
- data/lib/ebngen/settings/target_types.rb +1 -1
- data/lib/ebngen/settings/tool_chains.rb +4 -4
- data/lib/ebngen/translate.rb +249 -249
- data/lib/ebngen/unifmt.rb +290 -290
- metadata +3 -3
data/lib/ebngen/adapter/iar.rb
CHANGED
@@ -1,460 +1,460 @@
|
|
1
|
-
|
2
|
-
require_relative '_base'
|
3
|
-
require_relative '_yml_helper'
|
4
|
-
require_relative '_path_modifier'
|
5
|
-
require_relative 'iar/eww'
|
6
|
-
require_relative 'iar/ewp'
|
7
|
-
require_relative 'iar/ewd'
|
8
|
-
|
9
|
-
#replace me when yml_merger becomes gem
|
10
|
-
require 'yml_merger'
|
11
|
-
require 'nokogiri'
|
12
|
-
require 'uri'
|
13
|
-
require 'open-uri'
|
14
|
-
|
15
|
-
module IAR
|
16
|
-
class Project
|
17
|
-
TOOLCHAIN='iar'
|
18
|
-
include Base
|
19
|
-
include EWP
|
20
|
-
include EWD
|
21
|
-
include UNI_Project
|
22
|
-
|
23
|
-
def initialize(project_data, generator_variable, logger = nil)
|
24
|
-
@logger = logger
|
25
|
-
unless (logger)
|
26
|
-
@logger = Logger.new(STDOUT)
|
27
|
-
@logger.level = Logger::WARN
|
28
|
-
end
|
29
|
-
set_hash(project_data)
|
30
|
-
@project_name = get_project_name()
|
31
|
-
@board = get_board()
|
32
|
-
@paths = PathModifier.new(generator_variable["paths"])
|
33
|
-
@iar_project_files = {".ewp" => nil, ".dni" => nil, ".ewd" => nil, ".yml" => nil}
|
34
|
-
return nil if get_template(Project::TOOLCHAIN).nil?
|
35
|
-
get_template(Project::TOOLCHAIN).each do |template|
|
36
|
-
@logger.info template
|
37
|
-
ext = File.extname(template)
|
38
|
-
if @iar_project_files.keys.include?(ext)
|
39
|
-
path = @paths.fullpath("default_path",template)
|
40
|
-
#begin
|
41
|
-
case ext
|
42
|
-
when ".ewp"
|
43
|
-
doc = Nokogiri::XML(open(path))
|
44
|
-
@iar_project_files[ext] = doc
|
45
|
-
when ".ewd"
|
46
|
-
doc = Nokogiri::XML(open(path))
|
47
|
-
@iar_project_files[ext] = doc
|
48
|
-
when ".dni"
|
49
|
-
doc = Nokogiri::XML(open(path))
|
50
|
-
@iar_project_files[ext] = doc
|
51
|
-
end
|
52
|
-
#rescue
|
53
|
-
# @logger.info "failed to open #{template}"
|
54
|
-
#end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def generator(filter, project_data)
|
60
|
-
return if not is_toolchain_support(Project::TOOLCHAIN)
|
61
|
-
create_method( Project::TOOLCHAIN)
|
62
|
-
send(Project::TOOLCHAIN.to_sym, project_data)
|
63
|
-
save_project()
|
64
|
-
end
|
65
|
-
|
66
|
-
def source()
|
67
|
-
#add sources to target
|
68
|
-
return if @iar_project_files['.ewp'].nil?
|
69
|
-
remove_sources(@iar_project_files['.ewp'])
|
70
|
-
sources = get_src_list(Project::TOOLCHAIN)
|
71
|
-
o_path = get_output_dir(Project::TOOLCHAIN, @paths.rootdir_table)
|
72
|
-
proj_path = File.join(@paths.rootdir_table['output_root'], o_path)
|
73
|
-
add_sources(@iar_project_files['.ewp'], sources, @paths, proj_path)
|
74
|
-
end
|
75
|
-
|
76
|
-
def templates()
|
77
|
-
#load tempaltes
|
78
|
-
end
|
79
|
-
|
80
|
-
def type()
|
81
|
-
#set project type
|
82
|
-
end
|
83
|
-
|
84
|
-
def document()
|
85
|
-
project_name = get_project_name()
|
86
|
-
|
87
|
-
end
|
88
|
-
|
89
|
-
def targets()
|
90
|
-
convert_lut = {
|
91
|
-
'cx_flags' => 'cxx_flags',
|
92
|
-
'cc_define' => 'cc_defines',
|
93
|
-
'cx_define' => 'cxx_defines',
|
94
|
-
'as_define' => 'as_defines',
|
95
|
-
'cp_define' => 'cp_defines',
|
96
|
-
'ar_flags' => 'ar_flags'
|
97
|
-
}
|
98
|
-
get_targets(Project::TOOLCHAIN).each do |key, value|
|
99
|
-
next if value.nil?
|
100
|
-
#add target for ewp
|
101
|
-
t = new_target(key, @iar_project_files['.ewp'])
|
102
|
-
if t.nil?
|
103
|
-
@logger.info "missing default debug configuration in template"
|
104
|
-
return
|
105
|
-
end
|
106
|
-
#do the target settings
|
107
|
-
value.each_key do |subkey|
|
108
|
-
#for backward compatible
|
109
|
-
temp_op = subkey.gsub('-', '_')
|
110
|
-
if convert_lut.has_key? temp_op
|
111
|
-
target_op = convert_lut[temp_op]
|
112
|
-
else
|
113
|
-
target_op = temp_op
|
114
|
-
end
|
115
|
-
methods = self.class.instance_methods(false)
|
116
|
-
if methods.include?("target_#{target_op}".to_sym)
|
117
|
-
send("target_#{target_op}".to_sym, t, value[subkey])
|
118
|
-
else
|
119
|
-
@logger.info "#{subkey} is not processed try to use the tool-chain specific"
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
123
|
-
remove_targets(@iar_project_files['.ewp'], get_target_list(Project::TOOLCHAIN))
|
124
|
-
end
|
125
|
-
|
126
|
-
# tool_chain_specific attribute for each target
|
127
|
-
# Params:
|
128
|
-
# - target_node: the xml node of given target
|
129
|
-
# - doc: the hash that holds the data
|
130
|
-
def target_tool_chain_set_spec(target_node, doc)
|
131
|
-
set_specific(target_node, doc)
|
132
|
-
end
|
133
|
-
|
134
|
-
def target_tool_chain_add_spec(target_node, doc)
|
135
|
-
add_specific(target_node, doc)
|
136
|
-
end
|
137
|
-
|
138
|
-
def save_project()
|
139
|
-
path = get_output_dir(Project::TOOLCHAIN, @paths.rootdir_table)
|
140
|
-
save(@iar_project_files['.ewp'], File.join(@paths.rootdir_table['output_root'], path, "#{@project_name}_#{@board}.ewp"))
|
141
|
-
end
|
142
|
-
|
143
|
-
def target_cp_defines(target_node, doc)
|
144
|
-
value = doc.values.join(" ")
|
145
|
-
settings = {'OGChipSelectEditMenu' => {
|
146
|
-
'state' => doc.keys.join("") + "\t" + value
|
147
|
-
}
|
148
|
-
}
|
149
|
-
set_specific(target_node, settings)
|
150
|
-
settings = {'GEndianModeBE' => {
|
151
|
-
'state' => '1'
|
152
|
-
}
|
153
|
-
}
|
154
|
-
set_specific(target_node, settings)
|
155
|
-
end
|
156
|
-
|
157
|
-
def target_as_predefines(target_node, doc)
|
158
|
-
|
159
|
-
end
|
160
|
-
|
161
|
-
def target_as_defines(target_node, doc)
|
162
|
-
defines_array = Array.new
|
163
|
-
doc.each do |item|
|
164
|
-
if item.class == Hash
|
165
|
-
item.each do |key, value|
|
166
|
-
defines_array.insert(-1, "#{key}=#{value}")
|
167
|
-
end
|
168
|
-
else
|
169
|
-
defines_array.insert(-1, item)
|
170
|
-
end
|
171
|
-
end
|
172
|
-
settings = {'ADefines' => {
|
173
|
-
'state' => defines_array
|
174
|
-
}
|
175
|
-
}
|
176
|
-
add_specific(target_node, settings)
|
177
|
-
end
|
178
|
-
|
179
|
-
def target_as_include(target_node, doc)
|
180
|
-
o_path = get_output_dir(Project::TOOLCHAIN, @paths.rootdir_table)
|
181
|
-
proj_path = File.join(@paths.rootdir_table['output_root'], o_path)
|
182
|
-
settings = {'AUserIncludes' => {} }
|
183
|
-
inc_array = Array.new
|
184
|
-
doc.each do |item|
|
185
|
-
if item['rootdir']
|
186
|
-
full_path = @paths.fullpath(item['rootdir'],item['path'])
|
187
|
-
else
|
188
|
-
full_path = @paths.fullpath('default_path',item['path'])
|
189
|
-
end
|
190
|
-
inc_array.insert(-1, File.join("$PROJ_DIR$", @paths.relpath(proj_path, full_path)))
|
191
|
-
end
|
192
|
-
settings['AUserIncludes']['state'] = inc_array
|
193
|
-
add_specific(target_node, settings)
|
194
|
-
end
|
195
|
-
|
196
|
-
def target_as_flags(target_node, doc)
|
197
|
-
flags_array = Array.new
|
198
|
-
doc.each do |item|
|
199
|
-
if item.class == Hash
|
200
|
-
item.each do |key, value|
|
201
|
-
flags_array.insert(-1, "#{key}=#{value}")
|
202
|
-
end
|
203
|
-
else
|
204
|
-
flags_array.insert(-1, item)
|
205
|
-
end
|
206
|
-
end
|
207
|
-
settings = {'AExtraOptionsV2' => {
|
208
|
-
'state' => flags_array
|
209
|
-
}
|
210
|
-
}
|
211
|
-
add_specific(target_node, settings)
|
212
|
-
end
|
213
|
-
|
214
|
-
def target_cc_predefines(target_node, doc)
|
215
|
-
|
216
|
-
end
|
217
|
-
|
218
|
-
def target_cc_preincludes(target_node, doc)
|
219
|
-
o_path = get_output_dir(Project::TOOLCHAIN, @paths.rootdir_table)
|
220
|
-
proj_path = File.join(@paths.rootdir_table['output_root'], o_path)
|
221
|
-
settings = {'PreInclude' => {} }
|
222
|
-
inc_array = Array.new
|
223
|
-
doc.each do |item|
|
224
|
-
if item['rootdir']
|
225
|
-
full_path = @paths.fullpath(item['rootdir'],item['path'])
|
226
|
-
else
|
227
|
-
full_path = @paths.fullpath('default_path',item['path'])
|
228
|
-
end
|
229
|
-
inc_array.insert(-1, File.join("$PROJ_DIR$", @paths.relpath(proj_path, full_path)))
|
230
|
-
end
|
231
|
-
settings['PreInclude']['state'] = inc_array
|
232
|
-
add_specific(target_node, settings)
|
233
|
-
end
|
234
|
-
|
235
|
-
def target_cc_defines(target_node, doc)
|
236
|
-
defines_array = Array.new
|
237
|
-
doc.each do |item, item_value|
|
238
|
-
if item_value.nil?
|
239
|
-
defines_array.insert(-1, "#{item}")
|
240
|
-
else
|
241
|
-
defines_array.insert(-1, "#{item}=#{item_value}")
|
242
|
-
end
|
243
|
-
end
|
244
|
-
settings = {'CCDefines' => {
|
245
|
-
'state' => defines_array
|
246
|
-
}
|
247
|
-
}
|
248
|
-
add_specific(target_node, settings)
|
249
|
-
end
|
250
|
-
|
251
|
-
def target_cc_include(target_node, doc)
|
252
|
-
o_path = get_output_dir(Project::TOOLCHAIN, @paths.rootdir_table)
|
253
|
-
proj_path = File.join(@paths.rootdir_table['output_root'], o_path)
|
254
|
-
settings = {'CCIncludePath2' => {} }
|
255
|
-
inc_array = Array.new
|
256
|
-
doc.each do |item|
|
257
|
-
if item['rootdir']
|
258
|
-
full_path = @paths.fullpath(item['rootdir'],item['path'])
|
259
|
-
else
|
260
|
-
full_path = @paths.fullpath('default_path',item['path'])
|
261
|
-
end
|
262
|
-
inc_array.insert(-1, File.join("$PROJ_DIR$", @paths.relpath(proj_path, full_path)))
|
263
|
-
end
|
264
|
-
settings['CCIncludePath2']['state'] = inc_array
|
265
|
-
add_specific(target_node, settings)
|
266
|
-
end
|
267
|
-
|
268
|
-
def target_cc_flags(target_node, doc)
|
269
|
-
settings_check = { 'IExtraOptionsCheck' => {
|
270
|
-
'state' => '1'
|
271
|
-
}
|
272
|
-
}
|
273
|
-
add_specific(target_node, settings_check)
|
274
|
-
settings = {'IExtraOptions' => {
|
275
|
-
'state' => doc
|
276
|
-
}
|
277
|
-
}
|
278
|
-
add_specific(target_node, settings)
|
279
|
-
end
|
280
|
-
|
281
|
-
def target_cxx_predefines(target_node, doc)
|
282
|
-
target_cc_predefines(target_node, doc)
|
283
|
-
end
|
284
|
-
|
285
|
-
def target_cxx_preincludes(target_node, doc)
|
286
|
-
target_cc_preincludes(target_node, doc)
|
287
|
-
end
|
288
|
-
|
289
|
-
def target_cxx_defines(target_node, doc)
|
290
|
-
target_cc_defines(target_node, doc)
|
291
|
-
end
|
292
|
-
|
293
|
-
def target_cxx_include(target_node, doc)
|
294
|
-
target_cc_include(target_node, doc)
|
295
|
-
end
|
296
|
-
|
297
|
-
def target_cxx_flags(target_node, doc)
|
298
|
-
target_cc_flags(target_node, doc)
|
299
|
-
end
|
300
|
-
|
301
|
-
def target_ld_flags(target_node, doc)
|
302
|
-
settings = {'IlinkConfigDefines' => {
|
303
|
-
'state' => doc
|
304
|
-
}
|
305
|
-
}
|
306
|
-
add_specific(target_node, settings)
|
307
|
-
end
|
308
|
-
|
309
|
-
def target_libraries(target_node, doc)
|
310
|
-
settings = {'IlinkAdditionalLibs' => {
|
311
|
-
'state' => doc
|
312
|
-
}
|
313
|
-
}
|
314
|
-
add_specific(target_node, settings)
|
315
|
-
end
|
316
|
-
|
317
|
-
def target_linker_file(target_node, doc)
|
318
|
-
settings_check = { 'IlinkIcfOverride' => {
|
319
|
-
'state' => 1
|
320
|
-
}
|
321
|
-
}
|
322
|
-
add_specific(target_node, settings_check)
|
323
|
-
o_path = get_output_dir(Project::TOOLCHAIN, @paths.rootdir_table)
|
324
|
-
proj_path = File.join(@paths.rootdir_table['output_root'], o_path)
|
325
|
-
settings = {'IlinkIcfFile' => {} }
|
326
|
-
inc_array = Array.new
|
327
|
-
if doc.has_key?("rootdir")
|
328
|
-
full_path = @paths.fullpath(doc['rootdir'],doc['path'])
|
329
|
-
else
|
330
|
-
full_path = @paths.fullpath('default_path',doc['path'])
|
331
|
-
end
|
332
|
-
inc_array.insert(-1, File.join("$PROJ_DIR$", @paths.relpath(proj_path, full_path)))
|
333
|
-
settings['IlinkIcfFile']['state'] = inc_array.join(" ")
|
334
|
-
add_specific(target_node, settings)
|
335
|
-
end
|
336
|
-
|
337
|
-
def target_outdir(target_node, doc)
|
338
|
-
=begin
|
339
|
-
<option>
|
340
|
-
<name>IlinkOutputFile</name>
|
341
|
-
<state>K70_pit_drivers_test.out</state>
|
342
|
-
</option>
|
343
|
-
=end
|
344
|
-
settings = { 'IlinkOutputFile' => {
|
345
|
-
'state' => "#{get_project_name()}.out"
|
346
|
-
}
|
347
|
-
}
|
348
|
-
set_specific(target_node, settings)
|
349
|
-
end
|
350
|
-
|
351
|
-
end
|
352
|
-
|
353
|
-
class Project_set
|
354
|
-
include EWW
|
355
|
-
include UNI_Project
|
356
|
-
TOOLCHAIN='iar'
|
357
|
-
|
358
|
-
# initialize EWW class
|
359
|
-
# PARAMS:
|
360
|
-
# - project_data: specific project data format for a application/library
|
361
|
-
# - generator_variable: all dependency in hash
|
362
|
-
def initialize(project_data, generator_variable, logger = nil)
|
363
|
-
@logger = logger
|
364
|
-
unless (logger)
|
365
|
-
@logger = Logger.new(STDOUT)
|
366
|
-
@logger.level = Logger::WARN
|
367
|
-
end
|
368
|
-
set_hash(project_data)
|
369
|
-
@project_name = get_project_name()
|
370
|
-
@board = get_board()
|
371
|
-
@paths = PathModifier.new(generator_variable["paths"])
|
372
|
-
@all_projects_hash = generator_variable["all"]
|
373
|
-
@iar_project_files = {".eww" => nil}
|
374
|
-
return nil if get_template(Project_set::TOOLCHAIN).nil?
|
375
|
-
get_template(Project_set::TOOLCHAIN).each do |template|
|
376
|
-
ext = File.extname(template)
|
377
|
-
if @iar_project_files.keys.include?(ext)
|
378
|
-
path = @paths.fullpath("default_path",template)
|
379
|
-
doc = Nokogiri::XML(open(path))
|
380
|
-
case ext
|
381
|
-
when ".eww"
|
382
|
-
@iar_project_files[ext] = doc
|
383
|
-
else
|
384
|
-
@logger.info "#{ext} not processed"
|
385
|
-
end
|
386
|
-
end
|
387
|
-
end
|
388
|
-
#clean the wrkspace in template
|
389
|
-
@iar_project_files[".eww"].css("workspace/project").each do |node|
|
390
|
-
node.remove
|
391
|
-
end
|
392
|
-
@iar_project_files[".eww"].css("workspace/batchBuild/batchDefinition").each do |node|
|
393
|
-
node.remove
|
394
|
-
end
|
395
|
-
end
|
396
|
-
|
397
|
-
def generator()
|
398
|
-
return if not is_toolchain_support(Project::TOOLCHAIN)
|
399
|
-
add_project_to_set()
|
400
|
-
save_set()
|
401
|
-
end
|
402
|
-
|
403
|
-
|
404
|
-
def add_project_to_set()
|
405
|
-
return if @iar_project_files.nil?
|
406
|
-
return if @iar_project_files['.eww'].nil?
|
407
|
-
ext = ".eww"
|
408
|
-
|
409
|
-
#batch build mode is add
|
410
|
-
get_target_list(Project_set::TOOLCHAIN).each do |target|
|
411
|
-
add_batch_project_target(@iar_project_files[ext], "all", @project_name, target)
|
412
|
-
add_batch_project_target(@iar_project_files[ext], target, @project_name, target)
|
413
|
-
next if get_libraries(Project_set::TOOLCHAIN).nil?
|
414
|
-
get_libraries(Project_set::TOOLCHAIN).each do |lib|
|
415
|
-
add_batch_project_target(@iar_project_files[ext], "all", lib, target)
|
416
|
-
add_batch_project_target(@iar_project_files[ext], target, lib, target)
|
417
|
-
end
|
418
|
-
end
|
419
|
-
#add projects
|
420
|
-
file = "#{@project_name}_#{@board}.ewp"
|
421
|
-
path = File.join('$WS_DIR$',file)
|
422
|
-
add_project(@iar_project_files[ext], path)
|
423
|
-
#add library projects here
|
424
|
-
#get from dependency['libraries'][library_name]
|
425
|
-
ustruct = @all_projects_hash
|
426
|
-
return if get_libraries(Project_set::TOOLCHAIN).nil?
|
427
|
-
get_libraries(Project_set::TOOLCHAIN).each do |lib|
|
428
|
-
if ustruct[lib].nil?
|
429
|
-
@logger.info "#{lib} information is missing in all hash"
|
430
|
-
next
|
431
|
-
end
|
432
|
-
libname = "#{@project_name}.ewp"
|
433
|
-
root = @paths.rootdir_table[@ustruct[library][tool_key]['outdir']['root-dir']]
|
434
|
-
lib_path = File.join(root, @ustruct[library][tool_key]['outdir']['path'], libname)
|
435
|
-
if @ustruct[ project_name ][ tool_key ].has_key?('outdir')
|
436
|
-
ewwpath = File.join(@output_rootdir, @ustruct[ project_name ][ tool_key ][ 'outdir' ] )
|
437
|
-
else
|
438
|
-
ewwpath = @output_rootdir
|
439
|
-
end
|
440
|
-
path = Pathname.new(lib_path).relative_path_from(Pathname.new(ewwpath))
|
441
|
-
#more to come
|
442
|
-
end
|
443
|
-
|
444
|
-
end
|
445
|
-
|
446
|
-
def save_set()
|
447
|
-
path = get_output_dir(Project_set::TOOLCHAIN, @paths.rootdir_table)
|
448
|
-
@logger.info @paths.rootdir_table['output_root']
|
449
|
-
@logger.info path
|
450
|
-
@logger.info "#{@project_name}_#{@board}.eww"
|
451
|
-
if path.class == Hash
|
452
|
-
save(@iar_project_files['.eww'], File.join(@paths.rootdir_table[path['rootdir']], path['path'], "#{@project_name}_#{@board}.eww"))
|
453
|
-
else
|
454
|
-
save(@iar_project_files['.eww'], File.join(@paths.rootdir_table['output_root'], path, "#{@project_name}_#{@board}.eww"))
|
455
|
-
end
|
456
|
-
end
|
457
|
-
|
458
|
-
end
|
459
|
-
|
1
|
+
|
2
|
+
require_relative '_base'
|
3
|
+
require_relative '_yml_helper'
|
4
|
+
require_relative '_path_modifier'
|
5
|
+
require_relative 'iar/eww'
|
6
|
+
require_relative 'iar/ewp'
|
7
|
+
require_relative 'iar/ewd'
|
8
|
+
|
9
|
+
#replace me when yml_merger becomes gem
|
10
|
+
require 'yml_merger'
|
11
|
+
require 'nokogiri'
|
12
|
+
require 'uri'
|
13
|
+
require 'open-uri'
|
14
|
+
|
15
|
+
module IAR
|
16
|
+
class Project
|
17
|
+
TOOLCHAIN='iar'
|
18
|
+
include Base
|
19
|
+
include EWP
|
20
|
+
include EWD
|
21
|
+
include UNI_Project
|
22
|
+
|
23
|
+
def initialize(project_data, generator_variable, logger = nil)
|
24
|
+
@logger = logger
|
25
|
+
unless (logger)
|
26
|
+
@logger = Logger.new(STDOUT)
|
27
|
+
@logger.level = Logger::WARN
|
28
|
+
end
|
29
|
+
set_hash(project_data)
|
30
|
+
@project_name = get_project_name()
|
31
|
+
@board = get_board()
|
32
|
+
@paths = PathModifier.new(generator_variable["paths"])
|
33
|
+
@iar_project_files = {".ewp" => nil, ".dni" => nil, ".ewd" => nil, ".yml" => nil}
|
34
|
+
return nil if get_template(Project::TOOLCHAIN).nil?
|
35
|
+
get_template(Project::TOOLCHAIN).each do |template|
|
36
|
+
@logger.info template
|
37
|
+
ext = File.extname(template)
|
38
|
+
if @iar_project_files.keys.include?(ext)
|
39
|
+
path = @paths.fullpath("default_path",template)
|
40
|
+
#begin
|
41
|
+
case ext
|
42
|
+
when ".ewp"
|
43
|
+
doc = Nokogiri::XML(open(path))
|
44
|
+
@iar_project_files[ext] = doc
|
45
|
+
when ".ewd"
|
46
|
+
doc = Nokogiri::XML(open(path))
|
47
|
+
@iar_project_files[ext] = doc
|
48
|
+
when ".dni"
|
49
|
+
doc = Nokogiri::XML(open(path))
|
50
|
+
@iar_project_files[ext] = doc
|
51
|
+
end
|
52
|
+
#rescue
|
53
|
+
# @logger.info "failed to open #{template}"
|
54
|
+
#end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def generator(filter, project_data)
|
60
|
+
return if not is_toolchain_support(Project::TOOLCHAIN)
|
61
|
+
create_method( Project::TOOLCHAIN)
|
62
|
+
send(Project::TOOLCHAIN.to_sym, project_data)
|
63
|
+
save_project()
|
64
|
+
end
|
65
|
+
|
66
|
+
def source()
|
67
|
+
#add sources to target
|
68
|
+
return if @iar_project_files['.ewp'].nil?
|
69
|
+
remove_sources(@iar_project_files['.ewp'])
|
70
|
+
sources = get_src_list(Project::TOOLCHAIN)
|
71
|
+
o_path = get_output_dir(Project::TOOLCHAIN, @paths.rootdir_table)
|
72
|
+
proj_path = File.join(@paths.rootdir_table['output_root'], o_path)
|
73
|
+
add_sources(@iar_project_files['.ewp'], sources, @paths, proj_path)
|
74
|
+
end
|
75
|
+
|
76
|
+
def templates()
|
77
|
+
#load tempaltes
|
78
|
+
end
|
79
|
+
|
80
|
+
def type()
|
81
|
+
#set project type
|
82
|
+
end
|
83
|
+
|
84
|
+
def document()
|
85
|
+
project_name = get_project_name()
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
def targets()
|
90
|
+
convert_lut = {
|
91
|
+
'cx_flags' => 'cxx_flags',
|
92
|
+
'cc_define' => 'cc_defines',
|
93
|
+
'cx_define' => 'cxx_defines',
|
94
|
+
'as_define' => 'as_defines',
|
95
|
+
'cp_define' => 'cp_defines',
|
96
|
+
'ar_flags' => 'ar_flags'
|
97
|
+
}
|
98
|
+
get_targets(Project::TOOLCHAIN).each do |key, value|
|
99
|
+
next if value.nil?
|
100
|
+
#add target for ewp
|
101
|
+
t = new_target(key, @iar_project_files['.ewp'])
|
102
|
+
if t.nil?
|
103
|
+
@logger.info "missing default debug configuration in template"
|
104
|
+
return
|
105
|
+
end
|
106
|
+
#do the target settings
|
107
|
+
value.each_key do |subkey|
|
108
|
+
#for backward compatible
|
109
|
+
temp_op = subkey.gsub('-', '_')
|
110
|
+
if convert_lut.has_key? temp_op
|
111
|
+
target_op = convert_lut[temp_op]
|
112
|
+
else
|
113
|
+
target_op = temp_op
|
114
|
+
end
|
115
|
+
methods = self.class.instance_methods(false)
|
116
|
+
if methods.include?("target_#{target_op}".to_sym)
|
117
|
+
send("target_#{target_op}".to_sym, t, value[subkey])
|
118
|
+
else
|
119
|
+
@logger.info "#{subkey} is not processed try to use the tool-chain specific"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
remove_targets(@iar_project_files['.ewp'], get_target_list(Project::TOOLCHAIN))
|
124
|
+
end
|
125
|
+
|
126
|
+
# tool_chain_specific attribute for each target
|
127
|
+
# Params:
|
128
|
+
# - target_node: the xml node of given target
|
129
|
+
# - doc: the hash that holds the data
|
130
|
+
def target_tool_chain_set_spec(target_node, doc)
|
131
|
+
set_specific(target_node, doc)
|
132
|
+
end
|
133
|
+
|
134
|
+
def target_tool_chain_add_spec(target_node, doc)
|
135
|
+
add_specific(target_node, doc)
|
136
|
+
end
|
137
|
+
|
138
|
+
def save_project()
|
139
|
+
path = get_output_dir(Project::TOOLCHAIN, @paths.rootdir_table)
|
140
|
+
save(@iar_project_files['.ewp'], File.join(@paths.rootdir_table['output_root'], path, "#{@project_name}_#{@board}.ewp"))
|
141
|
+
end
|
142
|
+
|
143
|
+
def target_cp_defines(target_node, doc)
|
144
|
+
value = doc.values.join(" ")
|
145
|
+
settings = {'OGChipSelectEditMenu' => {
|
146
|
+
'state' => doc.keys.join("") + "\t" + value
|
147
|
+
}
|
148
|
+
}
|
149
|
+
set_specific(target_node, settings)
|
150
|
+
settings = {'GEndianModeBE' => {
|
151
|
+
'state' => '1'
|
152
|
+
}
|
153
|
+
}
|
154
|
+
set_specific(target_node, settings)
|
155
|
+
end
|
156
|
+
|
157
|
+
def target_as_predefines(target_node, doc)
|
158
|
+
|
159
|
+
end
|
160
|
+
|
161
|
+
def target_as_defines(target_node, doc)
|
162
|
+
defines_array = Array.new
|
163
|
+
doc.each do |item|
|
164
|
+
if item.class == Hash
|
165
|
+
item.each do |key, value|
|
166
|
+
defines_array.insert(-1, "#{key}=#{value}")
|
167
|
+
end
|
168
|
+
else
|
169
|
+
defines_array.insert(-1, item)
|
170
|
+
end
|
171
|
+
end
|
172
|
+
settings = {'ADefines' => {
|
173
|
+
'state' => defines_array
|
174
|
+
}
|
175
|
+
}
|
176
|
+
add_specific(target_node, settings)
|
177
|
+
end
|
178
|
+
|
179
|
+
def target_as_include(target_node, doc)
|
180
|
+
o_path = get_output_dir(Project::TOOLCHAIN, @paths.rootdir_table)
|
181
|
+
proj_path = File.join(@paths.rootdir_table['output_root'], o_path)
|
182
|
+
settings = {'AUserIncludes' => {} }
|
183
|
+
inc_array = Array.new
|
184
|
+
doc.each do |item|
|
185
|
+
if item['rootdir']
|
186
|
+
full_path = @paths.fullpath(item['rootdir'],item['path'])
|
187
|
+
else
|
188
|
+
full_path = @paths.fullpath('default_path',item['path'])
|
189
|
+
end
|
190
|
+
inc_array.insert(-1, File.join("$PROJ_DIR$", @paths.relpath(proj_path, full_path)))
|
191
|
+
end
|
192
|
+
settings['AUserIncludes']['state'] = inc_array
|
193
|
+
add_specific(target_node, settings)
|
194
|
+
end
|
195
|
+
|
196
|
+
def target_as_flags(target_node, doc)
|
197
|
+
flags_array = Array.new
|
198
|
+
doc.each do |item|
|
199
|
+
if item.class == Hash
|
200
|
+
item.each do |key, value|
|
201
|
+
flags_array.insert(-1, "#{key}=#{value}")
|
202
|
+
end
|
203
|
+
else
|
204
|
+
flags_array.insert(-1, item)
|
205
|
+
end
|
206
|
+
end
|
207
|
+
settings = {'AExtraOptionsV2' => {
|
208
|
+
'state' => flags_array
|
209
|
+
}
|
210
|
+
}
|
211
|
+
add_specific(target_node, settings)
|
212
|
+
end
|
213
|
+
|
214
|
+
def target_cc_predefines(target_node, doc)
|
215
|
+
|
216
|
+
end
|
217
|
+
|
218
|
+
def target_cc_preincludes(target_node, doc)
|
219
|
+
o_path = get_output_dir(Project::TOOLCHAIN, @paths.rootdir_table)
|
220
|
+
proj_path = File.join(@paths.rootdir_table['output_root'], o_path)
|
221
|
+
settings = {'PreInclude' => {} }
|
222
|
+
inc_array = Array.new
|
223
|
+
doc.each do |item|
|
224
|
+
if item['rootdir']
|
225
|
+
full_path = @paths.fullpath(item['rootdir'],item['path'])
|
226
|
+
else
|
227
|
+
full_path = @paths.fullpath('default_path',item['path'])
|
228
|
+
end
|
229
|
+
inc_array.insert(-1, File.join("$PROJ_DIR$", @paths.relpath(proj_path, full_path)))
|
230
|
+
end
|
231
|
+
settings['PreInclude']['state'] = inc_array
|
232
|
+
add_specific(target_node, settings)
|
233
|
+
end
|
234
|
+
|
235
|
+
def target_cc_defines(target_node, doc)
|
236
|
+
defines_array = Array.new
|
237
|
+
doc.each do |item, item_value|
|
238
|
+
if item_value.nil?
|
239
|
+
defines_array.insert(-1, "#{item}")
|
240
|
+
else
|
241
|
+
defines_array.insert(-1, "#{item}=#{item_value}")
|
242
|
+
end
|
243
|
+
end
|
244
|
+
settings = {'CCDefines' => {
|
245
|
+
'state' => defines_array
|
246
|
+
}
|
247
|
+
}
|
248
|
+
add_specific(target_node, settings)
|
249
|
+
end
|
250
|
+
|
251
|
+
def target_cc_include(target_node, doc)
|
252
|
+
o_path = get_output_dir(Project::TOOLCHAIN, @paths.rootdir_table)
|
253
|
+
proj_path = File.join(@paths.rootdir_table['output_root'], o_path)
|
254
|
+
settings = {'CCIncludePath2' => {} }
|
255
|
+
inc_array = Array.new
|
256
|
+
doc.each do |item|
|
257
|
+
if item['rootdir']
|
258
|
+
full_path = @paths.fullpath(item['rootdir'],item['path'])
|
259
|
+
else
|
260
|
+
full_path = @paths.fullpath('default_path',item['path'])
|
261
|
+
end
|
262
|
+
inc_array.insert(-1, File.join("$PROJ_DIR$", @paths.relpath(proj_path, full_path)))
|
263
|
+
end
|
264
|
+
settings['CCIncludePath2']['state'] = inc_array
|
265
|
+
add_specific(target_node, settings)
|
266
|
+
end
|
267
|
+
|
268
|
+
def target_cc_flags(target_node, doc)
|
269
|
+
settings_check = { 'IExtraOptionsCheck' => {
|
270
|
+
'state' => '1'
|
271
|
+
}
|
272
|
+
}
|
273
|
+
add_specific(target_node, settings_check)
|
274
|
+
settings = {'IExtraOptions' => {
|
275
|
+
'state' => doc
|
276
|
+
}
|
277
|
+
}
|
278
|
+
add_specific(target_node, settings)
|
279
|
+
end
|
280
|
+
|
281
|
+
def target_cxx_predefines(target_node, doc)
|
282
|
+
target_cc_predefines(target_node, doc)
|
283
|
+
end
|
284
|
+
|
285
|
+
def target_cxx_preincludes(target_node, doc)
|
286
|
+
target_cc_preincludes(target_node, doc)
|
287
|
+
end
|
288
|
+
|
289
|
+
def target_cxx_defines(target_node, doc)
|
290
|
+
target_cc_defines(target_node, doc)
|
291
|
+
end
|
292
|
+
|
293
|
+
def target_cxx_include(target_node, doc)
|
294
|
+
target_cc_include(target_node, doc)
|
295
|
+
end
|
296
|
+
|
297
|
+
def target_cxx_flags(target_node, doc)
|
298
|
+
target_cc_flags(target_node, doc)
|
299
|
+
end
|
300
|
+
|
301
|
+
def target_ld_flags(target_node, doc)
|
302
|
+
settings = {'IlinkConfigDefines' => {
|
303
|
+
'state' => doc
|
304
|
+
}
|
305
|
+
}
|
306
|
+
add_specific(target_node, settings)
|
307
|
+
end
|
308
|
+
|
309
|
+
def target_libraries(target_node, doc)
|
310
|
+
settings = {'IlinkAdditionalLibs' => {
|
311
|
+
'state' => doc
|
312
|
+
}
|
313
|
+
}
|
314
|
+
add_specific(target_node, settings)
|
315
|
+
end
|
316
|
+
|
317
|
+
def target_linker_file(target_node, doc)
|
318
|
+
settings_check = { 'IlinkIcfOverride' => {
|
319
|
+
'state' => 1
|
320
|
+
}
|
321
|
+
}
|
322
|
+
add_specific(target_node, settings_check)
|
323
|
+
o_path = get_output_dir(Project::TOOLCHAIN, @paths.rootdir_table)
|
324
|
+
proj_path = File.join(@paths.rootdir_table['output_root'], o_path)
|
325
|
+
settings = {'IlinkIcfFile' => {} }
|
326
|
+
inc_array = Array.new
|
327
|
+
if doc.has_key?("rootdir")
|
328
|
+
full_path = @paths.fullpath(doc['rootdir'],doc['path'])
|
329
|
+
else
|
330
|
+
full_path = @paths.fullpath('default_path',doc['path'])
|
331
|
+
end
|
332
|
+
inc_array.insert(-1, File.join("$PROJ_DIR$", @paths.relpath(proj_path, full_path)))
|
333
|
+
settings['IlinkIcfFile']['state'] = inc_array.join(" ")
|
334
|
+
add_specific(target_node, settings)
|
335
|
+
end
|
336
|
+
|
337
|
+
def target_outdir(target_node, doc)
|
338
|
+
=begin
|
339
|
+
<option>
|
340
|
+
<name>IlinkOutputFile</name>
|
341
|
+
<state>K70_pit_drivers_test.out</state>
|
342
|
+
</option>
|
343
|
+
=end
|
344
|
+
settings = { 'IlinkOutputFile' => {
|
345
|
+
'state' => "#{get_project_name()}.out"
|
346
|
+
}
|
347
|
+
}
|
348
|
+
set_specific(target_node, settings)
|
349
|
+
end
|
350
|
+
|
351
|
+
end
|
352
|
+
|
353
|
+
class Project_set
|
354
|
+
include EWW
|
355
|
+
include UNI_Project
|
356
|
+
TOOLCHAIN='iar'
|
357
|
+
|
358
|
+
# initialize EWW class
|
359
|
+
# PARAMS:
|
360
|
+
# - project_data: specific project data format for a application/library
|
361
|
+
# - generator_variable: all dependency in hash
|
362
|
+
def initialize(project_data, generator_variable, logger = nil)
|
363
|
+
@logger = logger
|
364
|
+
unless (logger)
|
365
|
+
@logger = Logger.new(STDOUT)
|
366
|
+
@logger.level = Logger::WARN
|
367
|
+
end
|
368
|
+
set_hash(project_data)
|
369
|
+
@project_name = get_project_name()
|
370
|
+
@board = get_board()
|
371
|
+
@paths = PathModifier.new(generator_variable["paths"])
|
372
|
+
@all_projects_hash = generator_variable["all"]
|
373
|
+
@iar_project_files = {".eww" => nil}
|
374
|
+
return nil if get_template(Project_set::TOOLCHAIN).nil?
|
375
|
+
get_template(Project_set::TOOLCHAIN).each do |template|
|
376
|
+
ext = File.extname(template)
|
377
|
+
if @iar_project_files.keys.include?(ext)
|
378
|
+
path = @paths.fullpath("default_path",template)
|
379
|
+
doc = Nokogiri::XML(open(path))
|
380
|
+
case ext
|
381
|
+
when ".eww"
|
382
|
+
@iar_project_files[ext] = doc
|
383
|
+
else
|
384
|
+
@logger.info "#{ext} not processed"
|
385
|
+
end
|
386
|
+
end
|
387
|
+
end
|
388
|
+
#clean the wrkspace in template
|
389
|
+
@iar_project_files[".eww"].css("workspace/project").each do |node|
|
390
|
+
node.remove
|
391
|
+
end
|
392
|
+
@iar_project_files[".eww"].css("workspace/batchBuild/batchDefinition").each do |node|
|
393
|
+
node.remove
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
397
|
+
def generator()
|
398
|
+
return if not is_toolchain_support(Project::TOOLCHAIN)
|
399
|
+
add_project_to_set()
|
400
|
+
save_set()
|
401
|
+
end
|
402
|
+
|
403
|
+
|
404
|
+
def add_project_to_set()
|
405
|
+
return if @iar_project_files.nil?
|
406
|
+
return if @iar_project_files['.eww'].nil?
|
407
|
+
ext = ".eww"
|
408
|
+
|
409
|
+
#batch build mode is add
|
410
|
+
get_target_list(Project_set::TOOLCHAIN).each do |target|
|
411
|
+
add_batch_project_target(@iar_project_files[ext], "all", @project_name, target)
|
412
|
+
add_batch_project_target(@iar_project_files[ext], target, @project_name, target)
|
413
|
+
next if get_libraries(Project_set::TOOLCHAIN).nil?
|
414
|
+
get_libraries(Project_set::TOOLCHAIN).each do |lib|
|
415
|
+
add_batch_project_target(@iar_project_files[ext], "all", lib, target)
|
416
|
+
add_batch_project_target(@iar_project_files[ext], target, lib, target)
|
417
|
+
end
|
418
|
+
end
|
419
|
+
#add projects
|
420
|
+
file = "#{@project_name}_#{@board}.ewp"
|
421
|
+
path = File.join('$WS_DIR$',file)
|
422
|
+
add_project(@iar_project_files[ext], path)
|
423
|
+
#add library projects here
|
424
|
+
#get from dependency['libraries'][library_name]
|
425
|
+
ustruct = @all_projects_hash
|
426
|
+
return if get_libraries(Project_set::TOOLCHAIN).nil?
|
427
|
+
get_libraries(Project_set::TOOLCHAIN).each do |lib|
|
428
|
+
if ustruct[lib].nil?
|
429
|
+
@logger.info "#{lib} information is missing in all hash"
|
430
|
+
next
|
431
|
+
end
|
432
|
+
libname = "#{@project_name}.ewp"
|
433
|
+
root = @paths.rootdir_table[@ustruct[library][tool_key]['outdir']['root-dir']]
|
434
|
+
lib_path = File.join(root, @ustruct[library][tool_key]['outdir']['path'], libname)
|
435
|
+
if @ustruct[ project_name ][ tool_key ].has_key?('outdir')
|
436
|
+
ewwpath = File.join(@output_rootdir, @ustruct[ project_name ][ tool_key ][ 'outdir' ] )
|
437
|
+
else
|
438
|
+
ewwpath = @output_rootdir
|
439
|
+
end
|
440
|
+
path = Pathname.new(lib_path).relative_path_from(Pathname.new(ewwpath))
|
441
|
+
#more to come
|
442
|
+
end
|
443
|
+
|
444
|
+
end
|
445
|
+
|
446
|
+
def save_set()
|
447
|
+
path = get_output_dir(Project_set::TOOLCHAIN, @paths.rootdir_table)
|
448
|
+
@logger.info @paths.rootdir_table['output_root']
|
449
|
+
@logger.info path
|
450
|
+
@logger.info "#{@project_name}_#{@board}.eww"
|
451
|
+
if path.class == Hash
|
452
|
+
save(@iar_project_files['.eww'], File.join(@paths.rootdir_table[path['rootdir']], path['path'], "#{@project_name}_#{@board}.eww"))
|
453
|
+
else
|
454
|
+
save(@iar_project_files['.eww'], File.join(@paths.rootdir_table['output_root'], path, "#{@project_name}_#{@board}.eww"))
|
455
|
+
end
|
456
|
+
end
|
457
|
+
|
458
|
+
end
|
459
|
+
|
460
460
|
end # end Module IAR
|