2014-12-03 81 views
0

我想在執行另一個makefile之前,根據當前目標從目標列表(當前只有該列表中的一個條目)執行命令。GNU make ifeq比較不起作用

我有這樣的:

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

的問題是,該ifeq沒有得到,即使目標名稱是否正確執行。使用$(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

我在這裏錯過了什麼?

完整的Makefile:

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 2014-12-03 10:02:04

+0

是的,那當然會起作用,我甚至都沒有想過,謝謝!弄清楚爲什麼這不起作用仍然很有趣。 – HeidiSalami 2014-12-03 10:05:57

回答

1

你正在嘗試做的事情是行不通的。從documentation

條件語句控制一下「做」實際上是「看見」在生成文件,所以他們不能用於在執行的時間來控制食譜。

我說的方式是在讀取Makefile時評估條件。所以make讀取你的Makefile,你的條件是錯誤的,它被刪除。

+1

是的,非常有意義!謝謝! – HeidiSalami 2014-12-03 11:04:41