2014-12-03 49 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