ebngen 1.0.6 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3e0884f0b04347561316ce53cf34c0ce4be04b1b
4
- data.tar.gz: ee6dc7c0734a2fc49891a8c2096daf9397aa0132
3
+ metadata.gz: ca05259fd29ecf16276a0c7d20b0e7cdfc77e420
4
+ data.tar.gz: 6eb40d9714cd4afb60aebc293af7ac00513497db
5
5
  SHA512:
6
- metadata.gz: b76e1ded1b9a7c7ec475560e64130939725fa2ed3a9a0879d7f53ce3e97c2c746048607e64629a71c6146f8286e6982dffdf95a6e9a6d69b5fbdce254eb5ed65
7
- data.tar.gz: e2f83004cdedb8bc2e45c5da964cd12f8112ea15023a196b331e180b4be169b7381fd18364e6b04bf1aaee28b3dd56816a462a93ed17be9e3e0405ef3c81687e
6
+ metadata.gz: 87cab787174215e871041cc02ae5514864b9f442462a0fb9d63785669e72d61a127c36278caf14f68aece6e0c9302cde9eb5a3106fb8d8b071dcf8559eaffaa7
7
+ data.tar.gz: a5909d15f594d785ac7c5e1f426358cc42e17f71220b70d3d3e39ac9c8c81b9ae96d0f2b9a83f559032070be32ee065822f31b8673c8f0c9a6503f1f8ae89166
@@ -15,6 +15,7 @@ module Base
15
15
  project_data[name].each_key do |key|
16
16
  methods = self.class.instance_methods(false)
17
17
  if methods.include?(key.to_sym)
18
+ puts "process #{key}"
18
19
  send(key.to_sym)
19
20
  else
20
21
  puts "#{key} is not processed"
@@ -46,4 +46,12 @@ module UNI_Project
46
46
  def get_template(toolchain)
47
47
  return @projects_hash[toolchain]['templates']
48
48
  end
49
+
50
+ def get_default_projectset_settings(toolchain)
51
+ return @projects_hash[toolchain]['projectset_settings']
52
+ end
53
+
54
+ def get_default_project_settings(toolchain)
55
+ return @projects_hash[toolchain]['project_settings']
56
+ end
49
57
  end
@@ -47,7 +47,7 @@ module EWP
47
47
  nset.each do |element|
48
48
  #use the first available configuration
49
49
  t = element.dup
50
- t.css('/name').text = target
50
+ t.at_css('/name').content = target
51
51
  #doc.xpath("/project") << t
52
52
  element.add_previous_sibling(t)
53
53
  return t
