BitBake:如何使用 shell 脚本内容作为 pkg_postinst 或 pkg_preinst 函数的主体?

Posted

技术标签:

【中文标题】BitBake:如何使用 shell 脚本内容作为 pkg_postinst 或 pkg_preinst 函数的主体?【英文标题】:BitBake: How to use shell script content as body of pkg_postinst or pkg_preinst functions? 【发布时间】:2016-05-29 03:01:15 【问题描述】:

我想将 shell 脚本的内容添加到 pkg_preinst_$PN 或 pkg_postinst_$PN 函数(软件包的 BitBake 配方)的主体中。

例如,让我们考虑这个“PREINST”shell 脚本:

$ cat PREINST
#! /bin/sh
chmod +x /usr/bin/mybin

在 pkg_preinst 函数中执行一个简单的“cat”命令不起作用:

pkg_preinst_$PN() 
    cat $S/path/to/PREINST

这样一来,生成的rpm包的.spec文件的内容就不是预期的了:

%pre
cat /Full/Path/To/Variable/S/path/to/PREINST

如您所见,%pre 部分不包含 PREINST 文件的实际内容,仅包含“cat”命令。

是否可以通过某种方式将 PREINST 文件的内容包含到生成的 .spec 文件中?

提前谢谢你!

【问题讨论】:

我找到了一个文件 poky/meta/classes/package_rpm.bbclass,其中定义了 write_specfile 方法。该方法似乎读取了键“pkg_preinst”的值,该值似乎是 preinst 脚本。但我无法修改该键的值来更改其值。这:d.setVar("pkg_preinst", "hello world")) 不起作用 【参考方案1】:

最后我通过将此代码添加到 do_package 任务来解决了这个问题:

do_package_prepend() 
    PREINST_path = "$S/$MYMODULE/PREINST"
    POSTINST_path = "$S/$MYMODULE/POSTINST"
    PREINST = open(PREINST_path, "r")
    POSTINST = open(POSTINST_path, "r")
    d.setVar("pkg_preinst", PREINST.read())
    d.setVar("pkg_postinst", POSTINST.read())

它使用每个 PREINST 和 POSTINST 文件的内容作为值来修改 'd' 全局字典中的 "pkg_preinst" 和 "pkg_postinst" 键。现在它起作用了! :)

【讨论】:

以上是关于BitBake:如何使用 shell 脚本内容作为 pkg_postinst 或 pkg_preinst 函数的主体?的主要内容,如果未能解决你的问题,请参考以下文章

Linux shell脚本的10个高频面试问答

ubuntu怎么保存shell脚本文件

如何在shell脚本中修改添加替换指定文件中的内容

如何在shell脚本中调用另一个shell的结果

如何在脚本中获取进程ID

shell脚本命令如何 读取文本指定位置内容 写入另一文本指定位置并替换原内容