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

Linux Discussion :

boucle dans le Makefile


Sujet :

Linux

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 49
    Points : 32
    Points
    32
    Par défaut boucle dans le Makefile
    Bonjour,
    je doit écrire un petit programme à l'intérieur d'un makefile je sous entend par pg une boucle écrit en langage C qui me permet de faire un certain traitement
    le pb est que la documentation que g consulté jusque la ne m'aide pas vraiment exemple :
    i=1;
    C1=inst1;
    C2=inst2;
    ........
    i++;
    excute:
    result1/res1.txt
    ect
    tout ça dans un makefile
    en résumé mon pg doit exécuté une boucle pour le choix d'un Ci tel que i=1,n
    la doc que g consulté (trop primitives) c4est juste des introductions qu ;qkefile

    g besoin de savoir comment on déclare les variables , écrire des conditions à l'intérieur d'un makefile
    Merci

  2. #2
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Points : 1 412
    Points
    1 412
    Par défaut
    Si tu ne fais pas l'effort d'écrire correctement, comment peux-tu espérer que quelqu'un fera l'effort de te répondre ?

    Par ailleurs, je n'ai rien compris.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 49
    Points : 32
    Points
    32
    Par défaut COMMANDE DANS UN FICHIER
    bonjour,
    désoléje vais essayer
    dans un fichier texte j'ai un ensemble d'entrées
    ./entrée1
    ./entrée2
    ./entréeN
    pour une ligne de commande
    c-a-d je veux éviter que à chaque fois de saisir de nouvelles valeurs pour ma commande donc je met tout dans un fichier :j'ai le schéma suivant


    ENTREE(FICHIER INPUT)------MON PROGRAMME-------SORTIE(DANS UN FICHIER OUT PUT)

    dONC JE NE SAIT PAS COMMENT MON PROGRAMME DOIT S EXCUTER EN BOUCLE POUR CHAQUE ENTREE ET M AFFICHER LE RESULTAT DANS UN FICHIER

    POUVEZ VOUS M AIDER

  4. #4
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 49
    Points : 32
    Points
    32
    Par défaut fichier commande
    Je travail sur un simulateur (contient un ensemble de fichier.c) , mon job consiste à ajouter d'autre fichiers à ce simulateur donc entre au autre je vais créer une version modifier de ce simulateur , pour lancer l'execution de mon simulateur je dois exécuter une commande qui prend une seule entrée à la fois? comment je fait pour lancer mon programme en boucle pour N entrées ? donc j'ai pensé à utiliser un fichier
    J'espère etre clair

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 739
    Points : 31 068
    Points
    31 068
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bengueddach Voir le message
    Je travail sur un simulateur (contient un ensemble de fichier.c) , mon job consiste à ajouter d'autre fichiers à ce simulateur donc entre au autre je vais créer une version modifier de ce simulateur , pour lancer l'execution de mon simulateur je dois exécuter une commande qui prend une seule entrée à la fois? comment je fait pour lancer mon programme en boucle pour N entrées ? donc j'ai pensé à utiliser un fichier
    J'espère etre clair
    Pas trop clair non.

    Commençons par le commencement. Tu veux écrire une boucle dans un Makefile, tu dois l'écrire en shell et pas autrement. Mais le Makefile étant un outil de compilation, cela signifie que ta boucle est là pour compiler un ensemble de fichiers.

    Maintenant ton dernier post semble un peu différent. T'as une commande qui traite un fichier et tu voudrais traiter un ensemble de fichiers ben tu crées un script shell qui traite cet ensemble de fichiers dans une boucle while et tu appelle ta commande dans la boucle...

  6. #6
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 49
    Points : 32
    Points
    32
    Par défaut exemple de mon Makefile
    bonjour,
    je préfère carrément donner un exemple du Makefile:

    SIMDIR= /home/asmaa/Desktop/simplesim.3.0
    RESDIR=/home/asmaa/Desktop/simplesim.3.0/resultat
    BENCHDIR= /home/asmaa/Desktop/simplesim.3.0/tests-pisa/bin.little
    i=1
    C1= dl1:128:64:2:l
    C2= dl1:32:32:2:l
    C3= dl1:64:64:2:l
    C4= dl1:128:32:2:l
    C5= dl1:32:32:1:l

    execute1:// c'est la boucle dont je parlé
    $(foreach configuration, $(C1) $(C2) $(C3) $(C4), \
    $(SIMDIR)/sim-cache -cache:dl1 $(configuration) -redir:sim
    $(RESDIR)/config_C$i.res $(BENCH) ; \
    i=$(i)+1; )

    la variable configuration prend à chaque fois une valeur C1, C2,....
    la ligne: $(SIMDIR)/sim-cache -cache:dl1 $(configuration) -redir:sim
    $(RESDIR)/config_C$i.res $(BENCH) ; \ est une commande
    config_Ci.res: fichier résultat
    i: le compteur de la boucle

    Donc , normalement je doit obtenir avec ce script 5 fichiers en sortie , alors que j'obtient à l'exécution qu'un seul fichier :config_C1
    donc c'est peut etre le compteur i qui s'incrémente pas dans mon programme
    Pouvez-vous m'aidez à trouver l'erreur?

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 739
    Points : 31 068
    Points
    31 068
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bengueddach Voir le message
    bonjour,
    je préfère carrément donner un exemple du Makefile:

    SIMDIR= /home/asmaa/Desktop/simplesim.3.0
    RESDIR=/home/asmaa/Desktop/simplesim.3.0/resultat
    BENCHDIR= /home/asmaa/Desktop/simplesim.3.0/tests-pisa/bin.little
    i=1
    C1= dl1:128:64:2:l
    C2= dl1:32:32:2:l
    C3= dl1:64:64:2:l
    C4= dl1:128:32:2:l
    C5= dl1:32:32:1:l

    execute1:// c'est la boucle dont je parlé
    $(foreach configuration, $(C1) $(C2) $(C3) $(C4), \
    $(SIMDIR)/sim-cache -cache:dl1 $(configuration) -redir:sim
    $(RESDIR)/config_C$i.res $(BENCH) ; \
    i=$(i)+1; )

    la variable configuration prend à chaque fois une valeur C1, C2,....
    la ligne: $(SIMDIR)/sim-cache -cache:dl1 $(configuration) -redir:sim
    $(RESDIR)/config_C$i.res $(BENCH) ; \ est une commande
    config_Ci.res: fichier résultat
    i: le compteur de la boucle

    Donc , normalement je doit obtenir avec ce script 5 fichiers en sortie , alors que j'obtient à l'exécution qu'un seul fichier :config_C1
    donc c'est peut etre le compteur i qui s'incrémente pas dans mon programme
    Pouvez-vous m'aidez à trouver l'erreur?
    Bon là le topic commence à partir en live alors je crois qu'il faut revenir sur certaines bases...

    Le Makefile n'est pas un outil de programmation, c'est un outil de description. On décrit comment créer un fichier y à partir d'un fichier x. Exemple si pour créer titi il faut copier toto, alors le Makefile ressemblera à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    toto titi:
        cp titi toto
    Et pour le mettre en action, il faut lancer la commande "make toto". titi est la source et toto est la cible. A ce moment là, si le fichier titi existe et qu'il est plus récent que toto, la commande citée dans la règle (cp) est exécutée.

    A partir de là, on peut travailler sur des extensions. Par exemple pour obtenir la cible ".y" à partir d'une source ".x" on peut écrire le truc suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    .SUFFIXES: .x .y
    .x.y:
        cp $< $@
    Il s'agit ici d'un Makefile générique. on ne connait pas les noms des fichiers donc on les représente par des variables ($< la source, $@ la cible, $* la source sans l'extension, etc.) mais le principe de la commande shell pour créer la cible à partir de la source reste le même. Bien évidemment la commande shell peut être plus complexe, style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    .SUFFIXES: .x .y
    .x.y:
        if test -f $<
        then
            cp $< $@
        fi
    Ici, la cible sera créée uniquement si la source est un fichier.

    Mais généralement on parle toujours d'une règle pour générer une cible à partir d'une source. Toi, il semble que tu veuilles générer "n" cibles. Là, le Makefile semble atteindre ses limites.
    On peut essayer de ruser, en indiquant au Makefile une seule cible finale mais où la commande pour la générer passerait par la création des fichiers qui t'intéressent exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    source cible:
        for i in 1 2 3 4 5 6 7 8 9
        do
            cp source$$i fichier_demande_$$i
        done
        touch cible
    Ici, les fichiers demandés sont créés dans la boucle et la création finale de la cible n'est là que pour "simuler" au programme "make" que la cible a bien été créée (bien qu'elle ne t'intéresse pas). D'ailleurs, au pire, on pourrait même ne jamais la créer et donc à chaque fois que tu taperais "make cible" le make referait la boucle sans jamais créer la cible.

    Voilà. En tout cas j'ai rien pigé à tes foreach. Déjà c'est pas du shell...

  8. #8
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 49
    Points : 32
    Points
    32
    Par défaut [résolu]
    bonjour,
    merci Sve@r pour ta réponse détaillée,
    voici la solution
    $(foreach i, 1 2 3 4, \
    $(SIMDIR)/sim-cache -cache:dl1 $(C$i) -redir:sim $(RESDIR)/config_C$i.res $(BENCH) ; \)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. une boucle dans le Makefile?
    Par moon93 dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 28/06/2006, 15h08
  2. Creer une boucle dans une requête ???
    Par fdloisel dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/10/2004, 15h05
  3. MAKEFILE : Comment récupérer l'OS dans le makefile
    Par nana1 dans le forum Systèmes de compilation
    Réponses: 12
    Dernier message: 14/09/2004, 17h23
  4. Faire un setenv dans un Makefile
    Par papayou42 dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 06/07/2004, 11h37
  5. Notion de boucles dans Business Object
    Par lionelEIGIP dans le forum Deski
    Réponses: 1
    Dernier message: 08/04/2004, 12h26

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