2013-11-12 2 views
0

У меня есть этот 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 [email protected] $^ -g -Wall -std=gnu99 -ldl -Wl,--export-dynamic 

$(PLUGINS_DIR)/%.so: $(PLUGINS_DIR)/%.o 
    $(CC) $^ -o [email protected] -shared 

$(PLUGINS_DIR)/%.o: $(PLUGINS_DIR)/%.c 
    $(CC) -c $< -o [email protected] -pedantic -g -Wall -std=c99 -fpic -I. 

clean: 
    $(RM) -rf $(TARGET) *.o *.a $(PLUGINS_O) $(PLUGINS_SO) 

но clean все еще outputing сообщение! (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)

EDIT: Использование не делают 4.0

+0

Я не получаю сообщения с Makefile , (GNU make 3,81) –

+0

@OlafDietsche I'm on make 4.0 – alexandernst

+1

Что rm файлов .o делает удаление промежуточных файлов. Не работает ваша команда rm. Вам нужно сказать, чтобы не делать этого, чтобы избежать этого сообщения. См. Ответ MadScientist о том, как это сделать. Другой способ использования .PRECIOUS. –

ответ

3

Я думаю, что у вас есть это неправильно; Я готов поспорить, что это не ваше чистое правило, которое печатает это.

Эти объектные файлы считаются «промежуточными целями», и поэтому они автоматически удаляют их. Когда это произойдет, он распечатает эту информацию, чтобы вы знали, куда они пошли. Единственный способ остановить это - определить специальную цель .SILENT: (или дать флаг -s, но вы сказали, что не хотите этого делать).

Или, вы можете убедиться, макияж не считает эти файлы промежуточным (и, следовательно, их не удалять), перечислив их в качестве предпосылок, может быть:

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

Чтобы быть понятным, 'make clean' не будет печатать эту строку, потому что она не создает эти цели, поэтому не удаляет их. Он напечатан только 'make all'. – MadScientist

+0

Yup, вот что :) – alexandernst

Смежные вопросы