当前位置: 首页 > 工具软件 > OpenBMC > 使用案例 >

openbmc开发16:配置文件详细介绍

林英朗
2023-12-01

  为什么要介绍配置文件,因为配置文件非常重要。纵观git下来的openbmc,你可以发现里面bitbake、devtool等基本都是python代码或者shell脚本,除此之外基本看不到c或者C++代码,因为这些代码都是在编译时候通过do_fetch,从git或者ftp服务器等网路上拉取源码,然后在解压、编译、打包等操作最终生成所需要的image文件(哈哈。。。我们不制造代码,只是代码的搬运工)。既然都是拉取的源码,那我要实现不一样的功能或者我要添加、去掉某些软件该怎么办呢?答案就是修改配置文件或者增加配置文件。在上游仓库中的部分软件通过python脚本支持yaml的配置文件,通过配置文件将生成头文件或者C、C++文件用于生成应用程序。所以要熟练创建或者修改layer适配我们的board,前期工作主要都是在修改或者增加配置文件(自己扩展功能或者添加营养程序,后续将介绍),因此,需要掌握bitbak等工具的规则,就像学习C语言编程需要遵守C语法规则一样。废话不多说,直接开始步入正题。

1 变量赋值

BitBake变量都是无类型的,BitBake把所有赋给变量的值都视作字符串。

??=                弱默认赋值(如果变量没有赋值操作,则赋值为最后一个“??=”赋值)

?=                默认赋值(如果没有赋值将使用默认值)

=                   直接赋值(最后的赋值将覆盖前面的赋值)

+=                 带空格的追加

=+                 带空格前新增

.=                  不带空格的追加

=.                  不带空格前新增

_append        不带空格追加

_prepend       不带空格前新增

_remove        移除(变量中以空格分列匹配)

:                    BitBake从右到左处理条件,并且右边的优先级高于左边。

[]                   属性赋值, e.g.VAR[flag] = “flagevalue”  

@                  操作符告诉BitBake把随后的表达式视作Python代码

e.g.从Python函数中使用BitBake数据字典方法getVarFlag和setVarFlag来读取和写属性的值

python func(){

       run = d.getVarFlag(‘func’, ‘run’)

       if run == 1

              #do run

              …

              d.setVarFlag(‘func’, ‘run’, 0)

       else

              #do not run …

}

        其中getVarFlag的第一个参数是变量的名字,第二个参数是标识的名字。setVarFlag使用3个参数:变量名、标识名和标识值。

e.g: DATE = ${@time.strftime(‘%A %B %d, %Y’, time.gettime())}

$            一般配合花括号使用,使用变量值。

       e.g: ${MACHINE}

注:

        1、=和?=操作符会覆盖??=操作符,=操作符将覆盖?=操作和??=操作符

        2、_append和_prepend优先级低于+=和=+操作,即+=和=+将在执行_append和_prepend操作之前。

        3、_append和_prepend操作符可以用于shell或者python函数的追加和前新增。

        4、在使用append和prepend时候一定要记得空格,否则编译会报错。

        e.g:  VAR = " 123"

2 包含和继承

include                 BitBake会搜索定位包含文件,但是即使不能找到文件,它也会悄无声息地继续操作

required               必须找到对应的文件,不然BitBake将以错误信息退出。

inherit                   类操作,可以被recipes、追加文件和其他类用inherit指令来继承。

注:

        1、当相对路径被使用的时候,BitBake尝试使用由BBPATH变量指定的文件路径列表来定位文件。BitBake会使用它找到的、正确路径和文件名的第一个文件。

        2、inherit使用不带后缀(bbclass)的类文件名。它仅仅可以用在菜谱、追加文件和其他类文件中。

3 函数

3.1 Shell函数

        在函数体内的代码遵循普通shell的语法。事实上,BitBake在执行shell函数时调用shell的解释器/bin/sh。由于编译主机的shell解释器会有很多种,比如还有dash等,理想状态是所有shell函数应该被写成无关于系统默认的特殊的shell解释器,即所有解释器通用语法。目前,Yocto项目官方支持的Linux发行版上,默认的shell解释器是Bourne Again Shell(bash)。因此,为了自己的代码易于移植,建议避免shell特定的扩展并且遵循针对bash衍生的共同特性,例如.sh、.bash、.ksh和.zsh。shell语法相关请参考shell专栏

e.g:常用的应用程序安装函数

do_install() {
    install -D xxx ${D}/bin/xxx
}

