我正在尝试编译所有源文件,除了那些被排除的文件。
考虑到我既不能控制目标,也不能控制先决条件,所以我只能控制配方。
由于某种原因,if条件不能正常运行。
即使输出为true,也始终满足第一个条件,当源文件位于custom_c_excludes变量中的排除文件之中时,会发生第一个条件,因此正确的行为应该是ifep条件失败并且应执行else之前的块。
(条件输出:true =>不要编译)
(条件输出:false =>编译)
$(OBJDIR)/%.$(OBJEXT): %.c
ifeq (false,$(if $(findstring $<,$(custom_c_excludes)),true,false))
@echo 'This file is included and should be compiled.'
@echo 'Condition output : $(if $(findstring $<,$(custom_c_excludes)),true,false)'
else
@echo 'This file is not included and should not be compiled.'
@echo 'Condition output : $(if $(findstring $<,$(custom_c_excludes)),true,false)'
endif
预期输出为:
此文件已包含,应进行编译。
条件输出:false
或
此文件不包括在内,不应进行编译。
条件输出:true
实际输出是:
此文件已包含,应进行编译。
条件输出:true
答案 0 :(得分:0)
ifeq
是在解析Makefile时而不是在执行配方时进行评估的,因此您的配方将始终生成相同的内容。您可以使用make -p
进行验证:
# Implicit Rules
obj/%.o: %.c
# recipe to execute (from 'Makefile', line 11):
@echo 'This file is included and should not be compiled.'
@echo 'Condition output : $(if $(findstring $<,$(custom_c_excludes)),true,false)'
但是,如果您知道要对哪些文件进行不同的评估(例如此custom_c_excludes
变量),则可以执行static pattern rule,即:
$ cat Makefile
OBJDIR := obj
OBJEXT := o
custom_c_excludes := foo.c
$(OBJDIR)/%.$(OBJEXT): %.c
@echo 'This file is included and should be compiled.'
$(patsubst %.c,$(OBJDIR)/%.$(OBJEXT),$(custom_c_excludes)): $(OBJDIR)/%.$(OBJEXT): %.c
@echo 'This file is not included and should not be compiled.'
输出:
$ make obj/foo.o
This file is not included and should not be compiled.
$ make obj/bar.o
This file is included and should be compiled.