首页 文章

GNU使ifeq比较不起作用

提问于
浏览
0

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

我有这个:

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

问题是,即使目标名称正确, ifeq 也不会执行 . 使用 $(info $@) 完全显示libname但表达式未计算为true . 我想也许在条件中扩展自动变量有问题,所以我尝试使用_1127126这样:

$(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 回答

  • 1

    你想做什么是行不通的 . 来自documentation

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

    我把它的方式是在读取Makefile时评估条件 . 所以 make 读取你的Makefile,你的条件是假的,它被删除 .

相关问题