2017-10-07 13 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 :

내가이 작은 exemple 프로젝트가

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) 

각 팀 전자 내가 할 :

$ 품질

Valgrind의 물건을 실행할 수 있도록, "MYPROG는"재건되지 않은 경우에도 마찬가지입니다. myprog가 build/src/quality의 quality.log 파일보다 작은 경우에만 실행되어야한다고 생각합니다.

내가 뭘 잘못 했니?

답변

1

로 파고 당신은 같은 것을 볼 수 있습니다 project/src/Makefile 생성 :

.PHONY target은 항상 다시 만들어됩니다
.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ 
     ... quality-am quality-local ... 

, 그래서 네 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가 규칙을 작성하고, 특히 규칙의 레시피에서 내장 변수'$ @ '를 사용하여 해당 규칙의 대상을 참조하는 훌륭한 이유라고 덧붙입니다. –