yocto菜谱的语法

1、bitbake菜谱的语法

  7.3.23 章节

https://www.yoctoproject.org/docs/3.0.2/mega-manual/mega-manual.html

  43.1章节 basic syntax

https://www.yoctoproject.org/docs/3.0.2/mega-manual/mega-manual.html#bitbake-user-manual-metadata

几个重要的语法

2、变量分配和操作

  在菜谱中使用变量的例子

     S = "${WORKDIR}/postfix-${PV}"
     CFLAGS += "-DNO_ASM"
     SRC_URI_append = " file://fixup.patch"

3、function

  function提供了一系列要执行的动作。通常,您可以使用函数来覆盖任务功能的默认实现或补充默认功能,标准函数使sh shell语法,尽管也可以访问OpenEmbedded变量和内部方法
  这是sed菜谱的例子

     do_install () {
         autotools_do_install
         install -d ${D}${base_bindir}
         mv ${D}${bindir}/sed ${D}${base_bindir}/sed
         rmdir ${D}${bindir}/
     }

4、Keywords关键字

  bitbake只使用有限的几个关键字:

  inherit:继承关键字,例如继承某个菜谱类功能  

  include:包含另外的文件的关键字

  require:强制包含另外文件的关键字,如果另外文件不存在bitbake会抛出错误

  export:导出环境变量

  下面是使用关键字的一个例子

     export POSTCONF = "${STAGING_BINDIR}/postconf"
     inherit autoconf
     require otherfile.inc

5、注释符(#):

  用#开头的都是注释

6、续行符(\):

  一行可以拆成多行,在行尾加 \

     VAR = "A really long \
            line"

8、使用变量内容(${VARNAME}):

  通过${VARNAME} 语法来访问变量VARNAME的内容

  SRC_URI = "${SOURCEFORGE_MIRROR}/libpng/zlib-${PV}.tar.gz"

9、引用变量的值

    VAR1 = "${OTHERVAR}"
    VAR2 = "The version is ${PV}"

10、默认赋值 ?=

  ?= 是一个条件赋值,只有变量没有赋值时 ?= 后的值才生效,否则保持原来的值

  例1:var1 之前为空

 VAR1 ?= “new value”

  执行后 var1 值为 new value

  例2:var1 之前 foo

 VAR1 = “foo”
 VAR1 ?= “new value”

  执行后 var1值为foo

11、弱默认赋值(??=
  当使用弱或者惰性默认赋值操作符??=时, 赋值直到解析过程才结束发生, 以至于针对变量的最后而不是第一个??=赋值会被使用: 

  A   ??=  "value1"
  B   ??=  "value2"
  B   ??=  "value3"
  C   ?=  "value4"
  C   ??=  "value5"
  D   =  "value6"
  D   ??=  "value7"

  在这个例子中, 如果A以前没有被设置过, 那么A包含value1。 如果B以前没有被设置过, 那么B包含value3, 因为赋值直到解析过程结束才
  发生。 C包含value4D包含value6, 因为?==操作符覆盖??=操作符。 

12、追加操作符(+=)

  使用加号后跟等号(+=)将值追加到现有变量中,此运算符在变量的现有内容和新内容之间添加一个空格
  例如:将文件追加到 SRC_URI变量中

  SRC_URI = “a.tar b.tar”
  SRC_URI += "file://fix-makefile.patch"

  执行后结果

  SRC_URI = "a.tar  b.tar  file://fix-makefile.patch"

13、前增加操作符(=+)

  使用等号后跟加号(=+)将值添加到变量之前,此运算符在也会在添加的变量后添加一个空格 

  SRC_URI = “a.tar b.tar”
  VAR =+ "Starts"

  执行后结果

  SRC_URI = "starts  a.tar  b.tar "

14、直接变量扩展(:=

  变量扩展直到变量实际被使用到时才发生。 简单地赋值包含变量扩展的表达式不会扩展引用的变量。 然而, 赋值操作符:=引起了赋值上的直接扩展
  

  变量VAR4包含“The quick brown fox falls on the lazy dog.”因为在VAR2赋值中包含的VAR1直到VAR2的内容在使用:=操作符赋值VAR4而被引用时才被扩展。
  然而, 截至那时, VAR1的值已经被设置成了falls on

15、不带空格的追加(.=) 和前新增(=.) 

  VAR1  = “12”
  VAR1  .= “34”
  VAR2  = “89”
  VAR2  =. “67”
  VAR3  = “5”
  VAR3  .= “$(VAR1)”
  VAR3  =. “$(VAR2)”

  这个例子的结果是, 变量VAR1包含1234, 变量VAR2包含6789,变量VAR3包含123456789。 

16、追加操作符(_append) 
  使用_append操作符将一个值追加到已经存在的变量上

  13.1、该操作符不会追加空格

    手动在开头添加一个空格,确保不会覆盖SRC_URI变量

    SRC_URI_append = “  file://fix-makefile.patch”

  13.2、在所有 +=,=+运算符都已执行完毕,并且所有 =分配都发生之后,才会执行该附加操作

    _append 运算符可以和覆盖操作一起使用,这只会覆盖指定的目标或变量

    例子:在所有的 += =+ = 操作执行完毕后,替换sh4原来定义的补丁文件

    SRC_URI_append_sh4 = “  file://fix-makefile.patch”

17、前增加操作符(_prepend)   

  使用_prepend操作符将一个值前增加到已经存在的变量上

  14.1、该操作符不会追加空格

    手动在增加的变量末尾添加一个空格,确保不会覆盖CFLAGS变量

    CFLAGS_prepend = "-I${S}/myincludes  "

  14.2、在所有 +=,=+运算符都已执行完毕,并且所有 =分配都发生之后,才会执行该附加操作  

    _prepend 运算符可以和覆盖操作一起使用,这只会覆盖指定的目标或变量

    例子:在所有的 += =+ = 操作执行完毕后,替换sh4原来定义包含的头文件目录

    CFLAGS_prepend_sh4 = "-I${S}/myincludes  "

18、缩进方式

  要求使用空格,不能使用TAB键  

  

  

 

 

posted on 2020-03-14 18:50  紫枫术河  阅读(1291)  评论(0编辑  收藏  举报

导航