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
的值是这些变量的全局值(如果没有设置,则可能是空字符串),而不是特定于目标的值