IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

GNU make : ne pas répéter l'exécution d'une commande en cas de cibles multiples


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2016
    Messages : 18
    Par défaut GNU make : ne pas répéter l'exécution d'une commande en cas de cibles multiples
    Bonjour à tous

    je suis clairement débutant et ai une utilisation assez simple de GNU make, qui me permet pour autant de réaliser ce dont j'ai besoin.
    J'utilise la comande GNU make pour rendre facile et reproductible l'execution de plusieurs programmes d'analyse statistique (des "do-files" du logiciel Stata.

    Ainsi, il arrive assez fréquemment qu'un même do-file génère plusieurs résultats : tables, figures...
    Dans le makefile, je code ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    cible1 cible2 cible3: do-file $(database)
              stata-se do do-file
    Mon problème est le suivant:avec ce code, l'execution du do-file est répété autant de fois qu'il y a de cibles. Or, un execution suffirait pour mettre à jour les 3 cibles...

    Cela doit être simpliste mais je n'ai pas trouvé la solution, désolé
    Merci de votre aide

  2. #2
    Membre éprouvé Avatar de RaphaelG
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2016
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Juin 2016
    Messages : 94
    Par défaut
    Tu n'as pas l'air de te servir du nom des fichiers du champ target. (cible1 cible2 cible3: )
    Ne pourrais tu pas mettre une simple étiquette qui ne fait pas référence à un fichier existant ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    cibles1_2_3: do-file $(database)
              stata-se do do-file

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2016
    Messages : 12
    Par défaut
    Je suis un peu étonné par le makefile que tu nous soumets dans ton message #1
    le "do-file" apparaît à la fois dans les dépendances et dans les commandes.

    Ce "do-file" est-il un fichier modifié par ton makefile? Ou bien est-ce un programme/script qui agit sur d'autres fichiers (les "$(database)", et les cible1 cible2 cible3) ?
    Dans le premier cas, ce serait plus compliqué: il faudrait que tu nous expliques ce que tu veux faire.
    Dans le deuxième cas, cela correspondrait mieux à l'usage habituel des makefiles.


    Pour étudier ton problème, je te propose le makefile suivant (en fait c'est comme s'il y avait 2 makefiles);
    la règle 1 correspond à ce que j'ai compris de ton makefile
    les règles 2 et 3 correspondent à ce que je propose comme solution: passer par une cible intermediaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    cible1 cible2 cible3:
    	@echo commande 1 "DO-FILE" pour cible $@ a cause de dependances: $<
    	@sleep 1
    	touch  $@
     
    solution1 solution2 solution3: intermediaire
    	@echo commande 2 "       " pour cible $@ a cause de dependances: $<
    	@sleep 1
    	touch  $@
     
    intermediaire:
    	@echo commande 3 "DO-FILE" pour cible $@ a cause de dependances: $<
    	@sleep 1
    	touch  $@
    note sur ce makefile: afin d'être explicite, j'ai utilisé pour les commandes:
    "sleep" pour simuler que la commande dure un certain temps
    "touch" pour dater les "fichiers-cible" de makefile

    le script suivant effectue le scénario de démonstration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
    # nettoyage du repertoire courant pour que la demo soit claire et repetable
    rm -f cible* solution* interm*
    echo ========= test de make sans cible intermediaire
    make cible1 cible2 cible3
    echo "         on a donc appele trois fois do-file"
    echo ========= tester make avec une cible intermediaire
    make solution1 solution2 solution3
    echo "         on n'a appele do-file qu'une seule fois"
    et cela donne le résultat suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    ========= test de make sans cible intermediaire
    commande 1 DO-FILE pour cible cible1 a cause de dependances:
    touch  cible1
    commande 1 DO-FILE pour cible cible2 a cause de dependances:
    touch  cible2
    commande 1 DO-FILE pour cible cible3 a cause de dependances:
    touch  cible3
             on a donc appele trois fois do-file
    ========= tester make avec une cible intermediaire
    commande 3 DO-FILE pour cible intermediaire a cause de dependances:
    touch  intermediaire
    commande 2         pour cible solution1 a cause de dependances: intermediaire
    touch  solution1
    commande 2         pour cible solution2 a cause de dependances: intermediaire
    touch  solution2
    commande 2         pour cible solution3 a cause de dependances: intermediaire
    touch  solution3
             on n'a appele do-file qu'une seule fois

  4. #4
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2016
    Messages : 18
    Par défaut
    Citation Envoyé par eliot_net Voir le message

    Ce "do-file" est-il un fichier modifié par ton makefile? Ou bien est-ce un programme/script qui agit sur d'autres fichiers (les "$(database)", et les cible1 cible2 cible3) ?
    Dans le premier cas, ce serait plus compliqué: il faudrait que tu nous expliques ce que tu veux faire.
    Dans le deuxième cas, cela correspondrait mieux à l'usage habituel des makefiles.
    C'est effectivement la deuxième option. Le do-file est un script Stata qui utilise $(database) pour produire les cibles.
    Merci beaucoup de votre aide


Discussions similaires

  1. [XL-2003] Faire du pas à pas dans l'exécution d'une boucle
    Par alainr13 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 23/03/2013, 00h06
  2. Exécution d'une commande dans un Trigger
    Par Perr1 dans le forum Oracle
    Réponses: 6
    Dernier message: 08/04/2006, 00h14
  3. [VB]Problème d'exécution d'une commande dos...
    Par Empty_body dans le forum VB 6 et antérieur
    Réponses: 21
    Dernier message: 17/02/2006, 12h28
  4. Réponses: 6
    Dernier message: 09/11/2005, 17h29
  5. [Système] Pb exécution d'une commande externe
    Par licorne dans le forum Langage
    Réponses: 9
    Dernier message: 19/10/2005, 16h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo