sbl1编译(Scons部分)
来源:互联网 发布:淘宝女士裤子 编辑:程序博客网 时间:2024/05/31 19:02
SCons是一个基于python的自动化编译工具;
配置构造环境就是为SCons添加自定义的选型和命令行参数,添加新的方法;为每个目标配置构造环境,设置目标所依赖的obj,lib和头文件;
1. build/ms/targset.scons
1)初始化构造环境
// 获取系统环境变量
env =DefaultEnvironment(ENV = os.environ, tools = ['mingw'])
// 调用ComSConstruct.py初始化构造环境
// 构造环境env会做为参数传递给ComSConstruct模块的generate方法
env.Tool('ComSConstruct',toolpath = ['${BUILD_ROOT}/tools/build/scons/build'])
2. tools/build/scons/build/ComSConstruct.py
1)初始化构造环境
env.Replace(PRINT_BUILD_BANNER= 'yes')
env.Replace(ROOT_GLOBAL_ENV= env)
// 调用default.py初始化构造环境
env.Tool('defaults',toolpath = ["${BUILD_ROOT}/tools/build/scons/scripts"])
2)显示构造脚本加载开始信息
==============================================================================
Reading SConscriptfiles...
3)加载目标构造脚本
// 在${BUILD_ROOT}/*/bsp/*/build下查找并执行子脚本
env.LoadImageUnits(env.get('IMAGE_ROOT_DIR_PATTERNS'))
4)显示构造脚本加载结束信息
------------------------------------------------------------------------------
COMMAND_LINE_TARGETS are ['boot', 'jsdcc', 'emmcbld','deviceprogrammer']
BUILD_TARGETS are ['boot','jsdcc', 'emmcbld', 'deviceprogrammer']
==============================================================================
3. tools/build/scons/script/default.py
1)初始化构造环境
// 工具脚本查找路径
// BUILD_SCRIPTS_ROOT = tools/build/scons/scripts
build_scripts_root ='${BUILD_ROOT}/tools/build/scons/scripts'
env.Replace(BUILD_SCRIPTS_ROOT= build_scripts_root)
// BUILD_SCRIPTS_OEM_ROOT= tools/build/scons/scripts
build_scripts_oem_root ='${BUILD_ROOT}/tools/build/scons/scripts'
env.Replace(BUILD_SCRIPTS_OEM_ROOT= build_scripts_oem_root)
// 调用utils.py和cmdline.py来初始化构造环境
env.Tool('utils',toolpath = ['${BUILD_SCRIPTS_ROOT}'])
env.Tool('cmdline',toolpath = ['${BUILD_SCRIPTS_ROOT}'])
set_num_jobs(env)
// 目标Image查找路径
// IMAGE_ROOT_DIR_PATTERNS= ${BUILD_ROOT}/*/bsp/*/build
// IMAGE_ DIR_PATTERNS =${BUILD_ROOT}/*/bsp/*/build
image_root_dir_patterns= ['${BUILD_ROOT}/*/bsp/*/build']
env.Replace(IMAGE_ROOT_DIR_PATTERNS= image_root_dir_patterns)
// 所有编译单元(All Unit)的查找路径
// AU_ROOT_DIR_PATTERNS= ${BUILD_ROOT}/*/build
// AU_ DIR_PATTERNS = ${BUILD_ROOT}/*/build
au_root_dir_patterns =['${BUILD_ROOT}/*/build']
env.Replace(AU_ROOT_DIR_PATTERNS= au_root_dir_patterns)
// 编译脚本查找路径
// SCRIPT_DIR_PATTERNS =“../*/build”
script_dir_patterns =['../*/build']
env.Replace(SCRIPT_DIR_PATTERNS= script_dir_patterns)
// 编译脚本名称
// SCRIPT_NAME_PATTERNS= 'SConscript', '*.scons'
script_name_patterns =['SConscript', '*.scons']
env.Replace(SCRIPT_NAME_PATTERNS= script_name_patterns)
// API脚本名称
// API_SCRIPT_NAME_PATTERNS= 'paths.sconscript', '*.api'
api_script_name_patterns= ['paths.sconscript', '*.api']
env.Replace(API_SCRIPT_NAME_PATTERNS= api_script_name_patterns)
4. tools/build/scons/script/utils.py
1)添加构造环境方法
# init utils methods
env.AddMethod(check_alias,"CheckAlias")
… …
# add libs, objs, files,artifacts methods
env.AddMethod(is_key_enable,"IsTargetEnable")
env.AddMethod(add_file,"AddFile")
env.AddMethod(add_library,"AddLibrary")
env.AddMethod(add_object,"AddObject")
env.AddMethod(add_program,"AddProgram")
… …
# add libs, objs(deprecated soon to be removed)
env.AddMethod(add_libs_to_image,"AddLibsToImage")
env.AddMethod(add_objs_to_image,"AddObjsToImage")
env.AddMethod(add_libs_to_image,"AddLibs")
env.AddMethod(add_objs_to_image,"AddObjs")
… …
# init print/text utilsmethods
env.AddMethod(print_info,"PrintInfo")
env.AddMethod(print_warning,"PrintWarning")
env.AddMethod(print_error,"PrintError")
… …
# init and load softwareunits methods
env.AddMethod(load_scons_scripts,"LoadSConscripts")
env.AddMethod(load_tool_script,"LoadToolScript")
env.AddMethod(load_image_units,"LoadImageUnits")
env.AddMethod(load_au_sw_units,"LoadAreaSoftwareUnits")
env.AddMethod(load_sw_units,"LoadSoftwareUnits")
2)print utils
a. PrintInfo – 打印info信息
env.AddMethod(print_info,"PrintInfo")
// print standard infomessage
def print_info(env,message, raw=True):
print '** INFO: ' + env.subst(str(message),raw)
b. PrintWarning – 打印warning信息
env.AddMethod(print_warning,"PrintWarning")
// print standard warningmessage
ef print_warning(env,message, width=80, raw=True):
print '!! WARNING: ' + env.subst(str(message), raw)
c. PrintError – 打印error信息
env.AddMethod(print_info,"PrintInfo")
// print standard errormessage
def print_error(env,message):
print '!! ERROR: ' + env.subst(str(message))
3)load software units
a. LoadToolScript – 加载模块,并调用generate方法
示例:env.LoadToolScript("${BUILD_SCRIPTS_ROOT}/formatting.py")
env.AddMethod(load_tool_script,"LoadToolScript")
defload_tool_script(env, tool, toolpath=[]):
(tool_base, tool_ext) = os.path.splitext(tool) # 拆分扩展名
(toolpath, tool) = os.path.split(tool_base) # 分割目录和工具模块
m = imp.load_module(tool, m_fp, m_path, m_desc) #加载模块
m.exists(env) #调用模块的exists方法
m.generate(env) #调用模块的generate方法
b. LoadImageUnits – 加载目标脚本
示例:env.LoadImageUnits(env.get('IMAGE_ROOT_DIR_PATTERNS'))
env.AddMethod(load_image_units,"LoadImageUnits")
defload_image_units(env, dir_patterns=None):
dir_patterns = env.get('IMAGE_DIR_PATTERNS') # core/bsp/*/build/
script_name_patterns = env.get('SCRIPT_NAME_PATTERNS') # ['SConscript', '*.scons']
load_sub_scripts(env, dir_patterns, script_name_patterns,"image", clone_env=True)#加载构造脚本
# load_sub_scripts方法的参数分别为:脚本dir模板,脚本name模板,脚本类型;
defload_sub_scripts(env, script_dir_patterns, script_name_patterns, script_type,clone_env=False):
node = SoftwareUnitsNode(env)
script_list = node.get_files(script_dir_patterns,script_name_patterns) # 返回所有匹配的脚步列表
script_type = "".join([script_type, " "]) #把script_type添加到列表中(”image”)
node.load_scripts(script_list, script_type,clone_env=clone_env) # 加载目标构造脚本
def get_files(self,dir_patterns, file_patterns, posix=False):
# 使用列表推导式组合dir和name模板
patterns = ["".join([dir,"/",file]) fordir in dir_patterns for file in file_patterns]
# 使用glob模块返回所有匹配的文件路径列表,glob.glob(“core/bsp/*/build/SConscript(或*.scons)”)
file_list = env.GlobFiles(patterns, posix)
return file_list #返回文件列表
def load_scripts(self,scripts, script_type="", clone_env=False):
env.SConscript(script, exports='env') # 执行子构造脚本
5. tools/build/scons/script/cmdline.py
处理命令行选项和参数
1)添加命令行选项
# add verbose option
SCons.Script.AddOption('--verbose',
dest='verbose',
type='int',
nargs=1,
default='0',
help='Verbose level 3=raw (noformatting), 2=detailed, 1=limited, 0=off')
# add progress option
SCons.Script.AddOption('--progress',
dest='progress',
action="store_true",
default=False,
help='Display build progress')
# add listtargets option
SCons.Script.AddOption('--listtargets',
dest='listtargets',
action="store_true",
default=False,
help='list of build targets found')
# add listtargets option
SCons.Script.AddOption('--listapis',
dest='listapis',
action="store_true",
default=False,
help='list of Public and AURestricted APIs found')
# add target config fileoption
SCons.Script.AddOption('--tcfgf',
dest='tcfgf',
type="string",
default='target.builds',
help='Use builds file supply byuser')
2)处理命令行参数
# add variables that canbe cached in params data file
vars.AddVariables(
('BUILD_ID', 'Target Build ID from AMSSworld i.e. BUILD_ID=SKCAAAF', None, validator),
('BUILD_VER', 'Target Build Version i.e.BUILD_VER=1109', '0000', validator),
('BUILD_ASIC', 'Target Build ASIC i.e.BUILD_ASIC=8200A', None, validator),
('MSM_ID', 'Target MSM ID i.e.MSM_ID=76XXT', 'none', validator),
('HAL_PLATFORM', 'Target HAL platformi.e. HAL_PLATFORM=7627', None, validator),
('TARGET_FAMILY', 'Target family i.e.TARGET_FAMILY=7600', None, validator),
('CHIPSET', 'Full target chipset i.e.CHIPSET=msm7x30', None, validator),
('filter', 'filter what subsystem and/orunit and/or subunit to build with a path like syntax e.i. core/storage/flash/dal',None),
('CFLAGS', 'Adds CFLAGS to compilercommand line', None),
('LFLAGS', 'Adds LINK FLAGS to linkercommand line', None),
('PPFLAGS', 'Adds PREPROCESS FLAGS topreprocess command line', None),
('USES_FLAGS', 'Adds USES_FLAGS to theenvironment USES_FLAGS=USEX_X,USES_Y,USES_Z', None),
('PRODUCT_LINE', 'Product Line, e.g.PRODUCT_LINE=MPSS.NI.4.0.0', None),
)
3)显示编译参数
PYTHON Ver = 2.6.6 (r266:84292, Mar 12 2013, 10:24:21)
[GCC 4.4.6]
PYTHON cmd =python
SCONS Ver = 2.0.0.final.0
SCONS QC Ver =1.0.1330037 (2013/07/29 03:32:27)
TARGET_ROOT =/home/xxx/work/k7
BUILD_ROOT = /home/xxx/work/k7/boot_images
BUILD_MS_ROOT = /home/xxx/work/k7/boot_images/build/ms
MBN_ROOT =/home/xxx/work/k7/boot_images/build/ms/bin/AAAAANAZ
BUILD_ID = AAAAANAZ
BUILD_VER = 211011
BUILD_ASIC =8974A
MSM_ID = 8974
CHIPSET = msm8974
TARGET_FAMILY = 8974
HAL_PLATFORM =8974
COMMAND_LINE_TARGETS are ['boot', 'jsdcc', 'emmcbld','deviceprogrammer']
BUILD_TARGETS are ['boot','jsdcc', 'emmcbld', 'deviceprogrammer']
6. tools/build/scons/script/formatting.py
控制编译log的输出格式,verbose默认值为0;
--verbose=<level> Verbose level
3=raw (no formatting),
2=detailed (source, target, cmd-line),
1=limited,
0=off.
7. tools/build/scons/script/config.py
1)添加构造方法
env.AddMethod(init_build_config,"InitBuildConfig")
env.AddMethod(init_usesflags,"InitUsesFlags")
env.AddMethod(init_incpaths,"InitIncPaths")
env.AddMethod(init_image_vars,"InitImageVars")
env.AddMethod(add_uses_flags,"AddUsesFlags")
env.AddMethod(get_uses_flag,"GetUsesFlag")
2)InitImageVars -- 初始化目标变量
env.AddMethod(init_image_vars,"InitImageVars")
def init_image_vars(env, alias_list, proc, config='none', plat='l4',
buildpath=None, flashtype='nand', target='${IMAGE_NAME}_${BUILD_ID}',
build_kcfg=None, build_tags=[], deprecated_build_tags=[],tools=[]):
image_name = str(alias_list[0]).upper() #SBL1
env.Replace(IMAGE_ALIASES = alias_list) # IMAGE_ALIASES= [“sbl1”, “boot”, … ]
env.Replace(IMAGE_NAME = image_name) # IMAGE_NAME =SBL1
# IMAGE_BUILD_TAGS= [“SDCC_BOOT_DRIVER”, “HOTPLUG_BOOT_DRIVER”, …]
env.Replace(IMAGE_BUILD_TAGS = build_tags)
env.Replace(IMAGE_LIBS = []) # IMAGE_LIBS = []
env.Replace(IMAGE_OBJS = []) # IMAGE_OBJS = []
env.Replace(IMAGE_DOCS = []) # IMAGE_DOCS = []
env.Replace(PROC = proc) # PROC = “krait”
env.Replace(PROC_CONFIG = config) # PROC_CONDIF = “apps”
env.Replace(PLAT = plat) # PLAT = “14”
env.Replace(INSTALL_LIBPATH = '.') # INSTALL_LIBPATH = “.”
env.Replace(TARGET_NAME = target) # TARGET_NAME = “${IMAGE_NAME}_${BUILD_ID}”
SBL1_AAAAANAZ
# init build tag --初始化build tags
env.Replace(BUILD_TAGS= build_tags)
forbuild_tag in build_tags:
env[build_tag]= proc # env[“SDCC_BOOT_DRIVER”] = “krait”
# init tools var --初始化工具变量
iftype(tools) is not list:
tools = [tools]
env.Replace(IMAGE_TOOLS= tools) # IMAGE_TOOLS = [“mbn_builder.py”, “bin_builder.py”, …]
# init build path –初始化编译路径
if buildpath is None:
#qc_buildpath = env.subst(image_name.lower() + '/${PROC}')
qc_buildpath =env.subst("%s/${PROC}/${BUILD_ID}" % image_name.lower() )
else:
qc_buildpath = env.subst(buildpath)
env.Replace(QC_BUILDPATH = qc_buildpath) # QC_BUILDPATH= sbl1/krait/AAAAANAZ
env.Replace(BINARY_BUILDPATH = qc_buildpath)
# Init variablesbased on configuration –根据config(”apps”)初始化变量
env.Replace(BUILD_ID = env.subst('${BUILD_ID}A'))# BUILD_ID= AAAAANAZA
# CUST_H =custaaaaanaza.h
env.Replace(CUST_H =string.lower(env.subst('CUST${BUILD_ID}.H')))
env.Replace(TARGET_IMAGE = 'APPS_PROC') # TARGET_IMAGE = “APPS_PROC”
env.Replace(TARGET_FLASH_TYPE = flashtype)
env.Replace(APPS_PROC =env.subst('${PROC}')) # APPS_PROC = “krait”
env.Replace(PROC_NAME = 'APPS') # PROC_NAME = “APPS”
3)CheckAlias -- 检测目标别名是否在编译列表里
检测脚本是否需要加载
env.AddMethod(check_alias,"CheckAlias")
def check_alias(env,image_name="${IMAGE_NAME}", alias_list=None, always_true=False):
cmdline_targets = map(str, COMMAND_LINE_TARGETS)# 获取命令行目标
for target in cmdline_targets:
if target in alias_list: #如果命令行目标与编译目标的alias_list匹配,则返回True
alias_math = True
break
return alias_math
4)InitBuildConfig -- 解析目标配置文件
解析目标配置文件
解析target config file:--tcfgf = 8974.target.builds
env.AddMethod(init_build_config,"InitBuildConfig")
5)LoadAUSoftwareUnits-- 加载指定目录下的模块
加载所有参与编译的模块,并返回libs和objs对象,au_name指定查找主目录
env.AddMethod(load_au_sw_units_deprecated,"LoadAUSoftwareUnits")
defload_au_sw_units_deprecated (env, au_name, filter_list=[]):
items = env.LoadAreaSoftwareUnits(au_name,filter_list)
return items.get('LIBS'), items.get('OBJS')
6)LoadAreaSoftwareUnits-- 加载au_name目录下的模块
加载au_name目录下的模块
env.AddMethod(load_au_sw_units,"LoadAreaSoftwareUnits")
def load_au_sw_units(env, au_name, filter_list=[]):
au_current_list = env.GetAreaSoftwareUnitNames() # au_current_list = [“core”, “build”]
if au_name not in au_current_list: # 检测au_name指定的目录是否存在
env.PrintError("[" + au_name +"] is nota valid AU name.")
raise RuntimeError, 'Invalid AU given'
# init restricted inc paths – 初始化头文件路径
env.InitAUIncPaths()
# SCRIPT_NAME_PATTERNS = ['SConscript', '*.scons']
script_name_patterns = env.get('SCRIPT_NAME_PATTERNS')
# AU_DIR_PATTERNS = ['${BUILD_ROOT}/*/build']
au_dir_patterns = env.get('AU_DIR_PATTERNS')
patterns = ["".join([dir,"/",file]) fordir in au_dir_patterns for file in script_name_patterns]
# 返回所有匹配” ${BUILD_ROOT}/*/build/SConscript(或*.scons)”的路径列表
au_root_script = env.GlobFiles(patterns)[0]
# 执行子脚本core/build/SConscript
env.SConscript(au_root_script, exports='env')
# after loading scripts get list of libs and objs – 在执行完子脚本后,返回所有依赖目标和库对象
items = dict()
items['LIBS'] = env.get('AU_LIBS')
items['OBJS']= env.get('AU_OBJS')
items['DOCS']= env.get('AU_DOCS')
return items
7)LoadSoftwareUnits-- 加载”../*/build”目录下的脚本
env.AddMethod(load_sw_units,"LoadSoftwareUnits")
def load_sw_units (env,level=0, dir_patterns=None):
dir_patterns = env.get('SCRIPT_DIR_PATTERNS') #SCRIPT_DIR_PATTERNS = ['../*/build']
node = SoftwareUnitsNode(env)
node.load_sw_units(dir_patterns)
8)AddObject -- 为编译目标添加对象
为image添加目标对象
env.AddMethod(add_object,"AddObject")
def add_object (env,targets, sources, pack=False, add_to_list=True, **args):
if is_key_enable(env, targets): #检测target是否在build_tags里面
object_nodes = env.Object(sources)
obj_list =root_env.get('AU_OBJS')
add_nodes_to_image(env, obj_list, object_nodes) # 添加目标对象
9)AddLibrary -- 为编译目标添加库
为image添加库对象
env.AddMethod(add_library,"AddLibrary")
def add_library (env,targets, library, sources, pack=False, add_to_list=True, **args):
if is_key_enable(env, targets): #检测target是否在build_tags里面
library_node = env.Library(library, sources)
lib_list = root_env.get('AU_LIBS')
add_nodes_to_image(env, lib_list, library_node) # 添加库对象
10)InitAUIncPaths -- 初始化头文件路径
env.AddMethod(init_au_incpaths,"InitAUIncPaths")
definit_au_incpaths(env):
env.LoadAPIUnits(env.get('AU_DIR_PATTERNS'))
11)LoadAPIUnits -- 加载API脚本
示例:env.LoadAPIUnits(env.get('AU_DIR_PATTERNS')) -- 加载” ${BUILD_ROOT}/*/build/*.api”
env.AddMethod(load_api_units,"LoadAPIUnits")
def load_api_units(env,dir_patterns=None):
if dir_patterns is None: #如果没有指定dir_patterns,则dir_patterns = ['../*/build']
dir_patterns = env.get('SCRIPT_DIR_PATTERNS')
script_name_patterns = env.get('API_SCRIPT_NAME_PATTERNS') # ['paths.sconscript', '*.api']
load_sub_scripts(env, dir_patterns, script_name_patterns,"api") #加载api脚本
12)PublishPublicApi --发布public api
# 把path加入到api_env[“BOOT_PUBLIC”]和api_env[“CORE_BOOT_PUBLIC”]中
env.AddMethod(publish_public_api,"PublishPublicApi")
def publish_public_api(env,api_name, paths):
api_env = env['SCONS_INCPATHS_ENV']
publish_api(env,api_env, "".join([api_name, "_PUBLIC"]), paths)
returnNone
def publish_api(env,api_env, api_name, paths): # 例如api_name = “BOOT_PUBLIC”
api_list = api_env.get(api_name) #把path加入到指定api_name的列表中
if api_list is not None:
if type(api_list) is not list:
api_list = [api_list]
api_list.extend(paths)
else:
api_env[api_name] = paths #api_env[“BOOT_PUBLIC”] = paths
# api_name = CORE_BOOT_PUBLIC
api_name = "".join([string.upper(env.get('AU_NAME','UNKNOWN')), "_", api_name])
api_list= api_env.get(api_name)
ifapi_list is not None:
api_list.extend(paths)
else:
api_env[api_name] = paths #api_env[“CORE_BOOT_PUBLIC”] = paths
13)PublishRestrictedApi-- 发布restricted api
# 把path加入到api_env[“BOOT_RESTRICTED”]和api_env[“CORE_BOOT_ RESTRICTED”]中
env.AddMethod(publish_restricted_api, "PublishRestrictedApi")
defpublish_restricted_api(env, api_name, paths):
api_env = env['SCONS_INCPATHS_ENV']
publish_api(env, api_env,"".join([api_name, "_RESTRICTED"]), paths)
return None
14)PublishProtectedApi-- 发布protected api
# 把path加入到env[“BOOT_PROTECTED”]和env[“CORE_BOOT_ PROTECTED”]中
# 注意此处api环境为env,即当前目标的编译环境
env.AddMethod(publish_protected_api, "PublishProtectedApi")
defpublish_protected_api(env, api_name, paths):
publish_api(env, env,"".join([api_name, "_PROTECTED"]), paths)
return None
15)PublishPrivateApi-- 发布private api
# 把path加入到env[“BOOT_PRIVATE”]和env[“CORE_BOOT_PRIVATE”]中
# path在发布时,会被require到当前目标的编译环境
env.AddMethod(publish_private_api,"PublishPrivateApi")
defpublish_private_api(env, api_name, paths, auto_require=True):
publish_api(env, env,"".join([api_name, "_PRIVATE"]), paths)
if auto_require:
require_private_api(env, api_name)
return None
16)RequirePublicApi --请求public api
# include api_env[“CORE_BOOT_PUBLIC”]对应的path
env.AddMethod(require_public_api,"RequirePublicApi")
defrequire_public_api(env, api_names, area=None):
api_prefix = string.upper(env.get('AU_NAME', 'CORE'))
api_prefix = "".join([api_prefix,"_"]) # api_prefix = CORE_
api_suffix = "_PUBLIC" # api_suffix = _PUBLIC
api_env = env['SCONS_INCPATHS_ENV'] # 使用api_env
require_api(env, api_env, api_prefix, api_names, api_suffix,
dbg_str="Required PublicAPIs", fname="internal_public")
return None;
# 把api_env[“CORE_BOOT_PUBLIC”]对应的path列表加入到CPPPATH
def require_api(env,api_env, api_prefix, api_names, api_suffix, dbg_str, fname):
# “CORE_BOOT_PUBLIC”
api_list = ["".join([api_prefix, api_name,api_suffix]) for api_name in api_names]
inc_paths_builder(env, api_env, api_list, dbg_str, fname)
# 把path加入到CPPPATH
definc_paths_builder(env, incpaths_env, list, dbg_str=None, fname=None):
for incpath in list:
incpaths_env.AppendUnique(CPPPATH = incpath)
17)RequireRestrictedApi-- 请求restricted api
# include api_env[“CORE_BOOT_RESTRICTED”]对应的path
env.AddMethod(require_restricted_api,"RequireRestrictedApi")
defrequire_restricted_api(env, api_names):
api_prefix = "CORE_"
api_env = env['SCONS_INCPATHS_ENV']
require_api(env, api_env, api_prefix,api_names, api_suffix="_RESTRICTED",
dbg_str="Required RestrictedAPIs", fname="internal_restricted")
return None
18)RequireProtectedApi-- 请求protected api
# include env[“CORE_BOOT_PROTECTED”]对应的path
env.AddMethod(require_protected_api,"RequireProtectedApi")
defrequire_protected_api(env, api_names):
api_prefix ="".join([string.upper(env.get('AU_NAME', 'UNKNOWN')), "_"])
require_api(env, env, api_prefix, api_names,api_suffix="_PROTECTED",
dbg_str="Required ProtectedAPIs", fname="internal_protected")
return None
19)RequirePrivateApi-- 请求private api
# include env[“CORE_BOOT_PROTECTED”]对应的path
env.AddMethod(require_private_api,"RequirePrivateApi")
defrequire_private_api(env, api_names):
api_prefix ="".join([string.upper(env.get('AU_NAME', 'UNKNOWN')), "_"])
require_api(env, env, api_prefix, api_names,api_suffix="_PRIVATE",
dbg_str="Required PrivateAPIs", fname="internal_private")
return None
8. core/bsp/bootloaders/build/SConscript
1)加载子脚本
// 加载”../*/build/SConscript”
image_scripts =glob.glob('../*/build/SConscript')
env.SConscript(image_scripts,exports='env')
9. core/bsp/bootloaders/sbl1/build/SConscript
1)加载子脚本
// 加载”msm8974.scons”
script_fname ="${CHIPSET}.scons"
env.SConscript(script_fname,exports='env')
10. core/bsp/bootloaders/sbl1/build/msm8974.scons
1)初始化目标环境变量
# 定义目标别名
# Alias - first alias isalways the target then the other possibles aliases
aliases = [
'sbl1','boot','cbsp','cbsp_modem','all'
]
# 初始化目标变量
env.InitImageVars(
alias_list = aliases, #list of aliases, unique name index [0]
proc = 'krait', # proc settings
config = 'apps', # config settings
build_tags = [ # list of build tags for sub lib scripts
# driver aliases
'SDCC_BOOT_DRIVER',
… …
'IMAGE_TREE_UUID_AUTO_GENERATE',
#boot internal aliase, should not be used bydrivers
'SBL1_BOOT'],
tools = [
'${BUILD_ROOT}/core/bsp/build/scripts/mbn_builder.py', #制作mbn文件工具脚本
'${BUILD_ROOT}/core/bsp/build/scripts/bin_builder.py', #制作bin文件工具脚本
'${BUILD_ROOT}/core/bsp/build/scripts/hex_builder.py', #制作hex文件工具脚本
'${BUILD_ROOT}/core/bsp/build/scripts/scl_builder.py', #制作scl文件工具脚本
'${BUILD_ROOT}/core/bsp/build/scripts/devcfg_builder.py',
'buildspec_builder.py']
)
# 检测目标是否需要编译
if not env.CheckAlias():
Return()
2)解析目标配置文件
解析target config file:--tcfgf = 8974.target.builds
env.InitBuildConfig()
3)设置目标编译标志
env.Replace(MBN_ROOT ="${BUILD_ROOT}/build/ms/bin/${TARGET_FAMILY}")
env.Replace(CC =env['TCC'])
env.Append(CFLAGS =" --diag_error=warning ")
# 添加宏定义
env.Append(CPPDEFINES =[
"BOOT_LOADER",
"BOOT_WATCHDOG_DISABLED",
"BOOT_PBL_H=\\\"boot_pbl_v1.h\\\"",
"BUILD_BOOT_CHAIN",
"DAL_BOOT_IMAGE_SBL1",
"STACK_PTR_ADDR=\\\"SCL_SBL1_STACK_BASE-SCL_SBL1_STACK_SIZE\\\"",
"BOOT_MMU_ASM_H=\\\"boot_krait_mmu.h\\\"",
"RAM_PARTITION_TABLE_H=\\\"ram_partition.h\\\"",
"BOOT_INTERNAL_HEAP_SIZE=0x01800",
"BOOT_EXTERNAL_HEAP_SIZE=0x10000",
"DAL_CONFIG_IMAGE_BOOT",
"DAL_CONFIG_TARGET_ID=0x${MSM_ID}",
"__FILE__=__MODULE__",
])
# 打开UART LOGGER FEATURE
if'USES_BOOT_LOGGER_UART' in env:
env.Append(CPPDEFINES = [
"FEATURE_BOOT_LOGGER_UART",
])
4)加载依赖目标和库
# 加载core目录下的依赖目标和库
core_libs, core_objs =env.LoadAUSoftwareUnits('core')
sbl1_units = [core_objs,core_libs]
# 加载build目录下的依赖目标和库
build_libs, build_objs =env.LoadAUSoftwareUnits('build')
sbl1_units +=[build_objs, build_libs]
5)产生scatter文件
scatter文件指示目标的链接顺序方法等
env.Replace(SBL1_ROOT ="${COREBSP_ROOT}/boot/secboot3/hw/${CHIPSET}/sbl1")
# scl文件存放在core/boot/secboot3/hw/msm8974/sbl1/sbl1.scl
target_scl =env.SclBuilder('${SHORT_BUILDPATH}/${TARGET_NAME}', '${SBL1_ROOT}/sbl1.scl')
sbl1_units.extend(target_scl)
6)编译elf文件
# 调用Program方法编译程序
SBL1_elf =env.Program('${SHORT_BUILDPATH}/${TARGET_NAME}', source=[core_objs, build_objs],LIBS=[core_libs, build_libs], LIBPATH=libs_path)
env.Depends(SBL1_elf,target_scl)
# 生成符号文件
SBL1_map =env.SideEffect(env.subst('${SHORT_BUILDPATH}/${TARGET_NAME}.map'), SBL1_elf)
SBL1_sym =env.SideEffect(env.subst('${SHORT_BUILDPATH}/${TARGET_NAME}.sym'), SBL1_elf)
7)生成bin/mbn文件
#----------------------------------------------------------------------------
# Generate sbl1 bin
#----------------------------------------------------------------------------
SBL1_bin =env.BinBuilder('${SHORT_BUILDPATH}/${TARGET_NAME}', SBL1_elf)
#----------------------------------------------------------------------------
# Generate sbl1 mbn
#----------------------------------------------------------------------------
SBL1_mbn =env.MbnBuilder('${SHORT_BUILDPATH}/${TARGET_NAME}', SBL1_bin,
IMAGE_TYPE="sbl1",FLASH_TYPE="sdcc", ENABLE_ENCRYPT=True)
11. build/build/config.scons
1)添加目标或库对象
#-------------------------------------------------------------------------------
# Add Libraries to image
#-------------------------------------------------------------------------------
VERSION_IMG = [
'IMAGE_TREE_VERSION_AUTO_GENERATE' #包含在boot的build_tags里
]
# 目标文件编译方法
oem_version_c =env.OEM_VersionBuilder(VERSION_IMG, "${BUILDPATH}/oem_version.c")
# 添加目标文件
env.AddObject(VERSION_IMG,oem_version_c)
12. core/boot/secboot3/hw/build/msm8974.sconscript
1)请求API
CBSP_API = [
'BOOT',
'BUSES',
'DAL',
'HAL',
'SERVICES',
'STORAGE',
'SYSTEMDRIVERS',
'WIREDCONNECTIVITY',
'SECUREMSM',
'HWENGINES',
]
env.RequirePublicApi(CBSP_API)
env.RequireRestrictedApi(CBSP_API)
env.RequireProtectedApi(['BOOT'])
2)添加目标或库对象
#-------------------------------------------------------------------------------
# SBL1 Sources,libraries
#-------------------------------------------------------------------------------
SBL1_TARGET_SOURCES = [
'${BUILDPATH}/sbl1/sbl1_mc.c',
'${BUILDPATH}/sbl1/sbl1.s',
'${BUILDPATH}/sbl1/sbl1_target.c',
'${BUILDPATH}/sbl1/sbl1_hw.c',
'${BUILDPATH}/sbl1/sbl1_config.c',
'${BUILDPATH}/boot_cdt_array.c',
'${BUILDPATH}/boot_rollback_img_set.c',
]
secboot3_sbl1_obj =env.Object([
SBL1_TARGET_SOURCES,
])
#-------------------------------------------------------------------------------
# Dload target Sources
#-------------------------------------------------------------------------------
DLOAD_TARGET_SOURCES = [
'${BUILDPATH}/boot_dload_debug_target.c',
]
dload_target_obj =env.Object([DLOAD_TARGET_SOURCES])
#-------------------------------------------------------------------------------
# Add Libraries to image
#-------------------------------------------------------------------------------
env.AddLibsToImage('SBL1_BOOT',[secboot3_sbl1_obj, dload_target_obj])
13.编译log
------------------------------------------------------------------------------
Loading Bootloaders build system
------------------------------------------------------------------------------
SBL1 krait BUILD_ID=AAAAANAZA, TOOL_ENV=linux
** INFO: Begin TargetConfig: AAAAANAZA
** INFO: Targetconfiguration file: 8974.target.builds
** INFO: End TargetConfig: AAAAANAZA
** INFO: ARMTOOLS = ARMCT5.01
** INFO: ARMTOOLSVERSION= 5
** INFO: ARMBIN =/pkg/qct/software/arm/RVDS/5.01bld94/bin64
** INFO: ARMLIB =/pkg/qct/software/arm/RVDS/5.01bld94/lib
** INFO: ARMINC =/pkg/qct/software/arm/RVDS/5.01bld94/include
** INFO: Loading COREscripts... //扫描core目录,并返回所有需要编译的目标
Uart msm_xml = /home/xxx/work/k7/boot_images/core/buses/uart/config/uart_sbl_8974.xml
scons: warning: Ignoringmissing SConscript
'/home/xxx/work/k7/boot_images/core/systemdrivers/pmic/target/msm8974pro_pma8084_pm8941/build/load_sw_units.scons'
File "/home/xxx/work/k7/boot_images/core/systemdrivers/pmic/target/build/pmic_target.scons",line 24, in <module>
!! WARNING: Invalidenvironment context for PublishPublicApi called from
[/home/xxx/work/k7/boot_images/core/wiredconnectivity/qhsusb/build/qhsusb_8974.sconscript]
** INFO: Loaded COREscripts, elapsed time 2.85 sec.
** INFO: Loading BUILDscripts... //扫描build目录,并返回所有需要编译的目标
** INFO: Loaded BUILDscripts, elapsed time 0.12 sec.
从上面的log能看到,在编译过程出现了一个warning信息,Sconscript文件不存在;
查看core/systemdrivers/pmic/target/build/pmic_target.scons:
env.SConscript('../msm8974_pm8941_pm8841/build/load_sw_units.scons',exports='env')
env.SConscript('../msm8974pro_pma8084_pm8941/build/load_sw_units.scons',exports='env')
查看目录../msm8974pro_pma8084_pm8941并不存在,把这行注释掉就不会出现warning信息了;
- sbl1编译(Scons部分)
- sbl1编译(Shell部分)
- scons编译
- scons 编译
- sbl1编译选项
- scons用户指南第一章:编译和安装SCons
- scons用户指南第一章:编译和安装SCons
- scons用户指南第一章:编译和安装SCons
- windows 环境下 scons 交叉编译 (RVCT4.1)
- 嵌入式编译开发工具Scons
- 使用Scons编译QT项目
- scons编译protobuffer脚本代码
- [SCons 有点翻译的scons学习] 1. 简单编译
- [SCons 有点翻译的scons学习] 2. 简化编译过程
- scons
- scons
- scons
- scons
- Performance Tuning Introduction drill 性能调优
- 8.15编写一个模板函数,求数组中最大元素
- Android Studio使用jni、so库
- 自定义UITableViewCell 上的多个按钮点击事件处理
- POI导入,兼容xlsx 和 xls
- sbl1编译(Scons部分)
- 网络通信框架Volley的学习(一)
- Android 数据库框架ormlite 使用精要
- UVa 514 - Rails
- struts2配置文件—struts.properties
- 玩命牛的成长记录(十九)——管理
- sbl1编译选项
- 【学习笔记】把一个数字看成字符串,问它是不是一个回文数?
- sbl1启动代码分析