3.2 Python函数

        python函数需要使用关键词python,该关键字告诉BitBake其后的代码被解析成Python代码。在python函数体内,必须使用Python针对代码段的缩进方案,建议使用空格替代制表符用于缩进,缩进不对会导致编译报错。

        python函数可以通过使用def关键词来全局定义,该关键字定义的函数,不管该函数被定义在什么文件中都将是全局的。

        在recipes中追加文件和类,需要使用__anonymous关键词,有该关键字的函数名(或者只有关键字)将被定义成匿名Python函数。

        e.g:获取cpu时间

        def get_cputime():
            with open("/proc/stat", "r") as f:
                fields = f.readline().rstrip().split()[1:]
            return sum(int(field) for field in fields)

3.3 函数中访问变量

        shell函数中可以对变量进行读写。但是写变量仅仅在shell脚本的范围内局部性地改变它的值。在程序清单4-11中,BPN是在do_install中被覆盖的BitBake变量。被覆盖的值仅仅对do_install函数有效。考虑到BitBake创建针对do_install函数的带有所有变量设置和扩展的shell脚本并且执行该脚本,那个惯例是容易理解的。

从Python函数中访问BitBake比从shell函数中访问稍微复杂一点儿,因为BitBake变量不能被直接读取或者写而是必须用特殊函数从BitBake数据字典中获取并且通过BitBake数据字典操作

使用setVar和全局数据字典全局性地修改那个变量,并且为所有后续的操作修改了它的值。如果不需要,那么可以创建数据字典的副本

3.4 函数增加

        类似变量,可以使用_append和_prepend操作符追加和前新增函数。

        例:

        bb文件中的do_install函数如下

        do_install() {
            install -D xxx ${D}/bin/xxx
        }

         在bbappend文件中添加如下:

        do_install_prepend() {
            echo "hello world"
        }

        do_install_prepend() {
           echo "add end"
        }

        在之行时候将会执行do_install如下:

        do_install_prepend() {
            echo "hello world"
            install -D xxx ${D}/bin/xxx
            echo "install complete" 
        }

3.5任务函数

        如果需要将shell或者Python函数定义为可执行的任务,它的名字必须加上前缀do_。addtask被用来增加任务到BitBake任务列表和定义任务执行链。一般配合before和after来确定函数在哪个阶段执行。

       e.g:addtask before do_compile after do_configure

3.6 关键字变量

        类似其他编程语言,bitbake中也有许多关键字,这里只介绍部分,详细可以参考yoctodoc或者在openbcm目录下的poky/documentation文件下寻找。

3.6.1 源码文件相关

DL_DIR                #下载源文件所到的目录路径

SUMMARY        #软件包简要说明

DESCRIPTION        #软件包描述

HOMEPAGE        #源码网址

BUGTRACKER        #bug网址,编译不需要用到

SRC_URI             #文件下载(获取)路径

       HTTP/HTTPS/FTP/SFTP 获取

                     md5sum        用于载验证的MD5校验和

                     sha256sum    用于下载验证的SHA256校验和

                     downloadfilename       下载后的文件重命名为这个文件名

       Git获取

                     protocol                用于访问仓库的传输协议。被支持的协议是git、file、

ssh、http、https和rsync。如果参数是忽略的,那么获取器默认成git。

                     branch                  要检出的分支。如果参数是忽略的,那么获取器默认成

master。可以通过用逗号(,)分隔它们来指定多个分支。

name                    关于分支的符号名字。如果多个分支被检出,那么被这个参数提供的名字的数量必须匹配分支的数量

                     tag                       要从分支获取的Git标签

rebaseable                   上游仓库可能在将来变基(rebase),导致标签和它们的SHA1散列变化

                     nocheckout           获取器在解包时不从分支检出源代码

                     bareclone             创建仓库的裸克隆

        Subversion(SVN)获取

              protocol

              module

              rev

        Concurrent Versions System (CVS)获取

注:

        如果MD5和SHA256校验和比较大,可能使得SRC_URI难以阅读和维护。因此,可以使用SRC_URI属性值来指定。

        e.g:SRC_URI[md5sum] = "693d6ff167496362f8ec6c3c5b8ba5ee"

SRC_URI[sha256sum] = "e277d9385633574923f48c297e1b8acad3170c69fa590e31fa466040fc6f8f5a"’

        md5sum和sha256sum属性值一般针对的tar包,自己写recipes时可以直接使用“md5sum/sha256sum + xxx.tar.xxx”获得对应的值。

SRESREV                #针对对git仓库指定git commit id

