我试图在执行另一个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 回答
你想做什么是行不通的 . 来自documentation:
我把它的方式是在读取Makefile时评估条件 . 所以
make
读取你的Makefile,你的条件是假的,它被删除 .