12
votes

Supprimer la sortie d'erreur de règle

J'ai une règle qui crée un répertoire xxx

Cependant, une fois la première fois que le répertoire a été généré, je reçois cette sortie: xxx

existe une manière que je ne peux exécuter que la règle que si le répertoire n'existe pas, ou supprimez la sortie lorsque le répertoire existe déjà?


1 commentaires

6 Réponses :


9
votes

L'erreur est déjà ignorée par le meneur ' - code>' sur la ligne de commande. Si vous voulez vraiment perdre les messages d'erreur de mkdir code>, utilisez la redirection d'E / S: xxx pré>

Vous obtiendrez toujours l'avertissement "ignoré" à partir de . code>, cependant, il pourrait donc être préférable d'utiliser l'option pour mkdir code> qui ne l'échoue pas lorsque la cible existe déjà, qui est le -p code > Option: p>

MKDIR_P = mkdir -p

bin:
    ${MKDIR_P} $@


2 commentaires

Pourquoi un tel 2> & 1 redirection aident? Je comprendrais 2> / dev / null pour envoyer STDERR à Oblivion mais envoyez-le à stdout .....?


@humanityandpeace: vous avez raison - un Thinko de retour en 2010. Je l'ai réparé. Merci.



-1
votes

Votre règle ne doit pas être exécutée que si sa cible n'existe pas ou n'est pas obsolète en raison de ses dépendances. En d'autres termes, vous ne devriez jamais rencontrer cette erreur.

[Exemple ajouté] xxx

Votre dossier dépend de quelque chose? Votre dossier est-il une cible phony?


1 commentaires

Non. C'est toujours obsolète, ce que vous voyez dans l'op est ce que j'ai.



-1
votes

Eh bien, j'ai fini avec cette construction, peut-être que quelqu'un le trouvera utile ou peut commenter:

BINDIR = .
TMPDIR = tmp
OUTDIRS = $(BINDIR) $(TMPDIR)
$(OUTDIRS):
    @test -d $@ || mkdir $@


1 commentaires

FAIRE EST DO TEST Pour vous de toute façon, il finit donc à stagner le répertoire deux fois. Cela masque simplement le problème que la cible par défaut est. (DOT).



-1
votes

assume la première cible est la cible par défaut. Si tel est votre maquillage complet, il doit toujours essayer de refaire la cible par défaut, qui est la corbeille. Insérez les lignes suivantes en haut de votre maquillage:

all: bin
.PHONY: all


0 commentaires

8
votes

La manière traditionnelle de gérer la création d'annuaire consiste à utiliser un fichier de timbres dépendant de la direction et crée le dir comme un effet secondaire. Supprimer le fichier de timbre lorsque vous apportez distclean ou quelle que soit la cible "vraiment propre", c'est le suivant: xxx

La raison de ceci est la suivante: chaque fois qu'un fichier dans BIN est créé / supprimé, le MTIME du répertoire contenant est mis à jour. Si une cible dépend de bin , alors la prochaine fois faire exécute, il recueille ensuite des fichiers qu'il n'a pas besoin de.


2 commentaires

Le DIRP DEP est-il disponible sur tous les fichiers générés dans cet emplacement?


Chaque fichier créé dans ce répertoire devrait dépendre de manière directe ou indirectement, sur le fichier STAMPLILE pour s'assurer qu'il a été créé avant utilisation.



18
votes

Une autre façon de supprimer le faire: erreur ... (ignorée) la sortie est à ajouter || vrai à une commande qui pourrait échouer. Exemple avec Grep qui vérifie les erreurs dans un fichier journal de latex: xxx

sans le || vrai , se plaint lorsque Grep ne trouve pas toutes les correspondances.

Ceci fonctionne pour toutes les commandes, pas seulement MKDIR; C'est pourquoi j'ai ajouté cette réponse.


3 commentaires

Daniel, le caractère de préfixe - à une commande dans une règle de fabrication fait la même chose sans demander à la coquille de le gérer. Ceci est probablement plus rapide et moins susceptible de se retourner.


Les causes de préfixes - font la sortie de la sortie gênante "erreur ignorée", que ma solution ne le fait pas. Donc non, les deux ne font pas la même chose.


Cela ne fonctionne que comme ||: (tuyau-pipe-colon) sur ma construction Windows.