我想在执行另一个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