J'ai besoin de générer un répertoire dans mon makefile et je voudrais ne pas obtenir le "répertoire existe déjà une erreur" encore et encore, même si je peux facilement l'ignorer.
J'utilise principalement mingw / msys mais j'aimerais aussi quelque chose qui fonctionne avec d'autres shells / systèmes.
J'ai essayé ça mais ça n'a pas fonctionné, des idées?
ifeq (,$(findstring $(OBJDIR),$(wildcard $(OBJDIR) )))
-mkdir $(OBJDIR)
endif
-p
ne fonctionne pas sous Windows, ce qui est vraisemblablement l'objet de la question. Je ne sais pas comment cela a été accepté.make -p
qu'Unix ou Linux?En regardant la documentation officielle de make , voici une bonne façon de le faire:
Vous devriez voir ici l'utilisation du | opérateur de canalisation, définissant un prérequis d'ordre uniquement. Cela signifie que la
$(OBJDIR)
cible doit être existante (au lieu d'être plus récente ) afin de construire la cible actuelle.Notez que j'ai utilisé
mkdir -p
. Le-p
drapeau a été ajouté par rapport à l'exemple de la documentation. Voir d'autres réponses pour une autre alternative.la source
$(OBJDIR)
objectif doit être existant » . Vérifiez la présence de fichiers (et les horodatages) pour décider s'il a besoin de construire la cible. Par conséquent ici, si$(OBJDIR)
est absent il va construire, de sorte qu'il est existant afin de construire la cible actuelle$(OBJS)
, qui sera créé à l' intérieur.Vous pouvez utiliser la commande de test:
la source
make -j
) en raison d'une condition de concurrence entre le moment où le répertoire est testé pour l'existence et sa création. Un travail peut tester qu'il n'est pas là, mais avant de le créer, un autre travail crée le répertoire. Ensuite, lorsque le premier essaie de le faire, il échouera car le répertoire existe déjà. La meilleure solution dans ce cas est de n'utiliser que les prérequis de commande comme mentionné dans la réponse de @ TeKa (qui devrait être la réponse acceptée).Voici une astuce que j'utilise avec GNU make pour créer des répertoires de sortie de compilateur. Définissez d'abord cette règle:
Ensuite, rendez tous les fichiers qui vont dans le répertoire dépendant du fichier .d dans ce répertoire:
Notez l'utilisation de $ <au lieu de $ ^.
Enfin, empêchez les fichiers .d d'être supprimés automatiquement:
Ignorer le fichier .d, et dépendre directement du répertoire, ne fonctionnera pas, car l'heure de modification du répertoire est mise à jour chaque fois qu'un fichier est écrit dans ce répertoire, ce qui forcerait la reconstruction à chaque appel de make.
la source
Si le fait que le répertoire existe déjà n'est pas un problème pour vous, vous pouvez simplement rediriger stderr pour cette commande, en supprimant le message d'erreur:
la source
Dans votre makefile:
la source
Sous Windows
Sur Unix | Linux
la source
/bin/sh: 1: Syntax error: end of file unexpected (expecting "then")
la source
Ce qui fonctionne également pour plusieurs répertoires, par exemple.
L'ajout
$(OBJDIR)
comme première cible fonctionne bien.la source
Cela fonctionne sous mingw32 / msys / cygwin / linux
la source
Si vous ignorez explicitement le code de retour et videz le flux d'erreur, votre make ignorera l'erreur si elle se produit:
Cela ne devrait pas causer de danger de course dans une marque parallèle - mais je ne l'ai pas testé pour être sûr.
la source
Un peu plus simple que la réponse de Lars:
et règle générique:
Aucun fichier tactile à nettoyer ou à créer .PRECIOUS :-)
Si vous voulez voir une autre petite astuce générique de gmake, ou si vous êtes intéressé par une création non récursive avec un échafaudage minimal, vous voudrez peut-être consulter Deux autres astuces gmake bon marché et les autres articles liés à la fabrication dans ce blog.
la source