我的Makefile
格式如下:
.PHONY: all
target1 := file1
target2 := $(target1).txt
all: $(target2)
$(target1): prerequisite1
recipe
$(target2): $(target1)
recipe
target2
取决于target1
,make
将正确替换字符串以创建文件名。但是,在我的系统上,输入文件名和路径非常繁琐;我想知道是否有
专门使target1
同时将其名称称为文件路径,而不是作为变量的方法。
例如,我希望能够调用:
$ make $(target1)
而不是
$ make path/to/file1
我想这样做是因为我更改了变量并且我的Makefile
的结构有许多中间件,偶尔难以追溯到他们的文字文件路径,但很容易{{1}基于我为其分配的变量名称。
以上内容不起作用,我已阅读make
页面,并在Google和Google上进行了大量搜索。只是想知道是否有人之前遇到过这个问题,并找到了解决方案。
答案 0 :(得分:2)
这对于正确使用递归有点笨拙,但它可以做你想要的:
target1 := file1
$(target1):
@echo "Hello from $@"
variable-%:
$(MAKE) $($*)
给出
$ make variable-target1
make file1
Hello from file1
答案 1 :(得分:0)
这就是假冒目标的用途。 phony 目标是不是输出文件名称的目标。通常,默认目标(即Makefile中首先出现的目标)是 phony ,按惯例称为all
。所以只需将Makefile修改为:
.PHONY: all target1 target2
target1 := file1
target2 := $(target1).txt
# phony rules with dependencies
all: target2
target2: $(target2) target1
target1: $(target1)
# file rules with prerequisites
$(target1): prerequisite1
recipe
$(target2):
recipe
作为“最佳实践”,列出未直接用于在 phony 目标的先决条件列表中创建真实目标的依赖项,以及在先决条件中确实是输入文件的依赖项实际文件目标列表。
请注意,如果<{1}} 中没有声明目标,只要不会出现具有 phony 目标名称的文件。这样的文件会混淆.PHONY
,因此始终会在make
中列出所有虚假目标,因此.PHONY
知道他们不会生成他们名字的文件。