Makefile忽略@到静默输出

时间:2013-11-12 20:20:45

标签: c makefile

我有这个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

1 个答案:

答案 0 :(得分:3)

我认为你错了;我敢打赌,打印这个不是你干净的规则。

这些目标文件被视为“中间目标”,因此make会自动为您删除它们。如果是这样,它会打印该信息,以便您知道它们去了哪里。阻止这种情况发生的唯一方法是定义.SILENT:特殊目标(或给出-s标志,但你说你不想这样做。)

或者,您可以通过将它们列为先决条件来确保make不会将这些文件视为中间文件(因此不会删除它们),可能:

all: $(TARGET) $(PLUGINS_SO) $(PLUGINS_O)