Python-Scons-PMF脚本浅析

Python基础知识简介

Scons脚本简介

PMF中的脚本

Python基础知识简介

      Scons脚本是以python语言为基础的。所以,在介绍scons脚本前,有必要先简单介绍一些

python基础知识。

      Python是一门解释性的、面向对象的、动态语义特征的高层语言。 许多语法与C/C++类似,这

样学习成本较低,Python的解释器和标准扩展库的源码和二进制格式在各个主要平台上都可以免费

得到,而且可以免费分发。

一、变量定义

      Python使用a=1这种方式来定义一个变量,使用一个变量前(指用于表达式这种非赋值性使用),必须先定义。

二、基本运输符

      Python支持几乎所有C的运算符(支持+=,但不支持++,不支持?),以及and,or,not,is,in等。使用type(a)可以返回变量类型(包括int,float,str,dict,list,tuple,set等),使用Isinstance(a,typedef)可以判断a是否是typedef的实例, typedef除包括上面的通用类型外,也可以是自定义的类。                         

Python基础知识简介

三、基本数据类型

       python中所有数据类型都是类,定义一个变量实际上对应类型的一个实例。

      1、支持int,float,boolean,None,字符串类型。

            Boolean类型包括True,False。

            None表示空。

            字符串型如: a = “a1a2a3” ,常用方法:split。例如:a.split(“a”)为[’1’,’2’,’3’]。字串支持下标访问,比如a[2:5]为a2a, a[2:]为a2a3, a[:5]为a1a2a,支持如a[1], a[-1]的形式。

            单双引号都可以用来引用字符串,但必须成对存在,3个单/双引号可以支持分行字符串。

      2、list列表:形式为[1,2,3],元素可以为任何数据类型,它是一个sequence data type(有序数据类型),类似于数组,但它是可变长的(动态数据类型),同样支持下标访问。

           list支持方法如下:

           insert(i, x)  :在指定位置插入一项。i表示在哪一个元素前面插入,用下标表示。例如, 

                                  a.insert(0, x) :在列表前面插入,a.insert(len(a), x)等价于a.append(x) ;

           append(x)  :在list尾追加元素;

Python基础知识简介

           index(x)     :在列表中查找值x然后返回第一个值为x的元素的下标。没有找到时出错。
     remove(x) :从列表中删去第一个值为x的元素,找不到时出错。
     sort()         :对列表元素在原位排序。注意这个方法改变列表,而不是返回排序后的列表。
     reverse()   :把列表元素反序。改变列表。
     count(x)    :返回x在列表中出现的次数。

           extend(x)  :其中x必须为list,表示在list尾追加另外一个list。

       3、tuple元组:形式为(1,2,3),元素可以为任何不可变的数据类型,它是一个sequence data

       type,类似于list,但它是不可变长的。

       4、dist字典:形式为d = {‘a’:1, ‘b’:2},其中每项的冒号前面为key,后面为value,其中key必

      须是不可变的数据类型。 Value为任何类型。以如d[‘a’]来访问。Dist不是一个有序的数据类型,可变长(动态数据类型)。

           常用方法:d.keys()返回key的列表,d.values()返回value的列表。d.has_key()返回是否有

      某键。

Python基础知识简介

四、Python基本语法

       5、通用函数:

             del语句:del a[0],del d[“a”]等

             range(x):返回一个序列列表

             print:打印,支持任何类型以及格式化符号,如print “hello ”,a,”hei hei”

             len(x):返回长度,支持任何类型

       6、支持通用控制语句,如下:

            if a == 1:                       for i in range(7):             while a > b:

                 …                                   …                                     …

            elif a == 2:                                                            else:

                 …                                                                           …

            else:

                 …

Python基础知识简介

        7、函数编程工具 (map/filter/reduce)

              map(函数f, 数列l)  ==> [ f(l[0]), f(l[0]), ... ]
        filter (f, l)    ==> 只在l中剩下对f是真的值
        reduce (f, l)    ==> 用l中头两个数作参数调用f, 产生的结果再与l中的第三个数作参数去调

用f, 如此到底。

        8、函数和类:

              def fun(a):                                class cls_a(父类):

                     print a                                      def __init__(self,  ...):
                                                                      ...
                                                                def method1(self, ...):
                                                                      ...

                                                                      def mether2(self, ...):
                                                                      self.method1()
                                                                      ...

        9、常用模块及方法:

Python基础知识简介

             导入方法:import a,from gui_items import *,from gui_items import aaa

             常用模块sys,string,OS。以OS模块说明如下:  os.path.basename(),os.path.join(),

