2010-05-06 2 views
6

이것은 사소한 것이거나 make가 어떻게 사용되어야하는지에 대한 철학에 어긋나지 만 "DEBUG = make"대신 "make debug"로 읽는 명령 줄을 갖고 싶습니다. 1". DEBUG 변수를 설정하는 것 외에는 아무 것도하지 않는 debug라는 가짜 타겟을 만들려고했지만, "make debug build"와 "make build debug"의 차이가있었습니다. 즉, 한 가지 경우에는 변수가 빌드 후에 설정됩니다. 일어난.메이크 파일 타겟을 사용하여 빌드 옵션 설정하기

특정 대상에게 우선 순위를 부여 할 수있는 방법이 있습니까?

도움 주셔서 감사합니다.

답변

3

에 넣어 모든 대상 당신은 또한보고 그것을 할 수 있습니다 작동 변수 MAKECMDGOALS

ifneq "$(findstring debug, $(MAKECMDGOALS))" "" 
DEBUG = 1 
endif 

build: 
    @echo build and DEBUG is [$(DEBUG)] 

debug: 

당신이 그것을 호출 할 때이 일어나는 것이다 :

0

디버그가 빌드 대상에만 사용되는 경우 디버그 호출 빌드도 가능하므로 make build이 디버그가 아닌 경우 make debug 또는 make build을 입력하면됩니다.

하지만 실제 질문에 대해서는 메이크 파일에 익숙하지 않아서 대답 할 수 없습니다.

1

는 다음을 작성할 수 있습니다

.PHONY: debug 
debug: 
     $(MAKE) -$(MAKEFLAGS) build DEBUG=1 

build: 
     echo makeflags='$(MAKEFLAGS)' debug=${DEBUG} 

이 GNU 적어도 작업을 할 것, BSD 확인하고는 Interix는합니다. 나는 다른 모든 구현을 시도하지 않았다.

+0

make 파일을 재귀 적으로 평가할 때의 이식성. – dmckee

5

this page의 '대상 지정 변수 값'을 참조하십시오.

+9

아무런 해를 끼치 지 않으면 대상에 대해'target : DEBUG = 1'을해야한다는 것 말고 문서를 가리키고 있다고 ... 맞습니까? – dlamotte

+0

"make build debug"가 "make debug build"와 같은 문제를 해결하지 못합니까? 이 특정 기능은 정확히 내가 시도한 것입니다. – leoger

+1

되돌아 보면, 그 질문이 당신의 질문과 어떻게 일치하는지 볼 수는 있지만 분명하게하지는 않았습니다. 목표가 * 항상 * 주문되므로, 당신이 불가능한 임무를 수행하고 있다고 생각합니다. – bmargulies

0

한 가지 방법은 빌드 및 디버그 대상 모두에 종속성 및 빌드 규칙을 설정하는 것이지만 디버깅 대상에 디버깅 옵션을 추가하는 것입니다. 간단한 예 : 당신이 GnuMake로 할 수있는

메이크

program:  program.c 
       gcc -o program program.c 
debug:   program.c 
       gcc -D DEBUG -o program program.c 

program.c에

#include <stdio.h> 
int main(void) { 
#ifdef DEBUG 
    printf("DEBUG on!\n"); 
#endif 
    printf("in the program\n"); 
    return 0; 
} 
1

한 것은 foreach 내장과 규칙을 확장하여 사용하는 매크로입니다. 뭔가 같이 :

TARGETS := build all foo bar baz 

define DEBUG_TARGET_RULE 
$(1).debug: 
     $$(MAKE) DEBUG=1 $(1) 
debug.$(1): 
     $$(MAKE) DEBUG=1 $(1) 
endef 

$(foreach target,$(TARGETS),$(eval $(call DEBUG_TARGET_RULE,$(target)))) 

이것은 당신이 make debug.foo 또는 make foo.debug을 입력 할 수 있으며 자동으로 make DEBUG=1 foo으로 바뀔 것이다, 그리고 당신이 $(TARGETS)

+0

정확히 내가 원하는 것은 아니지만 멋진 해결 방법은 make의 유용한 기능을 보여줍니다. – leoger