Yocto/BitBake命令行变量覆盖失效:仅MACHINE变量生效
问题描述
在local.conf中定义了以下变量:
MACHINE ?= "default" # Version variables overriden by CI/CD CI_COMMIT_BRANCH ?= "local" BUILD_VERSION ?= "v0.0.0" CI_COMMIT_SHORT_SHA ?= "local version"
在custom-fit-image.bb配方中,do_image_complete任务里使用这些变量:
python do_image_complete() { machine = d.getVar('MACHINE', expand=True) version_tag = d.getVar('BUILD_VERSION', expand=True) branch_type = d.getVar('CI_COMMIT_BRANCH', expand=True) git_short_hash = d.getVar('CI_COMMIT_SHORT_SHA', expand=True) bb.note(f"MACHINE: {machine}; BUILD_VERSION: {version_tag};CI_COMMIT_BRANCH: {branch_type};CI_COMMIT_SHORT_SHA: {git_short_hash}") .... .... } addtask do_image_complete before do_populate_sysroot after do_install
尝试通过命令行覆盖变量执行bitbake:
MACHINE=my_machine CI_COMMIT_BRANCH=bli BUILD_VERSION=bla CI_COMMIT_SHORT_SHA=blub bitbake custom-fit-image
但结果只有MACHINE变量被成功覆盖,do_image_complete的输出如下:
NOTE: MACHINE: my_machine; BUILD_VERSION: v0.0.0;CI_COMMIT_BRANCH: local;CI_COMMIT_SHORT_SHA: local version
疑问:为何仅MACHINE能被命令行覆盖?如何实现其他自定义变量的命令行覆盖?
原因分析
MACHINE是BitBake的预定义全局变量,BitBake会优先读取命令行传入的这类预定义变量值,再加载local.conf等配置文件。而自定义的CI_COMMIT_BRANCH、BUILD_VERSION、CI_COMMIT_SHORT_SHA属于普通自定义变量,直接用环境变量方式传入时,BitBake默认不会将这些环境变量导入为内部变量,而是优先使用local.conf里用?=定义的值(?=表示变量未定义时才赋值)。
解决方案
有两种可行方式实现自定义变量的命令行覆盖:
方式一:使用BitBake的-e参数(推荐)
在命令行中用-e参数指定变量赋值,格式为VAR=VALUE,放在bitbake命令之前:
MACHINE=my_machine bitbake custom-fit-image -e CI_COMMIT_BRANCH=bli -e BUILD_VERSION=bla -e CI_COMMIT_SHORT_SHA=blub
这种方式会直接将变量值传入BitBake内部变量空间,优先级高于local.conf里的定义。
方式二:修改local.conf允许环境变量导入
在local.conf中添加以下配置,允许将指定的环境变量导入为BitBake变量:
EXPORT_FUNCTIONS += "CI_COMMIT_BRANCH BUILD_VERSION CI_COMMIT_SHORT_SHA"
或者用更通用的规则,允许所有前缀为CI_和BUILD_的环境变量导入:
EXPORT_FUNCTIONS += "${@' '.join([k for k in os.environ if k.startswith('CI_') or k.startswith('BUILD_')])}"
添加后,最初的命令行方式即可生效:
MACHINE=my_machine CI_COMMIT_BRANCH=bli BUILD_VERSION=bla CI_COMMIT_SHORT_SHA=blub bitbake custom-fit-image
内容的提问来源于stack exchange,提问作者Simon Rechermann
相关产品推荐
相关产品推荐