os,path.dirname,os.path.exists ,os.path.abspath(),os.path.isdir () ,

os.path.isfile () ,os.listdir(dir) 。

        10、其它:

             Python是以缩进来体现代码逻辑结构的。所以同一级别的代码应该对齐,子句建议空四

格。比如:

       def demo(a):

             if len(a) > 0:

                 print a

             else:

                 print “Nothing”

              Python和scons脚本都是以#表示一行注释的开始。

PMF脚本简析

Python基础知识简介

Scons脚本简介

PMF中的脚本

Scons脚本简介

     Scons是第3方开源软件,功能类似于make,但比make功能更强大。PMF扩充了scons功能。

一、脚本类型

       一般来说,scons脚本可以分为两种:入口脚本和普通脚本。

      入口脚本名称为SConstruct。执行scons后, scons自动查找执行目录下是否存在

SConstruct,然后执行SConstruct。

      普通脚本:它可以为任何名称。通过在脚本中执行类似SConscript(‘src/sconscript’)这样的命

令来将各个脚本串联起来。

       其实,这两种脚本只是名称不同,它们可以完成相同的功能。一个编译工程也不一定要这两种

脚本都有,只是为了处理复杂工程才分成不同职能的脚本文件。

       同时,支持“scons –f ***”来执行指定文件,所以,入口脚本也不是必需的。

二、接口

       1、Import和Export: Import用于导入一个变量, Export用于释放一个变量,一般用于新建变

量之后,新建变量在另外一个文件引用前,必须Export。

       注意,这里的Import和前面python中的import是不一样的。

Scons脚本简介

      2、SConscript:有很多种用法,这里给出3种最常用的:

             SConscript (‘src/sconscript’),表示执行对应脚本,输入为文件名

             SConscript ([‘src/sconscript’, ‘test/sconscript’, ‘pkg1/sconscript’]),执行对应脚步

列表,输入为文件名列表。

             SConscript(dirs = find_src_dirs(), name = ‘sconscript’),查找指定目录下的名字为

‘sconscript’,其中目录的输入可以通过函数来指定查找规则。

     3、scons的env中的方法:

             SharedObject:做动态(共享)obj,如env.SharedObject(srcs),srcs为源代码列表

             StaticObject:做静态obj,如env.StaticObject(srcs) ,srcs为源代码列表

             SharedLibrary:做动态(共享)库,如env.SharedLibrary(‘foo’, [‘f1.c’, ‘f2.c’, ‘f3.c’, ])

             StaticLibrary:做静态库。如env. StaticLibrary (‘foo’, [‘f1.c’, ‘f2.c’, ‘f3.c’, ])

             Program:做可执行文件,PMF的ABin功能就是它的扩充。上述接口的详细用法可以参考

Scons的手册。

PMF脚本简析

Python基础知识简介

Scons脚本简介

PMF中的脚本

PMFScons脚本的扩充

PMF开发工程介绍

PMF中的脚本  --PMF对Scons脚本的扩充

       为了实现包管理功能,PMF扩充了scons功能。主要体现在做包的功能和包的依赖处理方面,

在这里介绍做包的功能,即如何写脚本做包。

       在说明之前,先要澄清一点:一段脚本可以写成一个脚本文件,也可以写在几个脚本文件里

面,同样,可以将几个脚本文件合并成一个。比如,在做开发包时,将做包、加头文件和

cfgdefs放在一个脚本文件,而将加源代码和做OBJ的部分放在一个脚本里。它们用SConscript联

系起来。所以,脚本怎么写,是自由的,是由你自己决定的。但我们建议要注意可读性、与它对应

的source尽量在一起、比较好的移植性等。

      在介绍PMF脚本之前,我们先回顾一下PMF支持的不同粒度的多级包结构:

PMF各级包的定义

PMF中的脚本  --PMF对Scons脚本的扩充

