2017-05-26 57 views
0
DEPRECATED_CHECK := $(shell grep "test454" tex/*.tex) 

ifneq ($(DEPRECATED_CHECK),) 
$(warning \test454 is deprecated. Use \test2 instead) 
endif 

輸出期抑制寄生第一部分當我運行此我得到:Makefile中

../common/Makefile.include:133: \test454 is deprecated. Use \test2 instead 

這很好,但我還蠻想只有有:

\test454 is deprecated. Use \test2 instead 

這是可能的?某種awk函數?我想我需要的東西:

@echo \text454 is deprecated ... 

但我不知道如何讓我的MWE的基本目的這個工作,因爲它使抱怨缺少分隔符。

非常感謝

回答

2

你可以使用$(info ...)代替$(warning ...)info不會預先指定文件和行號。

只是放在一邊 - 我通常會嘗試做這些檢查作爲健全規則的一部分,並且使一切都依賴於該規則而不是在頂層進行。這樣給你更多的靈活性。例如,如果你不想在構建clean時運行這個檢查,它變得很簡單,或者如果你想在檢查失敗的時候失敗這個構建,它也變得很簡單。


編輯在化妝的頂層做一個ifneq的(增加更多的細節除外)

相反,你可以添加一個目標是這樣:

sanity_check: 
    @ ! grep -q "test454" tex/*.txt || echo "test454 is depricated" 

.PHONY: sanity check 

主要目標對健康檢查的附加依賴關係:

all maintarg1 maintarg2: sanity_check 

這種方式的健全性檢查將在您的任何主要目標之前運行,並將按需輸出。在我看來,這是一種更乾淨的測試方法。這樣,只有在構建任何目標時纔會運行測試,並且不會運行,例如,如果您正在製作clean,或者如果您的makefile是由父級生成文件包含的,或者是其他一些其他角落案例可能會在未來出現。

只是關於配方語法的一個快速註釋:@是一個make指令,它告訴make不要在命令運行時回顯命令。 !是bash語法,用於反轉grep的返回值(因此,如果找到文本,則! grep返回false,從而導致評估語句的||部分)。 .PHONY: sanity_check告訴make運行規則,即使已存在名爲sanity_check的文件

+0

謝謝! 'info'完美運作。 –

+0

你能否詳細說一下你的身邊?我不確定我是否遵循:我不是程序員,我使用LaTeX(我是一名技術作家)。我對Bash的瞭解並不棒。 –