makefile - 如何在make中进行条件调试
问题描述
我正在寻找我的 makefile 以获取一些条件消息。我想要的一个简单示例如下所示:
ifdef DEBUG_XX
define info_xx
$$(info XX $(1))
endef
else
info_xx :=
endif
some_var := 1
$(info def:$(call info_xx, called: some_var:$(some_var)))
$(call info_xx,called: some_var:$(some_var))
all:
这样当且仅当DEBUG_XX
被定义时,我的消息才会出现。不幸的是,上面抛出了一个错误:
make-lib> make -f test.mk DEBUG_XX=y
def:$(info XX called: some_var:1)
test.mk:11: *** missing separator. Stop.
它似乎正在评估 的输出$(info)
,这对我来说没有多大意义......我错过了什么?
解决方案
该错误是由于“info”之前的双美元造成的,这是一个错误:“define”/“endef”中的一行被保存为仅在替换运算符处扩展的文字。
但是,IMO,最好像这样重写您的代码:
info_xx=$(if $(DEBUG_XX),$(info XX $1))
另请注意:
$(info def:$(call info_xx, called: some_var:$(some_var)))
将打印
XX called: some_var:1
def:
这是因为参数扩展(即“调用”,然后是第二个“信息”)在第一个“信息”有机会打印任何内容之前完成。
你可以用info_xx=$(if $(DEBUG_XX),XX $1)
. 但是那么一个纯粹的$(call info_xx,called: some_var:$(some_var))
显然会导致错误。
推荐阅读
- swift - 如何使用 IGListKit 在选择时为 UICollectionViewCell 设置动画
- fosuserbundle - 在 FOSUserBundle 中查看其他用户的个人资料
- forms - Yii2:为提交表单按钮创建条件
- javascript - 获取唯一的数据属性值并从中创建键值数组?
- javascript - 如何在 MongoDB 中保存嵌套文档对象
- webpack - Aurelia Webpack 包无法与 PhoneGap 一起使用
- django - Django休息插入顺序
- c# - 需要将数据从 CAPL 写入 C# 代码并读回 CAPL 脚本
- scala - Intellij:如果未提供命名变量,则数据集上的火花过滤器被标记为错误
- apache-spark - Apache Spark 中的 Printschema()