If statement 不一致的ifeq和ifneq
我不明白为什么以下两种不同的版本会产生不同的结果:If statement 不一致的ifeq和ifneq,if-statement,makefile,If Statement,Makefile,我不明白为什么以下两种不同的版本会产生不同的结果: $(INCLUDE_DIR)/%: TRGT_PATH = \ $(INCLUDE_DIR)/$(patsubst $(word 1,$(subst /, ,$(dir $*)))/%,%,$*) $(INCLUDE_DIR)/%: INCLUDEDS = $(TRGT_PATH) $(INCLUDED_FILES) : $(INCLUDE_DIR)/%: % ifeq ($(TRGT_PATH),$(findstring $(TRGT
$(INCLUDE_DIR)/%: TRGT_PATH = \
$(INCLUDE_DIR)/$(patsubst $(word 1,$(subst /, ,$(dir $*)))/%,%,$*)
$(INCLUDE_DIR)/%: INCLUDEDS = $(TRGT_PATH)
$(INCLUDED_FILES) : $(INCLUDE_DIR)/%: %
ifeq ($(TRGT_PATH),$(findstring $(TRGT_PATH),$(INCLUDEDS)))
@echo [INC][WARN] File $(TRGT_PATH) already exists while copying from $*
else
@echo $(findstring $(TRGT_PATH),$(INCLUDEDS))
@echo [INC] $* $(TRGT_PATH)
@cp $* $(TRGT_PATH)
endif
输出:
[INC][WARN] File include/GeometricObject.h already exists while copying from engine/GeometricObject.h
[INC][WARN] File include/util.h already exists while copying from engine/util.h
[INC][WARN] File include/util.h already exists while copying from test/util.h
如果我将行ifeq($(TRGT\u路径),$(findstring$(TRGT\u路径),$(INCLUDEDS))
更改为ifneq(,$(findstring$(TRGT\u路径),$(INCLUDEDS))
输出为:
include/GeometricObject.h
[INC] engine/GeometricObject.h include/GeometricObject.h
include/util.h
[INC] engine/util.h include/util.h
include/util.h
[INC] test/util.h include/util.h
据我所知,$(findstring t,l)
如果t
在l
中,则返回t
,否则返回空字符串。但是输出(如果VAR
等于LIST
)仍然是:
foo
bar
有人能解释一下吗
PS:我测试了一个更简单的代码,效果很好…如果您提供了一个完整的示例,包括
VAR
和LIST
的值,我们将能够提供帮助。事实上,我只能说“它对我有用”,所以你不能在你的问题中准确地报告你的环境:
$ cat Makefile
VAR = v
LIST = v
all:
ifneq (,$(findstring $(VAR),$(LIST)))
@echo foo
else
@echo bar
endif
$ make
foo
预计到达时间:
啊哈。嗯,您的问题与findstring
完全无关,因此您最初的问题无法回答也就不足为奇了
问题在于,您试图在非配方上下文中使用特定于目标的变量,并明确指出它们在配方之外不可用
ifeq
等语句类似于预处理器语句:它们在解析makefile时进行计算,而不是在调用配方时进行计算。因此,调用ifeq
/ifneq
时,TRGT_PATH
和INCLUDEDS
的值是这些变量的全局值(如果没有设置,则可能是空字符串),而不是特定于目标的值