【发布时间】:2018-02-15 05:02:31
【问题描述】:
我正在尝试编写一个在命令行参数更改时强制执行的生成规则。我将此命令行参数分配给生成文件变量 ARG。
当我第一次执行makefile时,dep.mk的规则被执行。但是当命令行参数改变时,不会触发这条规则
这是我的代码:
temp.mk的内容
ARG := $(basename $(filter %.ext,$(MAKECMDGOALS)))
# I want this rule to depend on value of ARG
# if the value from commandline changes then the rule should trigger dep.mk rule
# if I replace dep.mk rule with the below commented line , then it goes into infinite loop
#dep.mk : $(ARG)
dep.mk :
mkdir -p $(dir $@)
$(shell touch $@)
@echo "Creating dep.mk"
include dep.mk
%.ext :
@echo "in ext rule"
.PHONY : $(ARG)
调用makefile的命令:
make -f temp.mk foo.ext
输出:
mkdir -p ./
Creating dep.mk
in ext rule
下次我使用不同的参数执行 makefile 时:
make -f temp.mk bar.ext
输出:
in ext rule
预期输出:
mkdir -p ./
Creating dep.mk
in ext rule
如果我直接依赖$(ARG),makefile 将进入无限循环。谁能帮我解决这个问题?
【问题讨论】:
-
你为什么要这样工作?这里有实际的依赖关系吗? Make 将检查文件系统并为相对于它们的依赖项丢失或过时的目标运行配方。
-
在我试图解决的问题中,我希望 dep.mk 保存一些使用传递的命令行参数制定的信息。这些信息将在以后用于一些进一步的操作
-
如果
dep.mk真的是一个目录,那么你想依赖于那个目录in 的东西。一个常见的技巧是touch dep.mk/.$@将$@标记为已制作,并有一个类似%: dep.mk/.%的规则,但我真的仍然不假装理解你真正想要完成的事情。 -
对于
make -f temp.mk foo.ext,没有与foo匹配的规则,这是$(ARG)的扩展值。make -f temp.mk bar.ext也是如此。
标签: makefile command-line-arguments infinite-loop