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.pycmdline.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):

       # 使用列表推导式组合dirname模板

       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'     #包含在bootbuild_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信息了;

 

0 0