2017-08-10 9 views
0

Je suis en train de générer la liste des fichiers objets à partir de fichiers source dans mon makefile en utilisant patsubstComment utiliser patsubst dans makefile pour faire plusieurs substitutions

OUT_DIR=Out/ 

SRC=../../../Client2.4/Client/src/BrokerModule/BrokerApp.cpp  
    ../../../Client2.4/Client/src/CommandMsgManager/CConfigModuleInfo.cpp 

OBJ:= $(patsubst %src/%.cpp,${OUT_DIR}$%.o,$(SRC)) 

Je veux ma variable OBJ être

OBJ=Out/BrokerModule/BrokerApp.o Out/CommandMsgManager/CConfigModuleInfo.o 

après patsubst mais au-dessus patsubst ne produit pas le résultat souhaité. S'il vous plaît aider.

Répondre

1

Il y a quelques problèmes avec l'utilisation de patsubst, voir ma suggestion comme suit,

OUT_DIR=Out/ 

SRC=../../../Client2.4/Client/src/BrokerModule/BrokerApp.cpp \ 
../../../Client2.4/Client/src/CommandMsgManager/CConfigModuleInfo.cpp 

# add the definition of src 
src=../../../Client2.4/Client/src/ 

# Modify the definition of OBJ 
OBJ:= $(patsubst ${src}%.cpp,${OUT_DIR}%.o,$(SRC)) 

le Prepended Air filtré ${src} et joint en annexe .cpp, et ne garder que BrokerModule/BrokerApp.cpp & CommandMsgManager/CConfigModuleInfo.cpp.

Et % est remplacé par le texte correspondant au % à l'étape précédente.

+0

Alors vous avez probablement ne pas utiliser exactement ce que propose CWLiu. Vérifiez à nouveau votre syntaxe et les définitions de 'src',' OUT_DIR' et 'SRC'. –

+0

Cela fonctionne déjà ici, ne devrait pas poser de problème avec ma réponse. – CWLiu

+0

Désolé, ça marche. J'ai fait une erreur. Merci CWLiu. –

0

Patsubst ne peut gérer que des motifs avec un caractère générique, malheureusement. De plus, vous essayez de séparer les noms de chemin d'accès de manière inhabituelle au niveau du fichier. Cela signifie que tant que vous ne connaissez ni le préfixe ni les parties postfixes du /src/ dans vos chaînes, vous n'avez pas de chance car vous ne pouvez jamais dire 'remplacer le préfixe inconnu et conserver le postfixe inconnu' (ou l'inverse). La solution habituelle est de « connaître » le préfixe:

OUT_DIR=Out/ 

SRC_PATH := ../../../Client2.4/Client/src 

SRC=../../../Client2.4/Client/src/BrokerModule/BrokerApp.cpp  \ 
    ../../../Client2.4/Client/src/CommandMsgManager/CConfigModuleInfo.cpp 

OBJ:= $(patsubst $(SRC_PATH)/%,${OUT_DIR}%,$(SRC)) 

$(info $(OBJ)) 

Une autre solution consiste à utiliser par exemple la bibliothèque GNUmake table toolkit des fonctions make (encore bêta, mais votre problème peut être résolu):

include gmtt.mk 

OUT_DIR=Out 

SRC=../../../Client2.4/Client/src/BrokerModule/BrokerApp.cpp  \ 
    ../../../Client5.6/Client/src/CommandMsgManager/CConfigModuleInfo.cpp 

strip-till-last-src = src/$(call implode,$(call down-to,src/,$(call explode,/,$1))) 

OBJ:= $(foreach a-path,$(SRC),$(OUT_DIR)/$(call strip-till-last-src,$(a-path))) 

$(info $(OBJ))