2017-10-07 63 views
1

我在向autotools項目添加特定規則時遇到了一些問題。automake規則中的相關性檢查

我有這樣的小項目爲例:

項目/ configure.ac:

AC_INIT([myprog], [0.1], [[email protected]]) 
AM_INIT_AUTOMAKE([foreign -Wall -Werror]) 
AM_EXTRA_RECURSIVE_TARGETS([quality]) 
AC_PROG_CC 
AC_SUBST([AM_CFLAGS]) 
AC_CONFIG_HEADERS([config.h]) 
AC_CONFIG_FILES([Makefile src/Makefile]) 
AC_OUTPUT 

項目/ Makefile.am:

SUBDIRS = src 

項目/ src目錄/ Makefile.am:

bin_PROGRAMS= myprog 

myprog_SOURCES = myprog.c 

QUALITYDIR=$(builddir)/quality 
QUALITY_FILE="$(QUALITYDIR)/quality.log" 

quality-local: $(QUALITY_FILE) 

$(QUALITY_FILE): myprog 
    mkdir -p $(QUALITYDIR) 
    valgrind ./myprog 2>&1 | tee $(QUALITY_FILE) 

CLEANFILES = $(QUALITY_FILE) 

each tim Ë我做的:

$使質量

的東西Valgrind的運行,即使「MYPROG」尚未重建。 我希望它只能在myprog比build/src/quality中的quality.log文件更年輕時執行。

我該怎麼做?

回答

1

挖掘到你產生project/src/Makefile,你會看到類似這樣的:

.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ 
     ... quality-am quality-local ... 

一個.PHONY target總會被翻拍,所以是valgrind將始終運行(這也是我觀察到的)。

編輯:

忘記這一切。運行make -d quality後(已作出日誌後)我注意到:

Considering target file '"./quality/quality.log"'. 
    File '"./quality/quality.log"' does not exist. 

所以,簡單地改變:

QUALITY_FILE="$(QUALITYDIR)/quality.log" 

QUALITY_FILE=$(QUALITYDIR)/quality.log 

應使其行爲像您期望。至少它爲我做了。

+0

我不認爲這可以解釋它。是的,.PHONY的目標總是重新制作,但不會強制重建最新的先決條件(考慮到傳統的「全部」目標通常是.PHONY)。 OP的valgrind命令是常規目標配方的一部分;只有當該規則的目標不存在或者其先決條件已過時時才應運行。 –

+0

@JohnBollinger在玩了更多之後,我發現你是對的。 – ldav1s

+0

第二次嘗試,+1。我會補充說,這種事情是編寫DRY make規則的一個很好的理由,特別是在規則的配方中使用內置變量'$ @'來引用該規則的目標。 –