ebngen 1.0.4 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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,22 +1,22 @@
1
- require 'pathname'
2
- require "deep_merge"
3
-
4
- class Assembly
5
- def initialize(options)
6
- @internal_hash = options
7
- end
8
- def assembly(project_name, key = "__add__")
9
- @internal_hash[project_name][key].each do |submodule|
10
- @internal_hash[project_name].deep_merge(deep_copy(@internal_hash[submodule]))
11
- end
12
- @internal_hash[project_name].delete(key)
13
- @internal_hash.keys.each do |subkey|
14
- next if subkey == project_name
15
- @internal_hash.delete(subkey)
16
- end
17
- end
18
-
19
- def deep_copy(o)
20
- Marshal.load(Marshal.dump(o))
21
- end
22
- end
1
+ require 'pathname'
2
+ require "deep_merge"
3
+
4
+ class Assembly
5
+ def initialize(options)
6
+ @internal_hash = options
7
+ end
8
+ def assembly(project_name, key = "__add__")
9
+ @internal_hash[project_name][key].each do |submodule|
10
+ @internal_hash[project_name].deep_merge(deep_copy(@internal_hash[submodule]))
11
+ end
12
+ @internal_hash[project_name].delete(key)
13
+ @internal_hash.keys.each do |subkey|
14
+ next if subkey == project_name
15
+ @internal_hash.delete(subkey)
16
+ end
17
+ end
18
+
19
+ def deep_copy(o)
20
+ Marshal.load(Marshal.dump(o))
21
+ end
22
+ end
data/lib/ebngen/ebngen.rb CHANGED
@@ -1,4 +1,4 @@
1
- require_relative 'generate.rb'
2
- require_relative 'unifmt.rb'
3
- require_relative 'assembly.rb'
1
+ require_relative 'generate.rb'
2
+ require_relative 'unifmt.rb'
3
+ require_relative 'assembly.rb'
4
4
  require_relative 'translate.rb'
@@ -1,48 +1,49 @@
1
-
2
- require_relative 'adapter/iar'
3
- require_relative 'adapter/cmake'
4
- require 'logger'
5
-
6
- class Generator
7
- attr_accessor :generator_variable
8
- def initialize(options, logger = nil)
9
- @logger = logger
10
- unless (logger)
11
- @logger = Logger.new(STDOUT)
12
- @logger.level = Logger::INFO
13
- end
14
- @generator_variable = options
15
- if @generator_variable.class != Hash
16
- puts "failure options shall be a hash"
17
- return
18
- end
19
- if @generator_variable.has_key?('all') and @generator_variable.has_key?('paths')
20
- @logger.info "input setting is ok"
21
- else
22
- @logger.info "input settings is wrong"
23
- end
24
- end
25
-
26
- def generate_projects(tool_chain, filter, project_data)
27
- case tool_chain.downcase
28
- when 'iar'
29
- IAR::Project.new(project_data, @generator_variable, @logger).generator(filter, project_data)
30
- when 'mdk'
31
- @logger.info "mdk TBD"
32
- when 'cmake'
33
- CMAKE::Project.new(project_data, @generator_variable, @logger).generator(filter, project_data)
34
- end
35
- end
36
-
37
- def generate_project_set(tool_chain, project_data)
38
- case tool_chain.downcase
39
- when 'iar'
40
- IAR::Project_set.new(project_data, @generator_variable, @logger).generator()
41
- when 'mdk'
42
- @logger.info "mdk TBD"
43
- when 'armgcc'
44
- @logger.info "armgcc TBD"
45
- end
46
- end
47
-
1
+
2
+ require_relative 'adapter/iar'
3
+ require_relative 'adapter/cmake'
4
+ require_relative 'adapter/mdk'
5
+ require 'logger'
6
+
7
+ class Generator
8
+ attr_accessor :generator_variable
9
+ def initialize(options, logger = nil)
10
+ @logger = logger
11
+ unless (logger)
12
+ @logger = Logger.new(STDOUT)
13
+ @logger.level = Logger::INFO
14
+ end
15
+ @generator_variable = options
16
+ if @generator_variable.class != Hash
17
+ puts "failure options shall be a hash"
18
+ return
19
+ end
20
+ if @generator_variable.has_key?('all') and @generator_variable.has_key?('paths')
21
+ @logger.info "input setting is ok"
22
+ else
23
+ @logger.info "input settings is wrong"
24
+ end
25
+ end
26
+
27
+ def generate_projects(tool_chain, filter, project_data)
28
+ case tool_chain.downcase
29
+ when 'iar'
30
+ IAR::Project.new(project_data, @generator_variable, @logger).generator(filter, project_data)
31
+ when 'mdk'
32
+ MDK::Project.new(project_data, @generator_variable, @logger).generator(filter, project_data)
33
+ when 'cmake'
34
+ CMAKE::Project.new(project_data, @generator_variable, @logger).generator(filter, project_data)
35
+ end
36
+ end
37
+
38
+ def generate_project_set(tool_chain, project_data)
39
+ case tool_chain.downcase
40
+ when 'iar'
41
+ IAR::Project_set.new(project_data, @generator_variable, @logger).generator()
42
+ when 'mdk'
43
+ MDK::Project_set.new(project_data, @generator_variable, @logger).generator()
44
+ when 'cmake'
45
+ @logger.info "cmake TBD"
46
+ end
47
+ end
48
+
48
49
  end