PREMIRRORS        #指定的镜像站点

MIRRORS              #指定的镜像站点

BB_GENERATE_MIRROR_TARBALLS   #将下载的文件创建本地tar包,值为1时执行。会生成对应的tar包,可以将这些tar包直接复制到镜像服务器中,设置MIRRORS来使用服务器中的镜像,以便于离线编译。

BP                #basic package,基本软件名称和版本,没有任何特殊的recipes名称后缀。

PN                 #package name

BPN               #basic package name ,PN变量移除常见的前缀或者后缀

PV                 #package version指定版本

PR                 #package release,默认是r0

PE                #一般不设置,该变量用于解决不兼容的升级方式。

SRCPV        #用于定义PV,该变量是bitbake运行时计算得到当前软件包的版本:SRCPV = "@{bb.fetch2.get_srcrev(d)}"

FILESEXTRPATHS        #扩展文件搜索路径

SECTION                #应用分类,对于包管理工具有效

LICENSE                #指定pecipes的一些列的license,还有很多变量这一系列的,不做赘述。

LIC_FILES_CHKSUM        #设置许可证文件以及md5sum值(开源软件的必要的东西)

        有些配置文件中可能会.存在一些自己命名的变量,比如“UBRANCH”来设置git的分支版本,这些在yocto的变量中是没有的,该变量会用到SRC_URI中,主要是为了方便修改。

3.6.2 编译相关

B                  #Build Directory编译输出路径

S                   #Source Directory 解压源码

DEPENDS      #指定构建依赖

RDEPENDS    #指定运行时依赖

PROVIDES     #声明软件包的名字和功能性

RPROVIDES   #run provides指定运行时配置的包名别名列表。包的本身的名字总是隐式地作为列表的一部分。

PREFERRED_PROVIDER       #指定多个包的其中之一来构建

       e.g:PREFERRED_PROVIDER_virtual/kernel

PREFERRED_VERSION         #覆盖PV所指定的版本

BB_DEFAULT_TASK              #bitbake默认任务,一般默认都是build任务,会执行fetch、compile等一系列。

EXATR_OEMAKE                #make参数

EXTRA_OECONF                #configure参数

CFLAGS                                   #指定C flags 

CPPFLAGS                              #指定CPP flags 

CXXFLAGS                              #指定CXX flags       

TARGET_CFLAGS                #编译目标时的C flags

TARGET_CPPFLAGS           #编译目标时的CPP flags

TARGET_CXXFLAGS           #编译目标时的CXX flags

BUILD_CCLD                #指定要用于构建主机的linker命令

BUILD_CFLAGS            #指定在构建主机的时候传递到C编译器的标志

BUILD_CPPFLAGS        #指定在构建主机的时候传递到C++编译器的标志

BUILD_CXXFLAGS        #指定在构建主机的时候传递到C++编译器的标志

BUILD_FC                    #为构建主机指定Fortran编译器命令

BUILD_LD                    #指定构建主机的linker命令

BUILD_LDFLAGS          #为构建主机指定特定于架构的链接标记

BUILD_OPTIMIZATION #指定编译优化参数

DEBUG_FLAGS                      #调试flags

DEBUG_PREFIX_MAP        #指定调试输出路径     

3.6.3 软件包操作相关

继承自core image需要添加inherit core-image。

IMAGE_INSTALL = “package”

IMAGE_INSTALL_append = " package"

IMAGE_INSTALL_append_pn-xxx = " package"

eg:IMAGE_INSTALL_append_pn-core-image-minimal = " package"

CORE_IMAGE_EXTRA_INSTALL   在core-image-*中添加软件包.

注:

        如果添加多个软件包,需要在软件包之间一定要添加空格,使用append或者prepend时也要添加空格

IMAGE_PKGTYPE  #设置安装包类型

       package_rpm

        package_ipk

        package_deb

        package_tar

PACKAGE_INSTALL      #安装软件包

IMAGE_FEATURES        #指定特征,添加配置文件属性

EXTRA_IMAGE_FEATURES    一般在local.conf中使用,可以避免和IMAGE_FEATURES中的value冲突。详细查看meta/classes/core-image.bbclass中列出的变量,比如“debug-tweak”和 “read-only-rootfs”等

MACHINE_FEATURES   #指定机器特性,一般是硬件支持功能。

Eg:wifi、usbnetwork

OBMC_MACHINE_FEATURES      #和 IMAGE_FEATURES类似

3.6.4 镜像相关

