GNU make ifeq 比较不起作用

Hei*_*ami 4 c++ gnu makefile conditional-statements

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

我有这个:

$(LIBS):            
ifeq ($@,libname)
        my command here
endif
        $(MAKE) -C ./lib/$@
Run Code Online (Sandbox Code Playgroud)

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

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

info 显示该变量现在完全等于 libname,但 ifeq 未执行。当我输入类似的内容时,ifeq (libname,libname)该语句有效,但变量和文本之间的比较不会计算为 true,即使两者相等并且它应该有效。GNU make 版本是 4.1

我在这里缺少什么?

完整的生成文件:

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)
Run Code Online (Sandbox Code Playgroud)

非常感谢!

Lou*_*uis 10

你试图做的事情是行不通的。从文档中:

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

我的说法是,条件语句在读取 Makefile 时进行评估。所以make读取你的 Makefile,你的条件是假的,它被删除了。