2010-04-26 5 views
44

대상체 내부에 Makefile 변수 값을 재 할당하는 방법이 있습니까?대상체 내부의 Makefile 변수 값 변경

내가 뭘하려고 디버그 컴파일에 대한 몇 가지 추가 플래그를 추가하는 것입니다 : 그래서 나는 몇 가지 새로운 플래그를 추가, 내 환경을 정리하고 싶은 테스트 대상을 호출하는 경우

%.erl: %.beam 
    $(ERLC) $(ERLFLAGS) -o ebin $< 

test: clean debug_compile_flag compile compile_test 

debug_compile: 
    $(ERLCFLAGS) += -DTEST 

(같은 -DTEST) 기존 코드와 마찬가지로 전체 코드를 다시 컴파일합니다 (첫 번째 소스, 테스트 모듈).

여기 저기에 많은 로직이 있으므로 일부 새로운 플래그를 설정하여 컴파일하는 코드를 복사/붙여 넣기하고 싶지 않습니다.

기존 코드를 재사용 할 수 있도록 변수 값을 재정의하는 쉬운 방법이 있습니까?

+0

가능한 중복 (http://stackoverflow.com/questions을 [규칙 실행시 변수를 만들 정의]/1909188/정의 - 메이크업 변수 -에서 - 규칙 실행 시간) –

답변

-5

편집 : other answer의 베타에서 설명한대로 가능합니다.


아니요. Makefile에서이 작업을 수행 할 방법이 없습니다. 그러나 make 명령 줄에서 변수 값을 변경할 수 있습니다. 다음과 같이 당신이 당신의 Makefile을 재 작성하는 경우 :

ERLCFLAGS += $(ERLCFLAGSADDED) 

%.erl: %.beam 
    $(ERLC) $(ERLCFLAGS) -o ebin $< 

test: clean compile compile_test 

를 그런 다음 사용하여 테스트를 수행하기 위해 메이크업을 호출 할 수 있습니다

make ERLCFLAGSADDED=-DTEST test 
+0

그래, 내가 해결 당신이 debug_compile에 submake를 실행, 제안 문제 : 는 ERLC_FLAGS = $ (ERLC_DEBUG_FLAGS) $ (MAKE) 감사를 컴파일 ! – paulgray

+0

아, 그래. 나는이 submaking 호출에 대해 생각하지 않았다. –

+0

다른 플래그 값을 사용하여 대상을 여러 번 실행하려는 경우 submake 호출은 여전히 ​​유용합니다. 아래의 주석에서 인용 한 문서를 참조하십시오. – ntc2

58

예, 거기에 그것을 할 수있는 쉬운 방법이며, 확인 다시 실행하지 않고.

test: clean debug_compile 

debug_compile: ERLCFLAGS += -DTEST 
debug_compile: compile compile_test; 
+2

여기서 실행 순서가 보장됩니까? 또는 make -j2를 사물로 만들 수 있습니까? – Marenz

+2

[Docs] (http://www.gnu.org/software/make/manual/make.html # Target_002dspecific) : "주어진 전제 조건은 make를 호출 할 때마다 한 번만 생성된다는 점에 유의하십시오. 동일한 파일이 여러 대상의 전제 조건이고 해당 대상 각각에 동일한 대상에 대해 다른 값이있는 경우, 빌드 할 첫 번째 대상은 해당 전제 조건을 작성하게하고 전제 조건은 첫 번째 대상에서 대상 특정 값을 상속받으며 다른 대상의 대상 특정 값은 무시합니다. " – ntc2

38

또 다른 대답은 여기에 있습니다 : : Define make variable at rule execution timetarget-specific variable value 사용합니다.

게으른를 들어, 같은 규칙이 할 수있는 다음 (FLAGDEBUG 내 변수) :

.DBG: 
    $(eval FLAG += $(DEBUG)) 
+2

나만을 위해 일한 버전, 감사합니다! – Raphael

+1

나는'$ (eval xxx)'에 많은 문제가 있으며, 이상한 부작용이있다. "진짜"Makefile 변수 할당뿐만 아니라 작동하지 않는 것 같습니다. – Cyan

+0

'eval' 함수에 문제가 있습니다. 변수에 eval을 정의한 변수가이 행에 도달하지 않았을 때 대상 실행의 시작 부분에 값을 가져 오기 때문에 값이 비어 있습니다. 예를 들어, 타겟의 시작 부분에 파일을 만들고,'eval FILES = $ (shell ls)'을 사용하여 변수를 채우려한다면, 파일 var는 비어 있습니다. –

0

내가 소스 코드를 컴파일 암시 테스트를 실행하여 메이크 파일에 대상을 추가하고 싶었 일부 디버그 플래그가 있습니다. 이안의 대답은 https://stackoverflow.com/a/15561911/뿐이었습니다.

여기 make tests 실행할 때 실행 순서를 보증을 내가 해낸 메이크,이다 :의

TARGET  = a.out 

CC   = g++ 
GENERIC_F = -Wall -Wextra -I. -Idoctest/doctest/ 

CFLAGS  = -O0 -std=c++11 $(GENERIC_F) 
DEBUG_MODE = -DDEBUG 

LINKER  = g++ 
LFLAGS  = $(GENERIC_F) -lm 

SRCDIR  = src 
OBJDIR  = build 
BINDIR  = bin 

SOURCES = $(wildcard $(SRCDIR)/*.cc) 
INCLUDES = $(wildcard $(SRCDIR)/*.h) 
OBJECTS = $(SOURCES:$(SRCDIR)/%.cc=$(OBJDIR)/%.o) 
rm   = rm -f 

.PHONY: clear_screen tests extend_cflags 

$(BINDIR)/$(TARGET): $(OBJECTS) $(INCLUDES) 
    $(LINKER) $(OBJECTS) $(LFLAGS) -o [email protected] 
    @echo -e "Linking complete!\n" 

$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.cc $(INCLUDES) 
    @mkdir -p $(OBJDIR) $(BINDIR) 
    $(CC) $(CFLAGS) -c $< -o [email protected] 
    @echo -e "Compiled "$<" successfully!\n" 

.PHONY: clean 
clean: 
    @$(rm) $(OBJECTS) 
    @echo "Cleanup complete!" 

.PHONY: remove 
remove: clean 
    @$(rm) $(BINDIR)/$(TARGET) 
    @echo "Executable removed!" 

clear_screen: 
    @clear 

extend_cflags: 
    $(eval CFLAGS += $(DEBUG_MODE)) 

tests: | remove extend_cflags $(BINDIR)/$(TARGET) clear_screen 
    @$(BINDIR)/$(TARGET) 
관련 문제