2008-10-30 7 views
13

J'ai un modèle makefile pour compiler une seule DLL (pour un système de plugin). Le makefile de l'utilisateur ressemble à ceci:Comment vérifier si un fichier existe dans un fichier makefile

EXTRA_SRCS=file1 file2 
include makefile.in 

Dans le makefile.in je:

plugin.dll: plugin.os $(patsubst %,%.os,$(EXTRA_SRCS)) 

plugin.os est le principal fichier C++ à compiler. BTW, les fichiers se terminant est .os sont les fichiers objets compilés pour la bibliothèque partagée (à savoir en utilisant l'option -fpic avec gcc)

Maintenant, le problème est que les sources supplémentaires seront probablement (mais pas nécessairement) être les fichiers d'en-tête. Idéalement, je voudrais les ajouter en tant que dépendances pour la cible plugin.os et file.cpp, mais seulement si elles existent.

La méthode devrait fonctionner pour Windows et Linux, ou au moins être adaptable à chacun. Cependant, je n'utilise que la version GNU de make.

Répondre

18

Utilisez la fonction "générique":

$(wildcard *.h) 

EDIT: afin de faire correspondre une liste spécifique, faire

$(wildcard $(HEADER_FILES)) 

Il n'y a pas besoin d'utiliser $ (filtre ...), la fonction générique filtre automatiquement les fichiers qui n'existent pas.

+0

ce n'est pas ce que je veux ... J'ai une liste spécifique de fichier .h à tester pour ... – PierreBdR

+0

C'est ok, vous n'avez pas besoin d'utiliser des caractères génériques. Utilisez $ (joker $ (HEADER_FILES)) – JesperE

4

Vous n'avez pas spécifié le ou les compilateurs que vous utilisez, mais si vous avez accès à gcc/g ++, vous pouvez utiliser l'option -MM.

Ce que je fais est de créer un fichier avec l'extension de .d pour chaque fichier .c ou .cpp, puis "inclure" les fichiers .d. J'utilise quelque chose comme ça dans mon Makefile:

%.d: %.c 
     gcc $(INCS) $(CFLAGS) -MM $< -MF [email protected] 

%.d: %.cpp 
     g++ $(INCS) $(CXXFLAGS) -MM $< -MF [email protected] 

Je crée alors les dépendances comme ceci:

C_DEPS=$(C_SRCS:.c=.d) 
CPP_DEPS=$(CPP_SRCS:.cpp=.d) 
DEPS=$(C_DEPS) $(CPP_DEPS) 

et cela au fond du Makefile:

include $(DEPS) 

Est-ce la type de comportement que vous allez pour? La beauté de cette méthode est que même si vous utilisez un compilateur non-GNU pour la compilation proprement dite, les compilateurs GNU font un bon travail de calcul des dépendances.

+0

Je préfère éviter la génération de makeflie ... mais merci! – PierreBdR

2

Est-ce simple

$(filter $(wildcard *.h),$(HEADER_FILES)) 

faire ce que vous voulez?

+0

mmhh .. Je ne savais pas à propos de cette commande de filtre! que fait-il? – PierreBdR

+0

Lire la documentation de Make (pages info, pas de page de manuel): $ (filter PATTERNS, TEXT) est les mots dans TEXT qui correspondent à au moins un des PATTERNS. (PATTERN étant make filepatterns, pas regexes, donc un nom de fichier doit correspondre exactement.) – ephemient

Questions connexes