Bjam变量赋值失败?如何正确为字符串变量赋值
Bjam中正确的字符串变量赋值方式
你的问题核心是混淆了Bjam自身语法和actions块内的shell语法:
问题根源
actions块里的代码并不是Bjam解释执行的,而是会被展开后传递给系统shell作为脚本执行。你写的epath = ...是Bjam的变量赋值语法,但在shell里会被当成命令,自然找不到epath命令;basename ( $(epath) )也不符合shell的语法(shell调用命令不需要括号),所以报错。
两种正确解决方法
方法1:用Bjam语法在actions外提前计算
把变量赋值和函数调用移到actions块外面,先通过Bjam计算好值,再在actions里引用:
import path : basename ; # 在actions外部用Bjam语法计算变量 local epath = $(MY_ROOT_PATH)/projects/mytest/bin/gcc-9/release/qt5client ; local ename = basename $(epath) ; actions make_mytest_install { echo "make_mytest_install: MY_ROOT_PATH $(MY_ROOT_PATH) PWD $(PWD:E=not_set)" ; echo "epath $(epath) ename $(ename)" ; } explicit install-gettext ; make install-mytest : : @make_mytest_install ;
方法2:用shell语法在actions内处理
如果需要在actions里动态计算,要使用shell的语法(注意shell变量赋值不能有空格,调用命令用shell的格式):
import path : basename ; actions make_mytest_install { echo "make_mytest_install: MY_ROOT_PATH $(MY_ROOT_PATH) PWD $(PWD:E=not_set)" ; # shell变量赋值:等号前后不能有空格 epath="$(MY_ROOT_PATH)/projects/mytest/bin/gcc-9/release/qt5client" ; # shell调用basename命令,用$()捕获输出 ename=$(basename "$epath") ; echo "epath $epath ename $ename" ; } explicit install-gettext ; make install-mytest : : @make_mytest_install ;
关键提醒
- Bjam的核心语法(变量赋值、函数调用、规则定义)要写在
actions块之外; actions块的内容是shell脚本模板,只能用shell的语法,变量引用用$变量名(shell语法),而Bjam的变量会被先展开成对应的值传递给shell。
内容的提问来源于stack exchange,提问作者sdbbs
相关产品推荐
相关产品推荐

