我想在執行另一個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)
非常感謝你!
你爲什麼不給'libname'增加一個顯式規則? – user657267 2014-12-03 10:02:04
是的,那當然會起作用,我甚至都沒有想過,謝謝!弄清楚爲什麼這不起作用仍然很有趣。 – HeidiSalami 2014-12-03 10:05:57