我在MacOS中的makefile中使用了下面的示例代码来构造路径,但是它始终不起作用。
all:
ROOT=$(shell pwd)
@echo $(ROOT)
AGENT:=$(ROOT)/agent
@echo $(AGENT)
@mkdir -p $(AGENT)
它将输出为AGENT:=/agent
,显然,AGENT
变量未扩展为ROOT
这里有几个常见错误:
$(shell...)
make函数:配方已经是shell脚本。var=xxx
(=
周围没有空格),仅在配方中(嗯,几乎只有)。它们使用$var
或${var}
进行扩展,但从未使用$(var)
进行扩展,仍然几乎仅在配方中进行扩展。var := xxx
或var = xxx
(:=
或=
周围有空格或无空格),仅在配方之外(几乎,仅)。它们用$(var)
或${var}
进行扩展,而不用$var
进行扩展。请注意,=
和:=
不同,但这不在范围内。尝试类似的事情,也许:
ROOT := $(shell pwd)
AGENT := $(ROOT)/agent
all:
@echo $(ROOT)
@echo $(AGENT)
@mkdir -p $(AGENT)
[ROOT
和AGENT
是make变量,在任何规则之外定义并且在任何配方中都可用。
注意:如果您使用的是GNU make,则CURDIR
make变量已定义并扩展为当前工作目录。无需使用pwd
,只需使用$(CURDIR)
而不是$(ROOT)
。如果ROOT
指向Makefile所在的位置,并且您有可能使用-C
或-f
make选项从其他地方调用make,也可以使用以下方法获取它:
ROOT := $(dir $(lastword $(MAKEFILE_LIST)))