2015-06-22 76 views
2

我正在使用可變源和編譯器的Makefile。有條件的Makefile

基本上,我想要它做的是顯示一個綠色的消息,如果編譯工作得很好,否則紅色。此外,我想避免顯示Makefile生成的常見錯誤消息(和編譯消息)。 (當我試圖與所有的「@」做)

下面是我對現在:

COMP = gcc 

NAME = test 

RM  = rm -f 

SRC  = main.c 

OBJS = $(SRC:.c=.o) 

CFLAGS = -Werror 

all: $(NAME) 

$(NAME): 
     @$(COMP) -c $(SRC) 
     @$(COMP) -o $(NAME) $(OBJS) 

ifeq ($?, 0) 
     @echo -e '\033[1;32;40mCompilation : OK\033[0m' 
else 
     @echo -e '\033[1;31;40mCompilation : ERROR\033[0m' 
endif 

clean: 
     @$(RM) $(OBJS) 

fclean: clean 
    @$(RM) $(NAME) 

re: fclean all 

.PHONY: all clean fclean re 

它所做的就是顯示「編輯:ERROR」時,它編譯好,但我認爲,如果$?等於0意味着它解決了,所以我找不到任何解釋。

你知道如何讓它做我想找的東西嗎?

非常感謝。

編輯:從你們很多人的精彩幫助,我仍在調查食譜,但我找到了一種方法來簡單地顯示它的成功和失敗時。

$(NAME): $(OBJS) 
     @$(COMP) $(OBJS) -o $(NAME) && echo -e "\033[32mCompilation: OK\033[0m" || echo -e "\033[31mCompilation: ERROR\033[0m" 

我會繼續挖掘,謝謝。

+0

你正在嘗試混合bash和make。在你的例子中,ifeq語句在讀取makefile時(而不是在之前的配方運行之後)被解析,所以$?沒有意義。你應該從一個串聯的配方中做到這一點。 – John

+1

從make的輸出中刪除錯誤通常是一個非常糟糕的主意。有很多編輯器會分析編譯器的輸出以跟蹤它們以供以後的用戶指導。 vim捕獲這個輸出,你可以在編輯器中從錯誤到錯誤。刪除此功能會使構建過程成爲黑洞! – Klaus

+0

有趣的哈哈,感謝您的輸入,我相信我已經找到了一種方式來顯示錯誤信息,而不會觸及這些錯誤。 – Christopher

回答

2

$?是一個shell變量而不是make變量,您正在使用該if語句測試make變量,並且您的目標的配方只有一個echo行。

(請參閱從make -qp輸出到明白我的意思。)

,做你想做,你就需要在$?一個測試然而實現,使將在第一失敗的命令退出這樣你會什麼從不以這種方式查看故障回波輸出(除非您捕捉/隱藏編譯命令中的if或類似結構造成的故障)。

類似這樣的東西可以用於捕獲/隱藏make中的退出狀態,但允許您使用它。

@if $(COMP) -c $(SRC); then \ 
    echo -e '\033[1;32;40mCompilation : OK\033[0m'; \ 
else \ 
    _ret=$$?; \ 
    echo -e '\033[1;31;40mCompilation : ERROR\033[0m'; \ 
    exit $$_ret;\ 
fi 

_ret位是有編制的退出代碼退出化妝,而不是靜態的exit 1或什麼的。

+0

我明白了,正如你所說,沒有直接的方式來顯示個人信息的錯誤。但是我很感興趣,在退出之前我不能簡單地顯示紅色的「編譯:錯誤」嗎?你談到了捕獲/隱藏失敗,你能給我一些精確的嗎?非常感謝你的幫助。 – Christopher

+0

你可以用一個或命令來做...我會寫一個resopnse ... – John

+0

你絕對可以顯示你想要的任何失敗信息,只需要確保在你做之前看不到失敗。 –

1

你需要的是這樣的:我使用if語句的「\」來concatinate bash命令

$(NAME): 
    @$(COMP) -c $(SRC) 
    @$(COMP) -o $(NAME) $(OBJS); \ 
    if [ $$? == 0 ]; then \ 
     echo -e '\033[1;32;40mCompilation : OK\033[0m'; \ 
    else \ 
     echo -e '\033[1;31;40mCompilation : ERROR\033[0m'; \ 
    fi; \ 
    true 

通知,所以他們都顯示爲一個單一的配方。我還在最後添加了一個真正的語句,以便不管if語句返回什麼,連接的配方將返回true,並且make不會失敗。你也可以這樣做:

$(NAME): 
     @$(COMP) -o $(NAME) $(OBJS) || echo .... 

其中echo只會在前面的命令失敗時纔打印。

+0

有趣的是,所有這一切都是新的,這有助於解決很多問題,謝謝您的精確解釋。我已經試過了,用你提出的第一個替換我的當前$(NAME),但它似乎不適合。 '@'和'if'似乎沒有被識別。非常感謝你的幫助。 – Christopher

+0

哎呀,是的'@'是一個makefile的東西,不能放在配方中。我會編輯答案... – John

+0

那麼腳本應該放在哪裏?不直接在Makefile中?我不知道我明白了。 – Christopher