IMAGE_FSTYPES    #指定镜像文件系统类型

      - btrfs

      - container

      - cpio

      - cpio.gz

      - cpio.lz4

      - cpio.lzma

      - cpio.xz

      - cramfs

      - ext2

      - ext2.bz2

      - ext2.gz

      - ext2.lzma

      - ext3

      - ext3.gz

      - ext4

      - ext4.gz

      - f2fs

      - hddimg

      - iso

      - jffs2

      - jffs2.sum

      - multiubi

      - squashfs

      - squashfs-lz4

      - squashfs-lzo

      - squashfs-xz

      - tar

      - tar.bz2

      - tar.gz

      - tar.lz4

      - tar.xz

      - tar.zst

      - ubi

      - ubifs

      - wic

      - wic.bz2

      - wic.gz

      - wic.lzma

           一般bmc都是spi-flash,故选择jffs2。

hostname             #设置主机名,默认是MACHINE值。

      e.g:hostname = "myhostname"(不会生效,因为默认是machine,正确如下)

        hostname_pn-base-files = "myhostname"

        hostname_pn-base-files = ""

TARGET_ARCH      #指定目标平台

HOST_ARCH         #和TARGET_ARCH类似

        e.g- arm

              - i586

              - x86_64

              - powerpc

              - powerpc64

              - mips

              - mipsel

TARGET_CC_ARCH       #为目标系统指定特定于架构的C编译器标志,默认于TUNE_CCARGS

HOST_CC_ARCH          #指定传递给C编译器的特定于架构的编译器标志

BUILD_CC_ARCH         #为构建主机指定特定于架构的C编译器标志,默认为空

BUILDSDK_CC_ARCH   #编译SDk

HOST_OS                    #指定目标系统名字

TARGET_OS                 #指定目标系统名字

HOST_SYS                   #指定系统,包括架构和操作系统

HOST_PREFIX               #指定交叉编译器前缀,默认取值于TARGET_PREFIX

TARGET_SYS                #指定系统,包括架构和操作系统

        默认赋值

       TARGET_SYS = "${TARGET_ARCH}${TARGET_VENDOR}-${TARGET_OS}"

        一般修改默认复制的变量即可。(后面的类似)

TARGET_PREFIX           #指定用于工具链二进制目标工具的前缀,取值 "${TARGET_SYS}-"

HOST_VENDOR           #设置供应商

TUNE_CCARGS            #为目标系统指定特定于架构调优的C编译器标志

TUNE_ARCH    #特定架构的GNU规范体系结构,取值于TUNE_ARCH_tune-${DEFAULTTUNE}

EXTRA_OEMAKE          #指定make选项

SERIAL_CONSOLES      #指定串口配置

KERNEL_IMAGETYPE    #指定内核类型

              e.g. "zImage"

INHERIT                       #继承

              e.g. INHERIT  += "testimage"

INHERIT =+ "buildhistory"

BUILDHISTORY_COMMIT #提交历史编译,值为“1”时生效。

DISTRO          #指定配置文件名

       e.g:DISTRO = “master-bmc”

DISTRO_FEATURES       #指定属性

DISTRO_FEATURES_append = " ptest"

HOMEPAGE   #指定package等的网站

GCCVERSION       指定GCC版本

       e.g: GCCVERSION = “10.3%”

LINUX_VERSION    #指定内核版本

       e.g:LINUX_VERSION = "5.12-rc3"

LINUXLIBCVERSION     指定内核头文件版本

       e.g : LINUXLIBCVERSION = "5.12%"

EXTRA_USERS_PARAMS        #用户相关,如创建用户,修改用户以及密码等 

注:

        1、部分变量会取值于其他变量,这个是在classes中或者一些配置文件中赋值,对于这样的变量需要修改对应取值的变量。

        2、一般允许修改的变量都是使用“?=”或者“??=” 来赋值,要修改,只要在自己的layer中使用“=”赋值即可。

        3、对于部分变量,我们的配置文件中的都是对变量使用“+=”或者append等来追加或者用remove移除,而不是“=”赋值。比如向镜像中添加package、添加FLAGS等。

        4、有部分变量是在在bb文件或者bbappend文件中修改,该变量修改后的值只适用于该软件包或者配置,对其它的的没有影响,例如bb文件中的“CPPFLAGS”,只对当前的bb配置文件生效,对其他bb文件没有影响。如果要修改所有的,需要在local.conf或者machine.cfg中赋值。

        5、opebmc是依赖于yocto的,更多变量相关的资料请参考:variables-glossary

 类似资料: