GNU使ifeq比较不起作用

时间:2014-12-03 09:51:47

标签: c++ makefile conditional gnu

我尝试在执行另一个makefile之前,根据目标列表中的当前目标(当前只有该列表中的一个条目)执行命令。

我有这个:

$(LIBS):            
ifeq ($@,libname)
        my command here
endif
        $(MAKE) -C ./lib/$@

问题是,即使目标名称正确,ifeq也不会执行。使用$(info $@)显示libname,但表达式不会被评估为true。 我想也许在条件中扩展自动变量有问题,所以我尝试使用这样的eval

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

info显示该变量现在完全等于libname,但ifeq不会被执行。 当我输入类似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 $@ $(OBJ)

-include $(DEPFILE)

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

libs: $(LIBS)

$(LIBS):
        $(eval CURRENT_LIB := $@)
ifeq ($(CURRENT_LIB),libname)
        ./lib/$(CURRENT_LIB)/configure
endif
        $(MAKE) -C ./lib/$@

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


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

非常感谢你!

1 个答案:

答案 0 :(得分:2)

您要做的事情无法奏效。来自documentation

  

条件控制makefile中实际“看到”的内容,因此不能用于在执行时控制配方。

我说的方式是在读取Makefile时评估条件。所以make读取你的Makefile,你的条件是假的,它被移除。