makefile - 动态目标中的目标变量
问题描述
我有一些更复杂的 Makefile 动态生成的目标,如下所示:
COMPONENTS = foo bar lipsum
define TEST_template =
.PHONY: test-$(1)
test-$(1):
@echo test
endef
$(foreach cmpnt,$(COMPONENTS),$(eval $(call TEST_template,$(cmpnt))))
但现在我想向这个目标添加一个特定于目标的变量。对于非动态目标,这很好用:
test: VAR_ONE=1
test:
@echo "VAR_ONE=$(VAR_ONE)"
但是将这两者结合起来是行不通的
COMPONENTS = foo bar lipsum
define TEST_template =
.PHONY: test2-$(1)
test2-$(1): VAR_ONE=1
test2-$(1):
@echo "test - VAR_ONE=$(VAR_ONE)"
endef
$(foreach cmpnt,$(COMPONENTS),$(eval $(call TEST_template,$(cmpnt))))
现在运行make test2-foo
返回test - VAR_ONE=
,所以似乎没有设置变量。
这甚至可能吗?几天来我一直在努力实现这一目标,但我找不到任何东西。
解决方案
您必须转义define
您不想被call
. 所以是:
define TEST_template =
.PHONY: test2-$(1)
test2-$(1): VAR_ONE=1
test2-$(1):
@echo "test - VAR_ONE=$$(VAR_ONE)"
endef
一个好的经验法则(尽管与任何事情一样,也有例外)是在定义要与call
/eval
对一起使用的变量时,应直接引用call
(例如,$1
等$2
)的参数,并且应转义所有其他变量.
推荐阅读
- ibm-mq - DIS QSTATUS 与 DIS CHSTATUS 上的总 CONNAME 值之间的差异
- ruby-on-rails - 仅控制器中的时区设置
- windows - 卸载并重新安装 RabbitMQ 后无法启动 RabbitMq 服务
- sql-server - 承诺不在节点 js 中运行 T-SQL 查询
- sql - SQL - 通过增加另一个字段的“优先级”来过滤具有相同名称和顺序的记录
- javascript - 自定义意图的 AWS lambda 超时
- java - 从war文件访问Spring Boot的资源/静态文件夹中的文件
- sql - 如何为登录用户建立权限?
- android - 无法在片段中使用 TextInputLayout
- jquery - 使用 jquery 禁用基于天数的选择选项