2014-04-25 1 views
0

Je ne peux pas comprendre pourquoi dans ce qui suit les deux versions différentes donnent des résultats différents:Incohérence ifeq et ifneq

$(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 

Sortie:

[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 

Si je change la ligne ifeq ($(TRGT_PATH),$(findstring $(TRGT_PATH),$(INCLUDEDS))) à la ifneq (,$(findstring $(TRGT_PATH),$(INCLUDEDS))) la sortie est:

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 

Pour autant que je sais $(findstring t,l) retourne e t si t est dans l et sinon une chaîne vide. Mais la sortie (si VAR est égal à LIST) est encore:

foo 
bar 

Quelqu'un peut-il expliquer?

PS: Je l'ai testé un code plus simple et qui a bien fonctionné ...

Répondre

1

Si vous fourni un exemple complet, y compris les valeurs de VAR et LIST, nous serions en mesure d'aider. Comme il est, tout ce que je peux dire est « ça marche pour moi », donc vous ne devez pas indiquer correctement votre environnement dans votre question:

$ cat Makefile 
VAR = v 
LIST = v 
all: 
ifneq (,$(findstring $(VAR),$(LIST))) 
     @echo foo 
else 
     @echo bar 
endif 

$ make 
foo 

ETA:

Aha. Eh bien, votre problème n'a absolument rien à voir avec findstring, il n'est donc pas surprenant que votre question initiale ne soit pas responsable. Le problème est que vous essayez d'utiliser des variables spécifiques à la cible dans un contexte sans recette, et the documentation indique clairement qu'elles ne sont pas disponibles en dehors des recettes. Les instructions ifeq, etc. sont comme des instructions de préprocesseur: elles sont évaluées au fur et à mesure de l'analyse du makefile, pas plus tard lorsque les recettes sont appelées. Donc les valeurs de TRGT_PATH et INCLUDEDS lorsque le ifeq/ifneq est invoqué sont les valeurs globales de ces variables (qui peuvent être la chaîne vide si elles ne sont pas définies autrement) et non les valeurs spécifiques à la cible.

+0

J'ai mis à jour la question :) J'espère que ça aide – WorldSEnder