我尝试在执行另一个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)
非常感谢你!
答案 0 :(得分:2)
您要做的事情无法奏效。来自documentation:
条件控制makefile中实际“看到”的内容,因此不能用于在执行时控制配方。
我说的方式是在读取Makefile时评估条件。所以make
读取你的Makefile,你的条件是假的,它被移除。