用变量名明确地创建目标

时间:2017-08-26 15:00:15

标签: makefile gnu-make

我的Makefile格式如下:

.PHONY: all

target1 := file1
target2 := $(target1).txt

all: $(target2)

$(target1): prerequisite1
    recipe

$(target2): $(target1)
    recipe 

target2取决于target1make将正确替换字符串以创建文件名。但是,在我的系统上,输入文件名和路径非常繁琐;我想知道是否有 专门使target1同时将其名称​​称为文件路径,而不是作为变量的方法。

例如,我希望能够调用:

$ make $(target1) 

而不是

$ make path/to/file1

我想这样做是因为我更改了变量并且我的Makefile的结构有许多中间件,偶尔难以追溯到他们的文字文件路径,但很容易{{1}基于我为其分配的变量名称。

以上内容不起作用,我已阅读make页面,并在Google和Google上进行了大量搜索。只是想知道是否有人之前遇到过这个问题,并找到了解决方案。

2 个答案:

答案 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知道他们不会生成他们名字的文件。