]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFsp2Pkg/Tools/FspDscBsf2Yaml.py
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / IntelFsp2Pkg / Tools / FspDscBsf2Yaml.py
CommitLineData
27326112
LTL
1#!/usr/bin/env python\r
2## @ FspDscBsf2Yaml.py\r
3# This script convert DSC or BSF format file into YAML format\r
4#\r
5# Copyright(c) 2021, Intel Corporation. All rights reserved.<BR>\r
6# SPDX-License-Identifier: BSD-2-Clause-Patent\r
7#\r
8##\r
9\r
10import os\r
11import re\r
12import sys\r
580b1120 13\r
27326112 14from collections import OrderedDict\r
580b1120 15from datetime import date\r
27326112 16\r
580b1120 17from FspGenCfgData import CFspBsf2Dsc, CGenCfgData\r
27326112
LTL
18\r
19__copyright_tmp__ = """## @file\r
20#\r
580b1120 21# Slim Bootloader CFGDATA %s File.\r
27326112 22#\r
580b1120 23# Copyright (c) %4d, Intel Corporation. All rights reserved.<BR>\r
27326112
LTL
24# SPDX-License-Identifier: BSD-2-Clause-Patent\r
25#\r
26##\r
27"""\r
28\r
27326112
LTL
29\r
30class CFspDsc2Yaml():\r
31\r
32 def __init__(self):\r
33 self._Hdr_key_list = ['EMBED', 'STRUCT']\r
580b1120
LTL
34 self._Bsf_key_list = ['NAME', 'HELP', 'TYPE', 'PAGE', 'PAGES',\r
35 'OPTION', 'CONDITION', 'ORDER', 'MARKER',\r
36 'SUBT', 'FIELD', 'FIND']\r
27326112 37 self.gen_cfg_data = None\r
580b1120
LTL
38 self.cfg_reg_exp = re.compile(\r
39 "^([_a-zA-Z0-9$\\(\\)]+)\\s*\\|\\s*(0x[0-9A-F]+|\\*)"\r
40 "\\s*\\|\\s*(\\d+|0x[0-9a-fA-F]+)\\s*\\|\\s*(.+)")\r
41 self.bsf_reg_exp = re.compile("(%s):{(.+?)}(?:$|\\s+)"\r
42 % '|'.join(self._Bsf_key_list))\r
43 self.hdr_reg_exp = re.compile("(%s):{(.+?)}"\r
44 % '|'.join(self._Hdr_key_list))\r
27326112
LTL
45 self.prefix = ''\r
46 self.unused_idx = 0\r
47 self.offset = 0\r
48 self.base_offset = 0\r
49\r
50 def load_config_data_from_dsc(self, file_name):\r
51 """\r
52 Load and parse a DSC CFGDATA file.\r
53 """\r
580b1120 54 gen_cfg_data = CGenCfgData('FSP')\r
27326112 55 if file_name.endswith('.dsc'):\r
580b1120 56 if gen_cfg_data.ParseDscFile(file_name) != 0:\r
27326112
LTL
57 raise Exception('DSC file parsing error !')\r
58 if gen_cfg_data.CreateVarDict() != 0:\r
59 raise Exception('DSC variable creation error !')\r
60 else:\r
61 raise Exception('Unsupported file "%s" !' % file_name)\r
580b1120 62 gen_cfg_data.UpdateDefaultValue()\r
27326112
LTL
63 self.gen_cfg_data = gen_cfg_data\r
64\r
65 def print_dsc_line(self):\r
66 """\r
67 Debug function to print all DSC lines.\r
68 """\r
69 for line in self.gen_cfg_data._DscLines:\r
70 print(line)\r
71\r
72 def format_value(self, field, text, indent=''):\r
73 """\r
74 Format a CFGDATA item into YAML format.\r
75 """\r
580b1120 76 if (not text.startswith('!expand')) and (': ' in text):\r
27326112
LTL
77 tgt = ':' if field == 'option' else '- '\r
78 text = text.replace(': ', tgt)\r
79 lines = text.splitlines()\r
80 if len(lines) == 1 and field != 'help':\r
81 return text\r
82 else:\r
580b1120
LTL
83 return '>\n ' + '\n '.join(\r
84 [indent + i.lstrip() for i in lines])\r
27326112
LTL
85\r
86 def reformat_pages(self, val):\r
87 # Convert XXX:YYY into XXX::YYY format for page definition\r
88 parts = val.split(',')\r
89 if len(parts) <= 1:\r
90 return val\r
91\r
92 new_val = []\r
93 for each in parts:\r
94 nodes = each.split(':')\r
95 if len(nodes) == 2:\r
96 each = '%s::%s' % (nodes[0], nodes[1])\r
97 new_val.append(each)\r
98 ret = ','.join(new_val)\r
99 return ret\r
100\r
101 def reformat_struct_value(self, utype, val):\r
102 # Convert DSC UINT16/32/64 array into new format by\r
103 # adding prefix 0:0[WDQ] to provide hint to the array format\r
104 if utype in ['UINT16', 'UINT32', 'UINT64']:\r
105 if val and val[0] == '{' and val[-1] == '}':\r
106 if utype == 'UINT16':\r
107 unit = 'W'\r
108 elif utype == 'UINT32':\r
109 unit = 'D'\r
110 else:\r
111 unit = 'Q'\r
112 val = '{ 0:0%s, %s }' % (unit, val[1:-1])\r
113 return val\r
114\r
115 def process_config(self, cfg):\r
116 if 'page' in cfg:\r
117 cfg['page'] = self.reformat_pages(cfg['page'])\r
118\r
119 if 'struct' in cfg:\r
580b1120
LTL
120 cfg['value'] = self.reformat_struct_value(\r
121 cfg['struct'], cfg['value'])\r
27326112
LTL
122\r
123 def parse_dsc_line(self, dsc_line, config_dict, init_dict, include):\r
124 """\r
125 Parse a line in DSC and update the config dictionary accordingly.\r
126 """\r
127 init_dict.clear()\r
580b1120
LTL
128 match = re.match('g(CfgData|\\w+FspPkgTokenSpaceGuid)\\.(.+)',\r
129 dsc_line)\r
27326112
LTL
130 if match:\r
131 match = self.cfg_reg_exp.match(match.group(2))\r
132 if not match:\r
133 return False\r
134 config_dict['cname'] = self.prefix + match.group(1)\r
135 value = match.group(4).strip()\r
136 length = match.group(3).strip()\r
137 config_dict['length'] = length\r
138 config_dict['value'] = value\r
139 if match.group(2) == '*':\r
140 self.offset += int(length, 0)\r
141 else:\r
142 org_offset = int(match.group(2), 0)\r
143 if org_offset == 0:\r
144 self.base_offset = self.offset\r
145 offset = org_offset + self.base_offset\r
146 if self.offset != offset:\r
147 if offset > self.offset:\r
148 init_dict['padding'] = offset - self.offset\r
149 self.offset = offset + int(length, 0)\r
150 return True\r
151\r
580b1120 152 match = re.match("^\\s*#\\s+!([<>])\\s+include\\s+(.+)", dsc_line)\r
27326112
LTL
153 if match and len(config_dict) == 0:\r
154 # !include should not be inside a config field\r
155 # if so, do not convert include into YAML\r
156 init_dict = dict(config_dict)\r
157 config_dict.clear()\r
158 config_dict['cname'] = '$ACTION'\r
159 if match.group(1) == '<':\r
160 config_dict['include'] = match.group(2)\r
161 else:\r
162 config_dict['include'] = ''\r
163 return True\r
164\r
580b1120 165 match = re.match("^\\s*#\\s+(!BSF|!HDR)\\s+(.+)", dsc_line)\r
27326112
LTL
166 if not match:\r
167 return False\r
168\r
169 remaining = match.group(2)\r
170 if match.group(1) == '!BSF':\r
171 result = self.bsf_reg_exp.findall(remaining)\r
172 if not result:\r
173 return False\r
174\r
175 for each in result:\r
176 key = each[0].lower()\r
177 val = each[1]\r
178 if key == 'field':\r
179 name = each[1]\r
180 if ':' not in name:\r
181 raise Exception('Incorrect bit field format !')\r
182 parts = name.split(':')\r
183 config_dict['length'] = parts[1]\r
184 config_dict['cname'] = '@' + parts[0]\r
185 return True\r
186 elif key in ['pages', 'page', 'find']:\r
187 init_dict = dict(config_dict)\r
188 config_dict.clear()\r
189 config_dict['cname'] = '$ACTION'\r
190 if key == 'find':\r
191 config_dict['find'] = val\r
192 else:\r
193 config_dict['page'] = val\r
194 return True\r
195 elif key == 'subt':\r
196 config_dict.clear()\r
197 parts = each[1].split(':')\r
198 tmp_name = parts[0][:-5]\r
199 if tmp_name == 'CFGHDR':\r
200 cfg_tag = '_$FFF_'\r
580b1120
LTL
201 sval = '!expand { %s_TMPL : [ ' % \\r
202 tmp_name + '%s, %s, ' % (parts[1], cfg_tag) + \\r
203 ', '.join(parts[2:]) + ' ] }'\r
27326112 204 else:\r
580b1120
LTL
205 sval = '!expand { %s_TMPL : [ ' % \\r
206 tmp_name + ', '.join(parts[1:]) + ' ] }'\r
27326112
LTL
207 config_dict.clear()\r
208 config_dict['cname'] = tmp_name\r
209 config_dict['expand'] = sval\r
210 return True\r
211 else:\r
580b1120
LTL
212 if key in ['name', 'help', 'option'] and \\r
213 val.startswith('+'):\r
27326112
LTL
214 val = config_dict[key] + '\n' + val[1:]\r
215 if val.strip() == '':\r
216 val = "''"\r
217 config_dict[key] = val\r
218\r
219 else:\r
220 match = self.hdr_reg_exp.match(remaining)\r
221 if not match:\r
222 return False\r
223 key = match.group(1)\r
224 remaining = match.group(2)\r
225 if key == 'EMBED':\r
226 parts = remaining.split(':')\r
227 names = parts[0].split(',')\r
228 if parts[-1] == 'END':\r
229 prefix = '>'\r
230 else:\r
231 prefix = '<'\r
232 skip = False\r
233 if parts[1].startswith('TAG_'):\r
234 tag_txt = '%s:%s' % (names[0], parts[1])\r
235 else:\r
236 tag_txt = names[0]\r
237 if parts[2] in ['START', 'END']:\r
238 if names[0] == 'PCIE_RP_PIN_CTRL[]':\r
239 skip = True\r
240 else:\r
241 tag_txt = '%s:%s' % (names[0], parts[1])\r
242 if not skip:\r
243 config_dict.clear()\r
244 config_dict['cname'] = prefix + tag_txt\r
245 return True\r
246\r
247 if key == 'STRUCT':\r
248 text = remaining.strip()\r
249 config_dict[key.lower()] = text\r
250\r
251 return False\r
252\r
253 def process_template_lines(self, lines):\r
254 """\r
255 Process a line in DSC template section.\r
256 """\r
257 template_name = ''\r
258 bsf_temp_dict = OrderedDict()\r
259 temp_file_dict = OrderedDict()\r
260 include_file = ['.']\r
261\r
262 for line in lines:\r
580b1120 263 match = re.match("^\\s*#\\s+!([<>])\\s+include\\s+(.+)", line)\r
27326112
LTL
264 if match:\r
265 if match.group(1) == '<':\r
266 include_file.append(match.group(2))\r
267 else:\r
268 include_file.pop()\r
269\r
580b1120
LTL
270 match = re.match(\r
271 "^\\s*#\\s+(!BSF)\\s+DEFT:{(.+?):(START|END)}", line)\r
27326112
LTL
272 if match:\r
273 if match.group(3) == 'START' and not template_name:\r
274 template_name = match.group(2).strip()\r
275 temp_file_dict[template_name] = list(include_file)\r
276 bsf_temp_dict[template_name] = []\r
580b1120
LTL
277 if match.group(3) == 'END' and \\r
278 (template_name == match.group(2).strip()) and \\r
279 template_name:\r
27326112
LTL
280 template_name = ''\r
281 else:\r
282 if template_name:\r
283 bsf_temp_dict[template_name].append(line)\r
284 return bsf_temp_dict, temp_file_dict\r
285\r
286 def process_option_lines(self, lines):\r
287 """\r
288 Process a line in DSC config section.\r
289 """\r
290 cfgs = []\r
291 struct_end = False\r
292 config_dict = dict()\r
293 init_dict = dict()\r
294 include = ['']\r
295 for line in lines:\r
296 ret = self.parse_dsc_line(line, config_dict, init_dict, include)\r
297 if ret:\r
298 if 'padding' in init_dict:\r
299 num = init_dict['padding']\r
300 init_dict.clear()\r
301 padding_dict = {}\r
302 cfgs.append(padding_dict)\r
580b1120
LTL
303 padding_dict['cname'] = 'UnusedUpdSpace%d' % \\r
304 self.unused_idx\r
27326112
LTL
305 padding_dict['length'] = '0x%x' % num\r
306 padding_dict['value'] = '{ 0 }'\r
307 self.unused_idx += 1\r
308\r
580b1120
LTL
309 if cfgs and cfgs[-1]['cname'][0] != '@' and \\r
310 config_dict['cname'][0] == '@':\r
27326112
LTL
311 # it is a bit field, mark the previous one as virtual\r
312 cname = cfgs[-1]['cname']\r
313 new_cfg = dict(cfgs[-1])\r
314 new_cfg['cname'] = '@$STRUCT'\r
315 cfgs[-1].clear()\r
316 cfgs[-1]['cname'] = cname\r
317 cfgs.append(new_cfg)\r
318\r
580b1120
LTL
319 if cfgs and cfgs[-1]['cname'] == 'CFGHDR' and \\r
320 config_dict['cname'][0] == '<':\r
27326112
LTL
321 # swap CfgHeader and the CFG_DATA order\r
322 if ':' in config_dict['cname']:\r
323 # replace the real TAG for CFG_DATA\r
324 cfgs[-1]['expand'] = cfgs[-1]['expand'].replace(\r
325 '_$FFF_', '0x%s' %\r
326 config_dict['cname'].split(':')[1][4:])\r
327 cfgs.insert(-1, config_dict)\r
328 else:\r
329 self.process_config(config_dict)\r
330 if struct_end:\r
331 struct_end = False\r
332 cfgs.insert(-1, config_dict)\r
333 else:\r
334 cfgs.append(config_dict)\r
335 if config_dict['cname'][0] == '>':\r
336 struct_end = True\r
337\r
338 config_dict = dict(init_dict)\r
339 return cfgs\r
340\r
341 def variable_fixup(self, each):\r
342 """\r
343 Fix up some variable definitions for SBL.\r
344 """\r
345 key = each\r
346 val = self.gen_cfg_data._MacroDict[each]\r
347 return key, val\r
348\r
349 def template_fixup(self, tmp_name, tmp_list):\r
350 """\r
351 Fix up some special config templates for SBL\r
352 """\r
353 return\r
354\r
355 def config_fixup(self, cfg_list):\r
356 """\r
357 Fix up some special config items for SBL.\r
358 """\r
359\r
360 # Insert FSPT_UPD/FSPM_UPD/FSPS_UPD tag so as to create C strcture\r
361 idxs = []\r
362 for idx, cfg in enumerate(cfg_list):\r
363 if cfg['cname'].startswith('<FSP_UPD_HEADER'):\r
364 idxs.append(idx)\r
365\r
366 if len(idxs) != 3:\r
367 return\r
368\r
369 # Handle insert backwards so that the index does not change in the loop\r
370 fsp_comp = 'SMT'\r
371 idx_comp = 0\r
372 for idx in idxs[::-1]:\r
373 # Add current FSP?_UPD start tag\r
374 cfgfig_dict = {}\r
375 cfgfig_dict['cname'] = '<FSP%s_UPD' % fsp_comp[idx_comp]\r
376 cfg_list.insert(idx, cfgfig_dict)\r
377 if idx_comp < 2:\r
378 # Add previous FSP?_UPD end tag\r
379 cfgfig_dict = {}\r
380 cfgfig_dict['cname'] = '>FSP%s_UPD' % fsp_comp[idx_comp + 1]\r
381 cfg_list.insert(idx, cfgfig_dict)\r
382 idx_comp += 1\r
383\r
384 # Add final FSPS_UPD end tag\r
385 cfgfig_dict = {}\r
386 cfgfig_dict['cname'] = '>FSP%s_UPD' % fsp_comp[0]\r
387 cfg_list.append(cfgfig_dict)\r
388\r
389 return\r
390\r
391 def get_section_range(self, section_name):\r
392 """\r
393 Extract line number range from config file for a given section name.\r
394 """\r
395 start = -1\r
396 end = -1\r
397 for idx, line in enumerate(self.gen_cfg_data._DscLines):\r
398 if start < 0 and line.startswith('[%s]' % section_name):\r
399 start = idx\r
400 elif start >= 0 and line.startswith('['):\r
401 end = idx\r
402 break\r
403 if start == -1:\r
404 start = 0\r
405 if end == -1:\r
406 end = len(self.gen_cfg_data._DscLines)\r
407 return start, end\r
408\r
409 def normalize_file_name(self, file, is_temp=False):\r
410 """\r
411 Normalize file name convention so that it is consistent.\r
412 """\r
413 if file.endswith('.dsc'):\r
414 file = file[:-4] + '.yaml'\r
415 dir_name = os.path.dirname(file)\r
416 base_name = os.path.basename(file)\r
417 if is_temp:\r
418 if 'Template_' not in file:\r
419 base_name = base_name.replace('Template', 'Template_')\r
420 else:\r
421 if 'CfgData_' not in file:\r
422 base_name = base_name.replace('CfgData', 'CfgData_')\r
423 if dir_name:\r
424 path = dir_name + '/' + base_name\r
425 else:\r
426 path = base_name\r
427 return path\r
428\r
429 def output_variable(self):\r
430 """\r
431 Output variable block into a line list.\r
432 """\r
433 lines = []\r
434 for each in self.gen_cfg_data._MacroDict:\r
435 key, value = self.variable_fixup(each)\r
580b1120 436 lines.append('%-30s : %s' % (key, value))\r
27326112
LTL
437 return lines\r
438\r
439 def output_template(self):\r
440 """\r
441 Output template block into a line list.\r
442 """\r
443 self.offset = 0\r
444 self.base_offset = 0\r
445 start, end = self.get_section_range('PcdsDynamicVpd.Tmp')\r
580b1120
LTL
446 bsf_temp_dict, temp_file_dict = self.process_template_lines(\r
447 self.gen_cfg_data._DscLines[start:end])\r
27326112
LTL
448 template_dict = dict()\r
449 lines = []\r
450 file_lines = {}\r
451 last_file = '.'\r
452 file_lines[last_file] = []\r
453\r
454 for tmp_name in temp_file_dict:\r
580b1120
LTL
455 temp_file_dict[tmp_name][-1] = self.normalize_file_name(\r
456 temp_file_dict[tmp_name][-1], True)\r
27326112 457 if len(temp_file_dict[tmp_name]) > 1:\r
580b1120
LTL
458 temp_file_dict[tmp_name][-2] = self.normalize_file_name(\r
459 temp_file_dict[tmp_name][-2], True)\r
27326112
LTL
460\r
461 for tmp_name in bsf_temp_dict:\r
462 file = temp_file_dict[tmp_name][-1]\r
463 if last_file != file and len(temp_file_dict[tmp_name]) > 1:\r
464 inc_file = temp_file_dict[tmp_name][-2]\r
580b1120
LTL
465 file_lines[inc_file].extend(\r
466 ['', '- !include %s' % temp_file_dict[tmp_name][-1], ''])\r
27326112
LTL
467 last_file = file\r
468 if file not in file_lines:\r
469 file_lines[file] = []\r
470 lines = file_lines[file]\r
471 text = bsf_temp_dict[tmp_name]\r
472 tmp_list = self.process_option_lines(text)\r
473 self.template_fixup(tmp_name, tmp_list)\r
474 template_dict[tmp_name] = tmp_list\r
475 lines.append('%s: >' % tmp_name)\r
476 lines.extend(self.output_dict(tmp_list, False)['.'])\r
477 lines.append('\n')\r
478 return file_lines\r
479\r
480 def output_config(self):\r
481 """\r
482 Output config block into a line list.\r
483 """\r
484 self.offset = 0\r
485 self.base_offset = 0\r
486 start, end = self.get_section_range('PcdsDynamicVpd.Upd')\r
580b1120
LTL
487 cfgs = self.process_option_lines(\r
488 self.gen_cfg_data._DscLines[start:end])\r
27326112
LTL
489 self.config_fixup(cfgs)\r
490 file_lines = self.output_dict(cfgs, True)\r
491 return file_lines\r
492\r
493 def output_dict(self, cfgs, is_configs):\r
494 """\r
495 Output one config item into a line list.\r
496 """\r
497 file_lines = {}\r
498 level = 0\r
499 file = '.'\r
500 for each in cfgs:\r
580b1120
LTL
501 if 'length' in each:\r
502 if not each['length'].endswith('b') and int(each['length'],\r
503 0) == 0:\r
504 continue\r
27326112
LTL
505\r
506 if 'include' in each:\r
507 if each['include']:\r
580b1120
LTL
508 each['include'] = self.normalize_file_name(\r
509 each['include'])\r
510 file_lines[file].extend(\r
511 ['', '- !include %s' % each['include'], ''])\r
27326112
LTL
512 file = each['include']\r
513 else:\r
514 file = '.'\r
515 continue\r
516\r
517 if file not in file_lines:\r
518 file_lines[file] = []\r
519\r
520 lines = file_lines[file]\r
521 name = each['cname']\r
522\r
523 prefix = name[0]\r
524 if prefix == '<':\r
525 level += 1\r
526\r
527 padding = ' ' * level\r
528 if prefix not in '<>@':\r
529 padding += ' '\r
530 else:\r
531 name = name[1:]\r
532 if prefix == '@':\r
533 padding += ' '\r
534\r
535 if ':' in name:\r
536 parts = name.split(':')\r
537 name = parts[0]\r
538\r
539 padding = padding[2:] if is_configs else padding\r
540\r
541 if prefix != '>':\r
542 if 'expand' in each:\r
543 lines.append('%s- %s' % (padding, each['expand']))\r
544 else:\r
545 lines.append('%s- %-12s :' % (padding, name))\r
546\r
547 for field in each:\r
548 if field in ['cname', 'expand', 'include']:\r
549 continue\r
580b1120
LTL
550 value_str = self.format_value(\r
551 field, each[field], padding + ' ' * 16)\r
27326112
LTL
552 full_line = ' %s %-12s : %s' % (padding, field, value_str)\r
553 lines.extend(full_line.splitlines())\r
554\r
555 if prefix == '>':\r
556 level -= 1\r
557 if level == 0:\r
558 lines.append('')\r
559\r
560 return file_lines\r
561\r
562\r
563def bsf_to_dsc(bsf_file, dsc_file):\r
564 fsp_dsc = CFspBsf2Dsc(bsf_file)\r
565 dsc_lines = fsp_dsc.get_dsc_lines()\r
566 fd = open(dsc_file, 'w')\r
567 fd.write('\n'.join(dsc_lines))\r
568 fd.close()\r
569 return\r
570\r
571\r
572def dsc_to_yaml(dsc_file, yaml_file):\r
573 dsc2yaml = CFspDsc2Yaml()\r
574 dsc2yaml.load_config_data_from_dsc(dsc_file)\r
575\r
576 cfgs = {}\r
577 for cfg in ['Template', 'Option']:\r
578 if cfg == 'Template':\r
579 file_lines = dsc2yaml.output_template()\r
580 else:\r
581 file_lines = dsc2yaml.output_config()\r
582 for file in file_lines:\r
583 lines = file_lines[file]\r
584 if file == '.':\r
585 cfgs[cfg] = lines\r
586 else:\r
580b1120 587 if ('/' in file or '\\' in file):\r
27326112
LTL
588 continue\r
589 file = os.path.basename(file)\r
580b1120
LTL
590 out_dir = os.path.dirname(file)\r
591 fo = open(os.path.join(out_dir, file), 'w')\r
592 fo.write(__copyright_tmp__ % (\r
593 cfg, date.today().year) + '\n\n')\r
27326112
LTL
594 for line in lines:\r
595 fo.write(line + '\n')\r
596 fo.close()\r
597\r
598 variables = dsc2yaml.output_variable()\r
599 fo = open(yaml_file, 'w')\r
600 fo.write(__copyright_tmp__ % ('Default', date.today().year))\r
601 if len(variables) > 0:\r
602 fo.write('\n\nvariable:\n')\r
603 for line in variables:\r
604 fo.write(' ' + line + '\n')\r
605\r
606 fo.write('\n\ntemplate:\n')\r
607 for line in cfgs['Template']:\r
580b1120 608 fo.write(' ' + line + '\n')\r
27326112
LTL
609\r
610 fo.write('\n\nconfigs:\n')\r
611 for line in cfgs['Option']:\r
580b1120 612 fo.write(' ' + line + '\n')\r
27326112
LTL
613\r
614 fo.close()\r
615\r
616\r
617def get_fsp_name_from_path(bsf_file):\r
618 name = ''\r
619 parts = bsf_file.split(os.sep)\r
620 for part in parts:\r
621 if part.endswith('FspBinPkg'):\r
622 name = part[:-9]\r
623 break\r
624 if not name:\r
625 raise Exception('Could not get FSP name from file path!')\r
626 return name\r
627\r
628\r
629def usage():\r
630 print('\n'.join([\r
631 "FspDscBsf2Yaml Version 0.10",\r
632 "Usage:",\r
633 " FspDscBsf2Yaml BsfFile|DscFile YamlFile"\r
634 ]))\r
635\r
636\r
637def main():\r
638 #\r
639 # Parse the options and args\r
640 #\r
641 argc = len(sys.argv)\r
642 if argc < 3:\r
643 usage()\r
644 return 1\r
645\r
646 bsf_file = sys.argv[1]\r
647 yaml_file = sys.argv[2]\r
648 if os.path.isdir(yaml_file):\r
580b1120
LTL
649 yaml_file = os.path.join(\r
650 yaml_file, get_fsp_name_from_path(bsf_file) + '.yaml')\r
27326112
LTL
651\r
652 if bsf_file.endswith('.dsc'):\r
653 dsc_file = bsf_file\r
654 bsf_file = ''\r
655 else:\r
656 dsc_file = os.path.splitext(yaml_file)[0] + '.dsc'\r
657 bsf_to_dsc(bsf_file, dsc_file)\r
658\r
659 dsc_to_yaml(dsc_file, yaml_file)\r
660\r
661 print("'%s' was created successfully!" % yaml_file)\r
662\r
663 return 0\r
664\r
665\r
666if __name__ == '__main__':\r
667 sys.exit(main())\r