我有这个Makefile:
CC = @gcc
RM = @rm
TARGET = test
PLUGINS_DIR = plugins
PLUGINS_C = $(wildcard $(PLUGINS_DIR)/*.c)
PLUGINS_O = $(patsubst %.c,%.o, $(PLUGINS_C))
PLUGINS_SO = $(patsubst %.c,%.so, $(PLUGINS_C))
.PHONY: plugins
new: clean all
all: $(TARGET) $(PLUGINS_SO)
$(TARGET): $(TARGET).o
$(CC) -o $@ $^ -g -Wall -std=gnu99 -ldl -Wl,--export-dynamic
$(PLUGINS_DIR)/%.so: $(PLUGINS_DIR)/%.o
$(CC) $^ -o $@ -shared
$(PLUGINS_DIR)/%.o: $(PLUGINS_DIR)/%.c
$(CC) -c $< -o $@ -pedantic -g -Wall -std=c99 -fpic -I.
clean:
$(RM) -rf $(TARGET) *.o *.a $(PLUGINS_O) $(PLUGINS_SO)
但clean
仍在输出消息! (rm plugins/tt.o plugins/kk.o
)
如果我删除@
前面的rm
,那么我会收到另一条消息,除了第一条消息:rm -rf test *.o *.a plugins/kk.o plugins/tt.o plugins/kk.so plugins/tt.so
如何让make
完全沉默? (请不要make
切换,只需在Makefile中编码)
编辑:使用make 4.0
答案 0 :(得分:3)
我认为你错了;我敢打赌,打印这个不是你干净的规则。
这些目标文件被视为“中间目标”,因此make会自动为您删除它们。如果是这样,它会打印该信息,以便您知道它们去了哪里。阻止这种情况发生的唯一方法是定义.SILENT:
特殊目标(或给出-s
标志,但你说你不想这样做。)
或者,您可以通过将它们列为先决条件来确保make不会将这些文件视为中间文件(因此不会删除它们),可能:
all: $(TARGET) $(PLUGINS_SO) $(PLUGINS_O)