BitBake配方中能否在任务外定义可被Shell任务调用的Shell函数?
在BitBake配方中复用任务外的Shell函数方案
BitBake生成任务执行脚本(如run._do_some_task)时,不会自动包含配方中任务外部定义的Shell函数,因此直接调用会因找不到函数返回空值。以下是纯Shell实现的复用方案:
方案1:通过变量注入函数定义
将Shell函数定义存入BitBake变量,在任务中先展开执行该变量完成函数定义,再调用函数:
# 配方顶部(任务外)定义函数内容变量 IS_RECIPE_NATIVE_FUNC = "is_recipe_native() { echo \"${PN}\" | grep -q \"native\" && echo true || echo false; }" # 任务内部调用 do_some_task() { # 先执行变量中的函数定义代码 ${IS_RECIPE_NATIVE_FUNC} # 调用函数并获取结果 local result=$(is_recipe_native) echo "当前配方是否为native: $result" }
方案2:生成共享脚本并source调用
先通过前置任务生成包含函数定义的脚本,后续任务通过source(或.)加载脚本使用函数:
# 定义前置任务生成函数脚本 do_prepare_shared_funcs() { cat > ${WORKDIR}/shared_funcs.sh <<EOF is_recipe_native() { echo "${PN}" | grep -q "native" && echo true || echo false } # 可添加更多共享函数 EOF } # 设置前置任务在do_some_task之前执行 addtask prepare_shared_funcs before do_some_task # 目标任务中加载并使用函数 do_some_task() { # 加载共享函数脚本 . ${WORKDIR}/shared_funcs.sh local result=$(is_recipe_native) if [ "\${result}" = "true" ]; then echo "执行native配方专属逻辑" else echo "执行普通配方逻辑" fi }
方案3:直接在任务中嵌入函数定义片段
如果函数逻辑简单,也可以把函数定义片段通过变量直接嵌入多个任务,减少重复代码:
# 任务外定义函数代码片段 IS_RECIPE_NATIVE_DEF = "is_recipe_native() { echo \"${PN}\" | grep -q \"native\" && echo true || echo false; }" # 任务1 do_task_one() { ${IS_RECIPE_NATIVE_DEF} # 使用函数 [ "$(is_recipe_native)" = "true" ] && echo "task one: native配方" } # 任务2 do_task_two() { ${IS_RECIPE_NATIVE_DEF} # 使用函数 [ "$(is_recipe_native)" = "false" ] && echo "task two: 普通配方" }
内容的提问来源于stack exchange,提问作者luis.espinal
相关产品推荐
相关产品推荐

