]>
git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/BPDG/BPDG.py
2 # Intel Binary Product Data Generation Tool (Intel BPDG).
3 # This tool provide a simple process for the creation of a binary file containing read-only
4 # configuration data for EDK II platforms that contain Dynamic and DynamicEx PCDs described
5 # in VPD sections. It also provide an option for specifying an alternate name for a mapping
6 # file of PCD layout for use during the build when the platform integrator selects to use
7 # automatic offset calculation.
9 # Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
11 # This program and the accompanying materials
12 # are licensed and made available under the terms and conditions of the BSD License
13 # which accompanies this distribution. The full text of the license may be found at
14 # http://opensource.org/licenses/bsd-license.php
16 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
17 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
23 from __future__
import print_function
24 from __future__
import absolute_import
25 import Common
.LongFilePathOs
as os
27 import encodings
.ascii
29 from optparse
import OptionParser
30 from Common
import EdkLogger
31 from Common
.BuildToolError
import *
32 from Common
.BuildVersion
import gBUILD_VERSION
34 from . import StringTable
as st
37 PROJECT_NAME
= st
.LBL_BPDG_LONG_UNI
38 VERSION
= (st
.LBL_BPDG_VERSION
+ " Build " + gBUILD_VERSION
)
40 ## Tool entrance method
42 # This method mainly dispatch specific methods per the command line options.
43 # If no error found, return zero value so the caller of this tool can know
44 # if it's executed successfully or not.
46 # @retval 0 Tool was successful
47 # @retval 1 Tool failed
52 # Initialize log system
53 EdkLogger
.Initialize()
54 Options
, Args
= MyOptionParser()
58 if Options
.opt_verbose
:
59 EdkLogger
.SetLevel(EdkLogger
.VERBOSE
)
60 elif Options
.opt_quiet
:
61 EdkLogger
.SetLevel(EdkLogger
.QUIET
)
62 elif Options
.debug_level
is not None:
63 EdkLogger
.SetLevel(Options
.debug_level
+ 1)
65 EdkLogger
.SetLevel(EdkLogger
.INFO
)
67 if Options
.bin_filename
is None:
68 EdkLogger
.error("BPDG", ATTRIBUTE_NOT_AVAILABLE
, "Please use the -o option to specify the file name for the VPD binary file")
69 if Options
.filename
is None:
70 EdkLogger
.error("BPDG", ATTRIBUTE_NOT_AVAILABLE
, "Please use the -m option to specify the file name for the mapping file")
73 if Options
.opt_force
is not None:
76 if (Args
[0] is not None) :
77 StartBpdg(Args
[0], Options
.filename
, Options
.bin_filename
, Force
)
79 EdkLogger
.error("BPDG", ATTRIBUTE_NOT_AVAILABLE
, "Please specify the file which contain the VPD pcd info.",
85 ## Parse command line options
87 # Using standard Python module optparse to parse command line option of this tool.
89 # @retval options A optparse.Values object containing the parsed options
90 # @retval args Target of BPDG command
94 # Process command line firstly.
96 parser
= OptionParser(version
="%s - Version %s" % (PROJECT_NAME
, VERSION
),
99 usage
=st
.LBL_BPDG_USAGE
101 parser
.add_option('-d', '--debug', action
='store', type="int", dest
='debug_level',
102 help=st
.MSG_OPTION_DEBUG_LEVEL
)
103 parser
.add_option('-v', '--verbose', action
='store_true', dest
='opt_verbose',
104 help=st
.MSG_OPTION_VERBOSE
)
105 parser
.add_option('-q', '--quiet', action
='store_true', dest
='opt_quiet', default
=False,
106 help=st
.MSG_OPTION_QUIET
)
107 parser
.add_option('-o', '--vpd-filename', action
='store', dest
='bin_filename',
108 help=st
.MSG_OPTION_VPD_FILENAME
)
109 parser
.add_option('-m', '--map-filename', action
='store', dest
='filename',
110 help=st
.MSG_OPTION_MAP_FILENAME
)
111 parser
.add_option('-f', '--force', action
='store_true', dest
='opt_force',
112 help=st
.MSG_OPTION_FORCE
)
114 (options
, args
) = parser
.parse_args()
116 EdkLogger
.info("Please specify the filename.txt file which contain the VPD pcd info!")
117 EdkLogger
.info(parser
.usage
)
122 ## Start BPDG and call the main functions
124 # This method mainly focus on call GenVPD class member functions to complete
125 # BPDG's target. It will process VpdFile override, and provide the interface file
128 # @Param InputFileName The filename include the vpd type pcd information
129 # @param MapFileName The filename of map file that stores vpd type pcd information.
130 # This file will be generated by the BPDG tool after fix the offset
131 # and adjust the offset to make the pcd data aligned.
132 # @param VpdFileName The filename of Vpd file that hold vpd pcd information.
133 # @param Force Override the exist Vpdfile or not.
135 def StartBpdg(InputFileName
, MapFileName
, VpdFileName
, Force
):
136 if os
.path
.exists(VpdFileName
) and not Force
:
137 print("\nFile %s already exist, Overwrite(Yes/No)?[Y]: " % VpdFileName
)
138 choice
= sys
.stdin
.readline()
139 if choice
.strip().lower() not in ['y', 'yes', '']:
142 GenVPD
= GenVpd
.GenVPD (InputFileName
, MapFileName
, VpdFileName
)
144 EdkLogger
.info('%-24s = %s' % ("VPD input data file: ", InputFileName
))
145 EdkLogger
.info('%-24s = %s' % ("VPD output map file: ", MapFileName
))
146 EdkLogger
.info('%-24s = %s' % ("VPD output binary file: ", VpdFileName
))
148 GenVPD
.ParserInputFile()
149 GenVPD
.FormatFileLine()
150 GenVPD
.FixVpdOffset()
151 GenVPD
.GenerateVpdFile(MapFileName
, VpdFileName
)
153 EdkLogger
.info("- Vpd pcd fixed done! -")
155 if __name__
== '__main__':
157 ## 0-127 is a safe return range, and 1 is a standard default error
158 if r
< 0 or r
> 127: r
= 1