一、开发包

       一般来说,做开发包的流程是这样的:

       Import(‘prj’)                                            #导入PMF编译工程变量,为下面引用prj的方法做准备

      pkg = prj.DpgPkg(“specs/vos_cfgdb.spec”)    #做开发包接口,它需要开发包规格文件

      pkg.AddIncPaths([‘include’])                             #将头文件加入到CPPPATH中,参与编译

      pkg.AddIncFiles([‘include’])                              #将头文件打到包中

      Export(‘pkg’)                           #释放pkg,如果不需要在其它文件中引用该变量,则不用这句话

      srcs = pkg.list_srcs(‘src/*.c’)                            #查找所有指定目录符合条件的文件

      pkg.Add(‘sobjs’, pkg.env.SharedObject(srcs))  #做动态OBJ,同时将OBJ加到包中

      pkg.Add(‘objs’, pkg.env.StaticObject(srcs)) #做静态OBJ,同时将OBJ加到包中

        在命令行输入scons mode=AllDpg,则编译所有开发包

二、构件(包)

        目前,PMF支持做10种构件(包):基础(通用)库、可执行文件、组件、驱动、补丁、Netcof/Cli/

MIM/MIB资源、映像文件。这里只用组件举例说明,其它请参考PMF使用指南。

PMF中的脚本  --PMF对Scons脚本的扩充

          Import('prj')

           #做组件,支持从开发包、源代码做构件

          spm_ls = prj.MkComp(name = "spm_ls",  dpg = ["v_spm_client"], version = '2.1.1')

          #为组件添加描叙文件

          spm_ls.AddCfgToComp(name = "spm_ls", 

                                                    CompType = 1,

                                                    PrivateDataStructerSize = 1,

                                                    MultilInstance = False,

                                                    FlowCtrlMasterFlag = True,

                                                    Sync = False, 

                                                    CompDefaultPrio = 1,

                                                    compConstruct = "compConstruct_test",  

                                                    compMsgProc = "compMsgProc_test",

                                                    compDestruct = "compDestruct_test")

             spm_ls.AddCfgToComp(name = "spm_ls", CompType = 5, …)                               

PMF中的脚本  --PMF对Scons脚本的扩充

        这样,在工程中做了组件spm_ls,在工程中直接引用构件名“spm_ls”就能使用它。

        一般来说,这样只能做出构件,如果想要做出构件包,则有两种方法:

            1、作包API接口中有个参数mk_cpg,将它给为True(默认为False)就可以做构件包了;

            2、在命令行输入scons mode=AllComp,则编译所有构件; scons mode=AllCpg,则编译所有构件,同时产生对应的构件包包池。

三、业务包

        目前支持将构件和外部构件包添加到义务包中。

         spgpkg = prj.MkSpg(name = “dopra”,                                       #制作业务包

                                           description = "dopra server package",

                                           version = "2.1.1")

         spgpkg.AddComponent(component = [‘v_ssp’, ‘spm_ls’])     #将构件加入业务包

         spgpkg.AddCpg(Cpg = [‘cpg_a’])                                              #将构件包加入业务包

PMF中的脚本  --PMF对Scons脚本的扩充

四、发行包

        rpgpkg = prj.MkRpg(name = “rpg_example”,                            #制作发行包

                                           description = "for rpg_example",

                                           version = “DOPRA SSP V100R006C05B010)

                                 rpgpkg.AddSpg([“dopra”])                       #将业务包加入发行包

五、ABin:做可执行文件

        prj.ABin(“test”,                                                           #可执行文件名称

                       "../test/main.c“,                                            #source file

                       comps = [“v_ssp”, “spm_ls”, “spm_rs”], #组件  

                       LIBS = [“pthread”, “rt”, “dl”],                     #库

                       #LIBPATH=[“dpm/lib”],                               #特殊库的目录

                       #CPPPATH=[“dpm/include”],

                      CPPDEFINES=[('VOS_BYTE_ORDER', 'VOS_LITTLE_ENDIAN')],

                      CCFLAGS = "-Wall -g ")

PMF脚本简析

Python基础知识简介

Scons脚本简介

PMF中的脚本

PMF对Scons脚本的扩充

PMF开发工程介绍

PMF中的脚本  --PMF开发工程介绍

     为了让PMF灵活的适应不同开发工程目录结构,比如V8的目录,PMF提供开发工程的定制功能。

       工程定制功能是通过脚本SConstruct中一个工程配置字典来实现的,字典的内容如下:

       prj_dir = {

                      “source”              : [“src”],            #编译源目录    

                      “sconscript_file” : “”,   #scons脚本名称,可以使用匹配字符,默认为“sconscript"   

                      “default_bcf”       : “default.py”    #工程编译环境配置文件名称

                      "script_policy"    : " normal "       #manual, normal

                       }       #编译出的发行包目录名称

             其中script_policy是用来指定sconscript搜索策略,pmf为了简化编译脚本,支持自动搜索 

         “sconscript_file”指定的脚本文件来执行。但部分编译工程希望自己控制编译目录(用 SConscript来 控制),此时,需要将script_policy设置为manual。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值