关于makefile:为什么GNU会在末尾添加此\\’rm \\’命令?

Why is GNU make adding this 'rm' command at the end?

本问题已经有最佳答案,请猛点这里访问。

我创建了一个Makefile,但是当我使用它时,由于某种原因,make似乎在末尾添加了rm命令。

这里是Makefile,仅去除了FILENAMESTESTS的全部内容:https://gist.github.com/riking/9a1dff3f1c1b36e6dbfce53e52a325ff

编辑:这是最终变得很重要的规则。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
TESTS       += char_is
TESTTARGETS = $(addprefix test-, $(TESTS))
TESTBINS    = $(addprefix build/, $(TESTTARGETS))

build/%.o: %.c libft.h | build
    $(CC) $(CFLAGS) -c $< -o $@

test: $(TESTBINS)
    for bin in $(TESTBINS); do \\
        echo $$bin ; \\
        $$bin ; \\
        echo ; \\
    done

build/test-%: build/test_%.o libft.a | build
    $(CC) $(LDFLAGS) -o $@ $^

当我运行make re test时,输出以以下内容结束:

1
2
3
4
.....
build/test-memmove

rm build/test_ft_memcpy.o ... build/test_char_is.o

($(TESTS)的每个元素一个目标文件)

为什么要删除目标文件?


测试二进制文件的目标文件是中间产品,因为测试二进制文件是使用隐式规则创建的,而不是使用显式规则创建的libft.a存档。

由于它们是一系列模式规则的中间产品,因此在构建结束时将其删除。

讨论此问题的"制作"手册页是"内隐规则链"。