Question

J'ai un modèle de makefile pour compiler une seule DLL (pour un système de plugin). Le makefile de l'utilisateur ressemble à ceci:

EXTRA_SRCS=file1 file2
include makefile.in

Dans le makefile.in j'ai:

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

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

Le problème est que les sources supplémentaires seront probablement (mais pas nécessairement) des fichiers d’en-tête. Idéalement, j'aimerais les ajouter en tant que dépendances pour la cible file.cpp et le <=>, mais uniquement si elles existent.

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

Était-ce utile?

La solution

Utilisez le "ient générique " fonction:

$(wildcard *.h)

EDIT: pour faire correspondre une liste spécifique, faites

$(wildcard $(HEADER_FILES))

Il n’est pas nécessaire d’utiliser $ (filtre ...), la fonction générique filtre automatiquement les fichiers qui n'existent pas.

Autres conseils

Vous n'avez pas spécifié le (s) compilateur (s) 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 .d pour chaque fichier .c ou .cpp, puis & "include &"; les fichiers .d. J'utilise quelque chose comme ça dans mon Makefile:

%.d: %.c
        gcc $(INCS) $(CFLAGS) -MM $< -MF $@

%.d: %.cpp
        g++ $(INCS) $(CXXFLAGS) -MM $< -MF $@

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

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

et ceci au bas du Makefile:

include $(DEPS)

Est-ce le genre de comportement que vous allez adopter? La beauté de cette méthode est que même si vous utilisez un compilateur non-GNU pour la compilation réelle, les compilateurs GNU calculent bien les dépendances.

Est-ce que le simple

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

faites ce que vous voulez?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top