@@ -0,0 +1,480 @@
1
+
2
+ require_relative '_base'
3
+ require_relative '_yml_helper'
4
+ require_relative '_path_modifier'
5
+ require_relative 'mdk/uvmwp'
6
+ require_relative 'mdk/uvprojx'
7
+
8
+ #replace me when yml_merger becomes gem
9
+ require 'yml_merger'
10
+ require 'nokogiri'
11
+ require 'uri'
12
+ require 'open-uri'
13
+ require 'xsd_populator'
14
+ require 'xsd_reader'
15
+
16
+ module MDK
17
+ class Project
18
+ TOOLCHAIN='mdk'
19
+ include Base
20
+ include UVPROJX
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
+ @mdk_project_files = {"project_projx"=> nil,".yml" => nil, ".uvprojx" => 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 @mdk_project_files.keys.include?(ext)
39
+ path = @paths.fullpath("default_path",template)
40
+ #begin
41
+ case ext
42
+ when ".uvprojx"
43
+ #fn = File.basename(path, ".uvprojx")
44
+ #if fn == "project_projx"
45
+ doc = Nokogiri::XML(open(path))
46
+ #string_xml = XsdPopulator.new(:xsd => path).populated_xml
47
+ #doc = Nokogiri::XML(string_xml)
48
+ @mdk_project_files["project_projx"] = doc
49
+ #init_project(doc, get_default_project_settings(Project_set::TOOLCHAIN))
50
+ #end
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
+ =begin
69
+ return if @mdk_project_files['project_projx'].nil?
70
+ remove_sources(@mdk_project_files['project_projx'])
71
+ sources = get_src_list(Project::TOOLCHAIN)
72
+ o_path = get_output_dir(Project::TOOLCHAIN, @paths.rootdir_table)
73
+ proj_path = File.join(@paths.rootdir_table['output_root'], o_path)
74
+ add_sources(@mdk_project_files['project_projx'], sources, @paths, proj_path)
75
+ =end
76
+ end
77
+
78
+ def templates()
79
+ #load tempaltes
80
+ end
81
+
82
+ def type()
83
+ #set project type
84
+ end
85
+
86
+ def document()
87
+ project_name = get_project_name()
88
+ end
89
+
90
+ def targets()
91
+ convert_lut = {
92
+ 'cx_flags' => 'cxx_flags',
93
+ 'cc_define' => 'cc_defines',
94
+ 'cx_define' => 'cxx_defines',
95
+ 'as_define' => 'as_defines',
96
+ 'cp_define' => 'cp_defines',
97
+ 'ar_flags' => 'ar_flags'
98
+ }
99
+ get_targets(Project::TOOLCHAIN).each do |key, value|
100
+ next if value.nil?
101
+ #add target for uvproj
102
+ t = new_target(key, @mdk_project_files['project_projx'])
103
+ if t.nil?
104
+ @logger.info "missing default debug configuration in template"
105
+ return
106
+ end
107
+ #do the target settings
108
+ value.each_key do |subkey|
109
+ #for backward compatible
110
+ temp_op = subkey.gsub('-', '_')
111
+ if convert_lut.has_key? temp_op
112
+ target_op = convert_lut[temp_op]
113
+ else
114
+ target_op = temp_op
115
+ end
116
+ methods = self.class.instance_methods(false)
117
+ if methods.include?("target_#{target_op}".to_sym)
118
+ send("target_#{target_op}".to_sym, t, value[subkey])
119
+ else
120
+ @logger.info "#{subkey} is not processed try to use the tool-chain specific"
121
+ end
122
+ end
123
+ #for mdk sources are added pre-target
124
+ remove_sources(t)
125
+ sources = get_src_list(Project::TOOLCHAIN)
126
+ o_path = get_output_dir(Project::TOOLCHAIN, @paths.rootdir_table)
127
+ proj_path = File.join(@paths.rootdir_table['output_root'], o_path)
128
+ add_sources(t.at_xpath("Groups"), sources, @paths, proj_path)
129
+ end
130
+ remove_targets(@mdk_project_files['project_projx'], get_target_list(Project::TOOLCHAIN))
131
+ end
132
+
133
+ # tool_chain_specific attribute for each target
134
+ # Params:
135
+ # - target_node: the xml node of given target
136
+ # - doc: the hash that holds the data
137
+ def target_tool_chain_set_spec(target_node, doc)
138
+ set_specific(target_node, doc)
139
+ end
140
+
141
+ def target_tool_chain_add_spec(target_node, doc)
142
+ add_specific(target_node, doc)
143
+ end
144
+
145
+ def save_project()
146
+ path = get_output_dir(Project::TOOLCHAIN, @paths.rootdir_table)
147
+ @logger.info "save as #{File.join(@paths.rootdir_table['output_root'], path, "#{@project_name}_#{@board}.uvprojx")}"
148
+ save(@mdk_project_files['project_projx'], File.join(@paths.rootdir_table['output_root'], path, "#{@project_name}_#{@board}.uvprojx"))
149
+ end
150
+
151
+ def target_cp_defines(target_node, doc)
152
+ cpdefines = []
153
+ doc.each do |key, value|
154
+ cpdefines.insert(-1, "#{key}=#{value}")
155
+ end
156
+ settings = {'Cads' =>
157
+ { 'VariousControls' =>
158
+ {
159
+ 'Define' => cpdefines
160
+ }
161
+ }
162
+ }
163
+ set_specific(target_node, settings)
164
+
165
+ end
166
+
167
+ def target_as_predefines(target_node, doc)
168
+
169
+ end
170
+
171
+ def target_as_defines(target_node, doc)
172
+ asdefines = []
173
+ doc.each do |key, value|
174
+ asdefines.insert(-1, "#{key}=#{value}")
175
+ end
176
+ settings = {'Aads' =>
177
+ { 'VariousControls' =>
178
+ {
179
+ 'Define' => asdefines
180
+ }
181
+ }
182
+ }
183
+ set_specific(target_node, settings)
184
+ end
185
+
186
+ def target_as_include(target_node, doc)
187
+ o_path = get_output_dir(Project::TOOLCHAIN, @paths.rootdir_table)
188
+ proj_path = File.join(@paths.rootdir_table['output_root'], o_path)
189
+
190
+ inc_array = Array.new
191
+ doc.each do |item|
192
+ if item['rootdir']
193
+ full_path = @paths.fullpath(item['rootdir'],item['path'])
194
+ else
195
+ full_path = @paths.fullpath('default_path',item['path'])
196
+ end
197
+ inc_array.insert(-1, File.join("$PROJ_DIR$", @paths.relpath(proj_path, full_path)))
198
+ end
199
+ settings = {'Aads' =>
200
+ { 'VariousControls' =>
201
+ {
202
+ 'IncludePath' => inc_array
203
+ }
204
+ }
205
+ }
206
+ add_specific(target_node, settings)
207
+ end
208
+
209
+ def target_as_flags(target_node, doc)
210
+ flags_array = Array.new
211
+ doc.each do |item|
212
+ if item.class == Hash
213
+ item.each do |key, value|
214
+ flags_array.insert(-1, "#{key}=#{value}")
215
+ end
216
+ else
217
+ flags_array.insert(-1, item)
218
+ end
219
+ end
220
+ settings = {'Aads' =>
221
+ { 'VariousControls' =>
222
+ {
223
+ 'MiscControls' => flags_array
224
+ }
225
+ }
226
+ }
227
+ add_specific(target_node, settings)
228
+ end
229
+
230
+ def target_cc_predefines(target_node, doc)
231
+
232
+ end
233
+
234
+ def target_cc_preincludes(target_node, doc)
235
+ end
236
+
237
+ def target_cc_defines(target_node, doc)
238
+ defines_array = Array.new
239
+ doc.each do |item, item_value|
240
+ if item_value.nil?
241
+ defines_array.insert(-1, "#{item}")
242
+ else
243
+ defines_array.insert(-1, "#{item}=#{item_value}")
244
+ end
245
+ end
246
+ settings = {'Cads' =>
247
+ { 'VariousControls' =>
248
+ {
249
+ 'Define' => defines_array
250
+ }
251
+ }
252
+ }
253
+ add_specific(target_node, settings)
254
+ end
255
+
256
+ def target_cc_include(target_node, doc)
257
+ o_path = get_output_dir(Project::TOOLCHAIN, @paths.rootdir_table)
258
+ proj_path = File.join(@paths.rootdir_table['output_root'], o_path)
259
+ inc_array = Array.new
260
+ doc.each do |item|
261
+ if item['rootdir']
262
+ full_path = @paths.fullpath(item['rootdir'],item['path'])
263
+ else
264
+ full_path = @paths.fullpath('default_path',item['path'])
265
+ end
266
+ inc_array.insert(-1, File.join("$PROJ_DIR$", @paths.relpath(proj_path, full_path)))
267
+ end
268
+ settings = {'Cads' =>
269
+ { 'VariousControls' =>
270
+ {
271
+ 'IncludePath' => inc_array
272
+ }
273
+ }
274
+ }
275
+ add_specific(target_node, settings)
276
+ end
277
+
278
+ def target_cc_flags(target_node, doc)
279
+ flags_array = Array.new
280
+ doc.each do |item|
281
+ if item.class == Hash
282
+ item.each do |key, value|
283
+ flags_array.insert(-1, "#{key}=#{value}")
284
+ end
285
+ else
286
+ flags_array.insert(-1, item)
287
+ end
288
+ end
289
+ settings = {'Cads' =>
290
+ { 'VariousControls' =>
291
+ {
292
+ 'MiscControls' => flags_array
293
+ }
294
+ }
295
+ }
296
+ add_specific(target_node, settings)
297
+ end
298
+
299
+ def target_cxx_predefines(target_node, doc)
300
+ target_cc_predefines(target_node, doc)
301
+ end
302
+
303
+ def target_cxx_preincludes(target_node, doc)
304
+ target_cc_preincludes(target_node, doc)
305
+ end
306
+
307
+ def target_cxx_defines(target_node, doc)
308
+ target_cc_defines(target_node, doc)
309
+ end
310
+
311
+ def target_cxx_include(target_node, doc)
312
+ target_cc_include(target_node, doc)
313
+ end
314
+
315
+ def target_cxx_flags(target_node, doc)
316
+ target_cc_flags(target_node, doc)
317
+ end
318
+
319
+ def target_ld_flags(target_node, doc)
320
+ flags_array = Array.new
321
+ doc.each do |item|
322
+ if item.class == Hash
323
+ item.each do |key, value|
324
+ flags_array.insert(-1, "#{key}=#{value}")
325
+ end
326
+ else
327
+ flags_array.insert(-1, item)
328
+ end
329
+ end
330
+ settings = {'LDads' =>
331
+ { 'Misc' => flags_array }
332
+ }
333
+ add_specific(target_node, settings)
334
+ end
335
+
336
+ def target_libraries(target_node, doc)
337
+ flags_array = Array.new
338
+ doc.each do |item|
339
+ if item.class == Hash
340
+ item.each do |key, value|
341
+ flags_array.insert(-1, "#{key}=#{value}")
342
+ end
343
+ else
344
+ flags_array.insert(-1, item)
345
+ end
346
+ end
347
+ settings = {'LDads' =>
348
+ { 'Misc' => flags_array }
349
+ }
350
+ add_specific(target_node, settings)
351
+ end
352
+
353
+ def target_linker_file(target_node, doc)
354
+ o_path = get_output_dir(Project::TOOLCHAIN, @paths.rootdir_table)
355
+ proj_path = File.join(@paths.rootdir_table['output_root'], o_path)
356
+ inc_array = Array.new
357
+ if doc.has_key?("rootdir")
358
+ full_path = @paths.fullpath(doc['rootdir'],doc['path'])
359
+ else
360
+ full_path = @paths.fullpath('default_path',doc['path'])
361
+ end
362
+ inc_array.insert(-1, File.join("$PROJ_DIR$", @paths.relpath(proj_path, full_path)))
363
+ settings = {'LDads' =>
364
+ { 'ScatterFile' => inc_array.join(" ") }
365
+ }
366
+ add_specific(target_node, settings)
367
+ end
368
+
369
+ def target_outdir(target_node, doc)
370
+ =begin
371
+ <option>
372
+ <name>IlinkOutputFile</name>
373
+ <state>K70_pit_drivers_test.out</state>
374
+ </option>
375
+ =end
376
+ settings = { 'OutputDirectory' => "#{get_output_dir(Project::TOOLCHAIN, @paths.rootdir_table)}"}
377
+ set_specific(target_node, settings)
378
+ settings = { 'OutputName' => "#{get_project_name()}"}
379
+ set_specific(target_node, settings)
380
+ end
381
+
382
+ end
383
+
384
+ class Project_set
385
+ include UVMWP
386
+ include UNI_Project
387
+ TOOLCHAIN='mdk'
388
+
389
+ # initialize EWW class
390
+ # PARAMS:
391
+ # - project_data: specific project data format for a application/library
392
+ # - generator_variable: all dependency in hash
393
+ def initialize(project_data, generator_variable, logger = nil)
394
+ @logger = logger
395
+ unless (logger)
396
+ @logger = Logger.new(STDOUT)
397
+ @logger.level = Logger::WARN
398
+ end
399
+ set_hash(project_data)
400
+ @project_name = get_project_name()
401
+ @board = get_board()
402
+ @paths = PathModifier.new(generator_variable["paths"])
403
+ @all_projects_hash = generator_variable["all"]
404
+ @mdk_project_files = {"project_mpw" => nil,".xsd" => nil}
405
+ return nil if get_template(Project_set::TOOLCHAIN).nil?
406
+ get_template(Project_set::TOOLCHAIN).each do |template|
407
+ ext = File.extname(template)
408
+ if @mdk_project_files.keys.include?(ext)
409
+ path = @paths.fullpath("default_path",template)
410
+ case ext
411
+ when ".xsd"
412
+ fn = File.basename(path, ".xsd")
413
+ @logger.info "#{fn} processing"
414
+ if fn == "project_mpw"
415
+ #doc = Nokogiri::XML(open(path))
416
+ string_xml = XsdPopulator.new(:xsd => path).populated_xml
417
+ doc = Nokogiri::XML(string_xml)
418
+ @mdk_project_files['project_mpw'] = doc
419
+ init_project_set(doc, get_default_projectset_settings(Project_set::TOOLCHAIN))
420
+ end
421
+ else
422
+ @logger.info "#{ext} not processed"
423
+ end
424
+ end
425
+ end
426
+ end
427
+
428
+ def generator()
429
+ return if not is_toolchain_support(Project::TOOLCHAIN)
430
+ add_project_to_set()
431
+ save_set()
432
+ end
433
+
434
+
435
+ def add_project_to_set()
436
+ return if @mdk_project_files.nil?
437
+ return if @mdk_project_files['project_mpw'].nil?
438
+ ext = "project_mpw"
439
+ #add projects
440
+ file = "#{@project_name}_#{@board}.uvprojx"
441
+ add_project(@mdk_project_files[ext], file)
442
+ #add library projects here
443
+ #get from dependency['libraries'][library_name]
444
+ ustruct = @all_projects_hash
445
+ return if get_libraries(Project_set::TOOLCHAIN).nil?
446
+ get_libraries(Project_set::TOOLCHAIN).each do |lib|
447
+ if ustruct[lib].nil?
448
+ @logger.info "#{lib} information is missing in all hash"
449
+ next
450
+ end
451
+ libname = "#{@project_name}"
452
+ root = @paths.rootdir_table[@ustruct[library][tool_key]['outdir']['root-dir']]
453
+ lib_path = File.join(root, @ustruct[library][tool_key]['outdir']['path'], libname)
454
+ if @ustruct[ project_name ][ tool_key ].has_key?('outdir')
455
+ wspath = File.join(@output_rootdir, @ustruct[ project_name ][ tool_key ][ 'outdir' ] )
456
+ else
457
+ wspath = @output_rootdir
458
+ end
459
+ path = Pathname.new(lib_path).relative_path_from(Pathname.new(wspath))
460
+
461
+ add_project(@mdk_project_files[ext], path)
462
+ end
463
+
464
+ end
465
+
466
+ def save_set()
467
+ path = get_output_dir(Project_set::TOOLCHAIN, @paths.rootdir_table)
468
+ @logger.info @paths.rootdir_table['output_root']
469
+ @logger.info path
470
+ @logger.info "#{@project_name}_#{@board}"
471
+ if path.class == Hash
472
+ save(@mdk_project_files['project_mpw'], File.join(@paths.rootdir_table[path['rootdir']], path['path'], "#{@project_name}_#{@board}.uvmpw"))
473
+ else
474
+ save(@mdk_project_files['project_mpw'], File.join(@paths.rootdir_table['output_root'], path, "#{@project_name}_#{@board}.uvmpw"))
475
+ end
476
+ end
477
+
478
+ end
479
+
480
+ end # end Module MDK
@@ -0,0 +1,91 @@
1
+
2
+ require 'nokogiri'
3
+
4
+
5
+ module UVMWP
6
+ @@data_provider = {
7
+ "SchemaVersion" => "2.1",
8
+ "Header" => "### uVision Project, (C) Keil Software",
9
+ "WorkspaceName" => "WorkSpace"
10
+ }
11
+ @@data_remove = ["Sle7"]
12
+ def add_node(pnode, hash_data, use_old: false)
13
+ hash_data.each do |key,value|
14
+ if use_old
15
+ sv = pnode.at_xpath(key)
16
+ end
17
+ unless (sv)
18
+ sv = Nokogiri::XML::Node.new(key, xml)
19
+ pnode << sv
20
+ end
21
+ if value.class == Hash
22
+ add_node(sv, value, use_old)
23
+ elsif value.class == Array
24
+ value.each do |va|
25
+ nsv = Nokogiri::XML::Node.new(key, xml)
26
+ sv << nsv
27
+ nsv.content = va
28
+ end
29
+ else
30
+ sv.content = value
31
+ end
32
+ end
33
+ end
34
+
35
+ def travesernode(node)
36
+ if node.children
37
+ tname = node.name
38
+ if @@data_provider.has_key?(tname)
39
+ node.content = @@data_provider[tname]
40
+ end
41
+ end
42
+ node.children.each do |subnode|
43
+ next if subnode.nil?
44
+ travesernode(subnode)
45
+ end
46
+ end
47
+ def init_project_set(xml, settings)
48
+ workspace_node = xml.at_xpath("ProjectWorkspace")
49
+ travesernode(workspace_node)
50
+ workspace_node.set_attribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance")
51
+ workspace_node.set_attribute("xsi:noNamespaceSchemaLocation","project_mpw.xsd")
52
+ dummy_project = workspace_node.at_xpath("/ProjectWorkspace/project")
53
+ dummy_project.set_attribute("template","1")
54
+ @@data_remove.each do |node|
55
+ nt = workspace_node.at_xpath(node)
56
+ nt.remove if ! nt.nil?
57
+ end
58
+ end
59
+
60
+
61
+ def add_project(xml , project_path)
62
+ # find <ProjectWorkspace>
63
+ workspace_node = xml.at_xpath("/ProjectWorkspace")
64
+ Core.assert(workspace_node, "no <workspace> present")
65
+ templat_project = workspace_node.at_xpath("project[@template='1']")
66
+ new_project = templat_project.dup
67
+ # add <PathAndName>
68
+ path_node = new_project.at_xpath("PathAndName")
69
+ path_node.content = project_path
70
+ workspace_node << new_project
71
+ new_project.at_xpath("NodeIsActive").content = 0
72
+ new_project.at_xpath("NodeIsExpanded").content = 0
73
+ new_project.remove_attribute("template")
74
+ # add project into existing lists
75
+ #@projects[ project_path ] = project_node
76
+ end
77
+
78
+ def save(xml, path)
79
+ Core.assert(path.is_a?(String)) do
80
+ "param is not a string #{path.class.name}"
81
+ end
82
+ workspace_node = xml.at_xpath("/ProjectWorkspace")
83
+ Core.assert(workspace_node, "no <workspace> present")
84
+ #remove old project
85
+ templat_project = workspace_node.at_xpath("project[@template='1']")
86
+ templat_project.remove if ! templat_project.nil?
87
+ FileUtils.mkdir_p File.dirname(path) if ! File.exist?(File.dirname(path))
88
+ File.write(path, xml.to_xml)
89
+ end
90
+
91
+ end
@@ -0,0 +1,278 @@
1
+ require 'nokogiri'
2
+ require 'pathname'
3
+
4
+ class Hash
5
+ def to_xml(doc)
6
+ return if doc.nil?
7
+ self.each do |key, value|
8
+ mynode = Nokogiri::XML::Node.new key, doc
9
+ doc.add_child mynode
10
+ value.to_xml(mynode) if value.class == Hash
11
+ mynode.content = value if value.class == String or value.class == Fixnum
12
+ end
13
+ return doc
14
+ end #end to_xml
15
+ def to_xml!(doc)
16
+ return if doc.nil?
17
+ self.each do |key, value|
18
+ if doc.css("/#{key}").count == 0
19
+ mynode = Nokogiri::XML::Node.new key, doc
20
+ else
21
+ mynode = doc.css("/#{key}")[0]
22
+ end
23
+ doc.add_child mynode
24
+ value.to_xml(mynode) if value.class == Hash
25
+ mynode.content = value if value.class == String or value.class == Fixnum
26
+ end
27
+ return doc
28
+ end #end to_xml!
29
+ end #end Hash
30
+
31
+ module UVPROJX
32
+ def travesernode(node)
33
+ if node.children
34
+ content = node.content
35
+ if @@data_provider.has_key?(content.strip)
36
+ node.content = @@data_provider[content.strip]
37
+ end
38
+ end
39
+ node.children.each do |subnode|
40
+ next if subnode.nil?
41
+ travesernode(subnode)
42
+ end
43
+
44
+ end
45
+ def init_project(xml, settings)
46
+ project_node = xml.at_xpath("Project")
47
+ travesernode(project_node)
48
+ #puts workspace_node
49
+ #puts xml
50
+ #mdkProvider.take(:title) # => 'The Monkey Wrench Gang'
51
+ #mdkProvider.take(:author) # => 'Edward Abbey'
52
+ #mdkProvider.take(:display_title) # => 'Edward Abbey - The Monkey Wrench Gang'
53
+ #mdkProvider.take(:price) # => 9.99
54
+ end
55
+
56
+ def load_node(doc, xpath)
57
+ return doc.xpath(xpath)
58
+ end
59
+
60
+ def new_target(target, doc, name = 'debug')
61
+ nset = load_node(doc, "//Targets/Target")
62
+ #use existing one
63
+ nset.each do |element|
64
+ if element.css("TargetName").text.downcase == target.downcase
65
+ puts "find existing #{element.css("/TargetName").text.downcase}"
66
+ return element
67
+ end
68
+ end
69
+ #create new one
70
+ nset.each do |element|
71
+ #use the first available configuration
72
+ @logger.info "add target #{target}"
73
+ t = element.dup
74
+ t.at_css("TargetName").content = target
75
+ #doc.xpath("/project") << t
76
+ element.add_previous_sibling(t)
77
+ return t
78
+ end
79
+ nil
80
+ end
81
+
82
+ # remove_targets remove unused targets
83
+ # Params:
84
+ # - doc: the xml node project file
85
+ # - targets_in: used target array (will keep)
86
+ def remove_targets(doc, targets_in)
87
+ #remove the target that not in the targets_in
88
+ nset = load_node(doc, "//Targets/Target")
89
+ targets_in.collect{|x| x.downcase}
90
+ nset.each do |element|
91
+ target = element.xpath("TargetName").text.downcase
92
+ if !targets_in.include?(target)
93
+ element.remove
94
+ end
95
+ end
96
+ end
97
+
98
+ # remove_sources remove source files
99
+ # Params:
100
+ # - doc: the xml node project file
101
+ def remove_sources(doc)
102
+ groups = load_node(doc, "//Group")
103
+ groups.each do |ele|
104
+ ele.remove
105
+ end
106
+ files = load_node(doc, "//File")
107
+ files.each do |ele|
108
+ ele.remove
109
+ end
110
+ end
111
+ # remove_sources remove unused node
112
+ # Params:
113
+ # - doc: the xml node project file
114
+ # - xpath: xpath to the node
115
+ # - **names: node attribute that need to remove defined in hash
116
+ def remove_unused(doc, xpath, **names)
117
+ nset = load_node(doc, xpath)
118
+ nset.each do |element|
119
+ names.each do |key, value|
120
+ if element.xpath(key).text.downcase == value.downcase
121
+ element.remove
122
+ end
123
+ end
124
+ end
125
+ end
126
+
127
+ # create_node convert hash to xml and add to doc
128
+ # Params:
129
+ # - doc: the xml node project file
130
+ # - hash_value: hash that defines the nodes structure
131
+ def create_node(doc, hash_value)
132
+ hash_value.to_xml!(doc)
133
+ end
134
+
135
+ # append_node convert hash to xml and append to doc
136
+ # Params:
137
+ # - doc: the xml node project file
138
+ # - hash_value: hash that defines the nodes structure
139
+ def append_node(doc, hash_value)
140
+ hash_value.to_xml(doc)
141
+ end
142
+
143
+ # add_specific
144
+ # Params:
145
+ # - doc: hash to add to target
146
+ # - target_node: node to be added to
147
+ # - note:
148
+ # can not add none exist node for mdk xml
149
+ def add_specific(target_node, doc)
150
+ doc.each do |key, value|
151
+ options = target_node.xpath(key)
152
+ options.each do |option|
153
+ if value.class == Hash
154
+ value.each do |subnode|
155
+ add_specific(option, subnode)
156
+ end
157
+ elsif value.class == String
158
+ option.content += ";#{value}"
159
+ elsif value.class == Array
160
+ value.each do |line|
161
+ option.content += ";#{line}"
162
+ end
163
+ else
164
+ puts "not support by set_specific #{value}"
165
+ end
166
+ end
167
+ end
168
+ end
169
+ # set_specific
170
+ # Params:
171
+ # - doc: hash to add to target
172
+ # - target_node: node to be added to
173
+ # - note:
174
+ # can not add none exist node for mdk xml
175
+ def set_specific(target_node, doc)
176
+ doc.each do |key, value|
177
+ options = target_node.xpath(key)
178
+ options.each do |option|
179
+ if value.class == Hash
180
+ value.each do |subnode|
181
+ add_specific(option, subnode)
182
+ end
183
+ elsif value.class == String
184
+ option.content = value
185
+ break
186
+ elsif value.class == Array
187
+ option.content = ""
188
+ value.each do |line|
189
+ option.content += ";#{line}"
190
+ end
191
+ break
192
+ else
193
+ puts "not support by set_specific #{value}"
194
+ end
195
+ end
196
+ end
197
+ end
198
+
199
+ def save(xml, path)
200
+ Core.assert(path.is_a?(String)) do
201
+ "param is not a string #{path.class.name}"
202
+ end
203
+ FileUtils.mkdir_p File.dirname(path) if ! File.exist?(File.dirname(path))
204
+ File.write(path, xml.to_xml)
205
+ end
206
+
207
+ def add_sources(doc, source_hash, path_mod, proj_path)
208
+ groups_existing = Array.new
209
+ files_hash = Hash.new
210
+ source_hash.each do |src|
211
+ rootdir = src['rootdir']
212
+ virtual_dir = src['virtual_dir'] if src.has_key? 'virtual_dir'
213
+ virtual_dir = src['virtual-dir'] if src.has_key? 'virtual-dir'
214
+ if src.has_key?('path')
215
+ path = src['path']
216
+ else
217
+ path = src['source']
218
+ end
219
+ if virtual_dir
220
+ if ! groups_existing.include?(virtual_dir)
221
+ groups_existing.insert(-1, virtual_dir)
222
+ node = Nokogiri::XML::Node.new 'Group', doc
223
+ node << "<GroupName>#{virtual_dir}</GroupName>"
224
+ doc << node
225
+ end
226
+ files_hash[virtual_dir] = Array.new if files_hash[virtual_dir].nil?
227
+ files_hash[virtual_dir].insert(-1, {'path' => path, 'rootdir' => rootdir})
228
+ else
229
+ #create a common src group
230
+ if ! groups_existing.include?("_src")
231
+ groups_existing.insert(-1, "_src")
232
+ node = Nokogiri::XML::Node.new 'Group', doc
233
+ node << "<GroupName>_src</GroupName>"
234
+ doc << node
235
+ end
236
+ files_hash["_src"] = Array.new if files_hash["_src"].nil?
237
+ files_hash["_src"].insert(-1, {'path' => path, 'rootdir' => rootdir})
238
+ end
239
+ end #end source_hash
240
+ doc.css("Group").each do |node|
241
+ files_hash[node.at_css("GroupName").text].each do |file|
242
+ gfiles = Nokogiri::XML::Node.new('Files', node)
243
+ gfile = Nokogiri::XML::Node.new('File', gfiles)
244
+ sfile = Nokogiri::XML::Node.new('FileName', gfiles)
245
+ spfile = Nokogiri::XML::Node.new('FilePath', gfiles)
246
+ if file['rootdir']
247
+ full_path = path_mod.fullpath(file['rootdir'],file['path'])
248
+ else
249
+ full_path = path_mod.fullpath('default_path',file['path'])
250
+ end
251
+ sfile.content = File.basename(file['path'])
252
+ spfile.content = File.join("$PROJ_DIR$", path_mod.relpath(proj_path, full_path))
253
+ gfile << sfile
254
+ gfile << spfile
255
+ gfiles << gfile
256
+ node << gfiles
257
+ end
258
+ end
259
+ return if files_hash["_src"].nil?
260
+ files_hash["_src"].each do |file|
261
+ gfiles = Nokogiri::XML::Node.new('File', doc)
262
+ gfile = Nokogiri::XML::Node.new('File', gfiles)
263
+ sfile = Nokogiri::XML::Node.new('FileName', gfiles)
264
+ spfile = Nokogiri::XML::Node.new('FilePath', gfiles)
265
+ if file['rootdir']
266
+ full_path = path_mod.fullpath(file['rootdir'],file['path'])
267
+ else
268
+ full_path = path_mod.fullpath('default_path',file['path'])
269
+ end
270
+ spfile.content = File.join("$PROJ_DIR$", path_mod.relpath(proj_path, full_path))
271
+ sfile.content = File.basename(file['path'])
272
+ gfile << sfile
273
+ gfile << spfile
274
+ gfiles << gfile
275
+ node << gfiles
276
+ end
277
+ end
278
+ end
@@ -1,6 +1,7 @@
1
1
 
2
2
  require_relative 'adapter/iar'
3
3
  require_relative 'adapter/cmake'
4
+ require_relative 'adapter/mdk'
4
5
  require 'logger'
5
6
 
6
7
  class Generator
@@ -28,7 +29,7 @@ class Generator
28
29
  when 'iar'
29
30
  IAR::Project.new(project_data, @generator_variable, @logger).generator(filter, project_data)
30
31
  when 'mdk'
31
- @logger.info "mdk TBD"
32
+ MDK::Project.new(project_data, @generator_variable, @logger).generator(filter, project_data)
32
33
  when 'cmake'
33
34
  CMAKE::Project.new(project_data, @generator_variable, @logger).generator(filter, project_data)
34
35
  end
@@ -39,7 +40,7 @@ class Generator
39
40
  when 'iar'
40
41
  IAR::Project_set.new(project_data, @generator_variable, @logger).generator()
41
42
  when 'mdk'
42
- @logger.info "mdk TBD"
43
+ MDK::Project_set.new(project_data, @generator_variable, @logger).generator()
43
44
  when 'cmake'
44
45
  @logger.info "cmake TBD"
45
46
  end
@@ -235,7 +235,7 @@ class Translator
235
235
  @data_out[proj]['type'] = @data_in[proj]['section-type']
236
236
  end
237
237
  convert_rules(proj,'iar')
238
- #convert_rules(proj,'uv4')
238
+ convert_rules(proj,'mdk')
239
239
  convert_rules(proj,'cmake')
240
240
  #convert_rules(proj,'armgcc')
241
241
  #convert_rules(proj,'kds')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ebngen
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.6
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hake Huang
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-06-26 00:00:00.000000000 Z
12
+ date: 2017-10-30 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: embedded project generator
15
15
  email: hakehuang@gmail.com
@@ -29,6 +29,9 @@ files:
29
29
  - lib/ebngen/adapter/iar/ewd.rb
30
30
  - lib/ebngen/adapter/iar/ewp.rb
31
31
  - lib/ebngen/adapter/iar/eww.rb
32
+ - lib/ebngen/adapter/mdk.rb
33
+ - lib/ebngen/adapter/mdk/uvmwp.rb
34
+ - lib/ebngen/adapter/mdk/uvprojx.rb
32
35
  - lib/ebngen/assembly.rb
33
36
  - lib/ebngen/ebngen.rb
34
37
  - lib/ebngen/generate.rb