2014-12-03 4 views
0

다른 makefile이 실행되기 전에 대상 목록 (현재 해당 목록의 항목 하나)에서 현재 대상에 따라 명령을 실행하려고합니다.GNU make ifeq 비교가 작동하지 않습니다.

내가 이것을 가지고 다음 ifeq 대상 이름이 올바른지 경우에도 실행되지 않습니다

$(LIBS):    
ifeq ([email protected],libname) 
     my command here 
endif 
     $(MAKE) -C ./lib/[email protected] 

문제가. $(info [email protected])을 사용하면 정확히 libname이 표시되지만 표현식은 true로 평가되지 않습니다. 나는 조건에서 자동 변수의 확장에 문제가 그래서 난이 같은 eval를 사용하여 시도가 어쩌면 생각했다

$(LIBS): 
     $(eval CURRENT_LIB := [email protected]) 
ifeq ($(CURRENT_LIB),libname) 
     my command here 
endif 
     $(MAKE) -C ./lib/[email protected] 

정보는 변수가 지금 정확히 libname에 해당된다는 표시하지만는 ifeq은 excuted되지 않습니다 . ifeq (libname,libname)과 같이 입력하면 구문이 작동하지만 변수와 텍스트의 비교는 두 변수가 동일하고 작동해야한다고 판단하지 않습니다. GNU make 버전은 4.1입니다.

무엇이 여기에 있습니까?

완벽한 메이크 :

CC := g++ 
CFLAGS := -v -std=c++0x -pthread -Wall -g -O3 

OBJ := mycode.o 
OBJ += moreobjects.o 
#more objects in here 

LIBS = libname 

.PHONY: libs $(LIBS) 

SRC = $(OBJ:%.o=%.cpp) 
DEPFILE := .depend 

mytarget: libs $(OBJ) 
     $(CC) $(CFLAGS) -o [email protected] $(OBJ) 

-include $(DEPFILE) 

%.o: %.cpp 
     $(CC) $(CFLAGS) -c $< 
     $(CC) -MM -std=c++11 $(SRC) > $(DEPFILE) 

libs: $(LIBS) 

$(LIBS): 
     $(eval CURRENT_LIB := [email protected]) 
ifeq ($(CURRENT_LIB),libname) 
     ./lib/$(CURRENT_LIB)/configure 
endif 
     $(MAKE) -C ./lib/[email protected] 

.PHONY: clean_all 
clean_all: clean 
     $(foreach dir,$(LIBS),$(MAKE) clean -C ./lib/$(dir)) 


.PHONY: clean 
clean: 
     rm -rf mytarget $(OBJ) $(DEPFILE) 

대단히 감사합니다!

+1

왜'libname'에 대한 명시적인 규칙을 추가하지 않으시겠습니까? – user657267

+0

그래, 그게 당연히 일할거야, 난 그 생각조차하지 않았다, 고마워! 이것이 왜 작동하지 않는지 파악하는 것은 여전히 ​​흥미로울 것입니다. – HeidiSalami

답변

1

당신이하려는 것은 작동하지 않습니다. documentation에서 :

조건문은 메이크 실제로 "인식" '확인'을 제어, 그래서 그들은 는 실행시 조리법을 제어하는 ​​데 사용할 수 없습니다 수 있습니다.

내가 입력 한 방법은 조건부가 Makefile을 읽을 때 평가된다는 것입니다. 그래서 make은 당신의 Makefile을 읽습니다. 조건은 거짓이고 그것은 제거됩니다.

+1

네, 완벽한 말이됩니다! 고맙습니다! – HeidiSalami