为什么 Makefile 中的 basename 不能按预期工作?

wad*_*wad 6 makefile

TESTS=test/hello.c
try:
        @for t in $(TESTS); do echo $(basename $$t); done
Run Code Online (Sandbox Code Playgroud)

运行“make”我得到

~ make
test/hello.c
Run Code Online (Sandbox Code Playgroud)

这很奇怪,因为我期望获得基本名称“hello.c”。有什么解释吗?谢谢。

Bet*_*eta 7

问题是您试图basename在 shellfor循环内使用 Make 指令。$(basename ...)Make 将首先扩展语句(因此$(basename $$t)变为$t),然后传递命令

for t in test/hello.c; do echo $t; done
Run Code Online (Sandbox Code Playgroud)

到外壳。

这将给出test/hello

@for t in $(basename $(TESTS)); do echo $$t; done
Run Code Online (Sandbox Code Playgroud)

这将给出hello.c

@for t in $(notdir $(TESTS)); do echo $$t; done
Run Code Online (Sandbox Code Playgroud)