2014-12-07 49 views
0

我在GNU make中使用下面的Makefile。正如你所看到的,我在調用g ++的行前添加了一個@,以防止它們被回顯到控制檯。如何防止使用echo'ing命令到控制檯?

但是,g ++命令仍然回顯。有誰知道如何防止這種情況?

我有一個幾乎相同的Makefile一個C項目,它工作正常..

謝謝!

# for portability. 
SHELL = /bin/sh 
CXX  = g++ 

# compile flags. 
CXXFLAGS = -g -pedantic -Wall -Wextra -Werror -march=native -O2 \ 
      -fwhole-program -flto 

TARGET = program 
MANPAGE = program.8 
SOURCES = $(shell echo src/*.cpp) 
HEADERS = $(shell echo src/*.h) 
OBJECTS = $(SOURCES:.cpp=.o) 
VERSION = 0.1-beta 

# installation paths. 
PREFIX = $(DESTDIR)/usr/local 
BINDIR = $(PREFIX)/sbin 
MANDIR = $(PREFIX)/share/man/man8 

# standard targets. 
all: $(TARGET) 

$(TARGET): $(OBJECTS) 
     @echo "[LD] [email protected]" 
     @$(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJECTS) 

man: 
     @(cd man; gzip < $(MANPAGE) > $(MANPAGE).gz) 

install: $(TARGET) man 
     @install -D -m 755 $(TARGET) $(BINDIR)/$(TARGET) 
     @install -D -m 744 man/$(MANPAGE).gz $(MANDIR)/$(MANPAGE).gz 

install-strip: $(TARGET) man 
     @install -D -m 755 -s $(TARGET) $(BINDIR)/$(TARGET) 
     @install -D -m 744 man/$(MANPAGE).gz $(MANDIR)/$(MANPAGE).gz 

uninstall: 
     @$(RM) $(BINDIR)/$(TARGET) 
     @$(RM) $(MANDIR)/$(MANPAGE).gz 

clean: 
     @$(RM) $(OBJECTS) 

distclean: clean 
     @$(RM) $(TARGET) 
     @(cd man; $(RM) $(MANPAGE).gz) 

%.o: %.cpp $(HEADERS) 
     @echo "[CXX] $<" 
     @$(CXX) $(CXXFLAGS) -c -o [email protected] $< 

.PHONY: all man install install-strip uninstall clean distclean 
+0

你有任何'src/*。h'文件嗎?如果您不這樣做,則優先考慮.o文件的內置規則。使用'wildcard'而不是'shell'應該可以解決這個問題。 – 2014-12-07 16:26:02

+0

使用'make -s'或添加一行'.SILENT:'都會抑制'make'的所有輸出。不過,領先的'@'標記也應該這樣做。我個人不喜歡沒有顯示的makefile,或者有機制來顯示正在執行的內容,因爲當出現錯誤時很難調試。既然如此,我就不會定期使用'-s'或'.SILENT:'。 – 2014-12-07 16:43:31

+0

謝謝@Banthar,我正在測試沒有任何頭文件的Makefile! – James 2014-12-09 21:56:37

回答

2

如果你願意提供你運行的實際命令,你會看到不正確的輸出(加上之前和之後上下文的幾行)的樣品這將真正幫助。

您是否看到[CXX] src/xxx.cpp的編譯行?考慮到你提供的makefile,沒有辦法可以發生。如果您只看到編譯行,那意味着make決定不使用您的模式規則,而是使用其自己的內置模式規則。你需要使用make -d來看看爲什麼放棄你的模式規則。

順便說一句,你可以使用$(wildcard src/*.cpp),而不是$(shell echo src/*.cpp),並指派一個shell函數(或通配符或者在計算上是昂貴的任何功能)的結果時,你應該總是使用:==,除非有特殊原因推遲擴張。

+0

感謝您的提示! :) – James 2014-12-09 21:56:59