Partage
  • Partager sur Facebook
  • Partager sur Twitter

MAKEFILE : copie multiple avec changement de nom

copie automatisee d'une liste de fichiers en changeant leur nom

Sujet résolu
    30 janvier 2015 à 13:39:47

    Bonjour,

    Ma question est simple :

    Dans un Makefile, dans la partie "commande" (recipe) d'une regle "all", j'aimerais copier plusieurs fichiers au meme endroit, en changeant leur nom donc.

    Concretement, mes fichiers sont de ce type : ABC.mc, DEF.mc, ... et je veux les copier sous les noms de ABC_temp.c, DEF_temp.c, ...

    En ligne de commande (sans passer par un Makefile), le code suivant fonctionne :

    for file in *.mc; do cp "$file" "${file/.mc/_temp.c}";done

    ...Mais pas dans le Makefile, ou la meme ligne me donne la sortie suivante : 

    all:
    	for file in *.mc; do cp "$file" "${file/.mc/_temp.c}";done
    
    --> Output :
    for file in *.mc; do cp "ile" "";done
    cp: cannot stat ‘ile’: No such file or directory
    cp: cannot stat ‘ile’: No such file or directory
    make: *** [all] Error 1
    

    J'ai donc rajoute des '$' (et enleve les guillemets car avec ou sans j'ai le meme resultat) :

    all:
    	for file in *.mc; do cp $$file $${file/.mc/_temp.c};done
    
    --> Output : for file in *.mc; do cp $file ${file/.mc/_temp.c};done /bin/sh: 1: Bad substitution make: *** [all] Error 2 all: for file in *.mc; do cp $$file $${$$file/.mc/_temp.c};done --> Output : for file in *.mc; do cp $file ${$file/.mc/_temp.c};done /bin/sh: 1: Bad substitution make: *** [all] Error 2


    J'ai egalement essaye avec patsubst :

    all:
    	for file in *.mc; do cp $$file $(patsubst %.mc, %_temp.c, $$file);done
    
    --> Output :
    for file in *.mc; do cp $file $file;done
    cp: ‘file.mc’ and ‘file.mc’ are the same file
    cp: ‘main.mc’ and ‘main.mc’ are the same file
    make: *** [all] Error 1 

    ou une substitution equivalente a patsubst :

    all:
    	for file in *.mc; do $$file $($$file:.mc=_temp.c);done
    
    --> Output :
    for file in *.mc; do $file ;done
    /bin/sh: 1: file.mc: not found
    /bin/sh: 1: main.mc: not found
    make: *** [all] Error 127
    

    J'ai enleve/rajoute plusieurs fois des '$', des parentheses, avec/sans les guillemets, etc, j'ai toujours une erreur... si qqun a une solution,

    ...et par la meme occasion peut m'expliquer pourquoi mes codes ne marchent pas, je suis assez confus avec l'utilisation des '$' combinee avec des commandes shells (ici cp) (ou des boucles : il y a-t-il des regles speciales pour les boucles dans les Makefiles ?), malgre la doc bien faite de GNU..

    Merci d'avance !!!!!!!!!!!!!!!!!!!!!!!!!! :)







    -
    Edité par pikron 30 janvier 2015 à 13:45:21

    • Partager sur Facebook
    • Partager sur Twitter
      30 janvier 2015 à 14:19:51

      Qu'est ce que cette ligne te donne ?

      all:
              for file in *.mc; do cp "$$file" "$${file/.mc/_temp.c}";done



      • Partager sur Facebook
      • Partager sur Twitter
        30 janvier 2015 à 14:57:29

        for file in *.mc; do cp "$file" "${file/.mc/_temp.c}";done
        /bin/sh: 1: Bad substitution
        make: *** [all] Error 2
        • Partager sur Facebook
        • Partager sur Twitter
          30 janvier 2015 à 15:41:07

          Sur quelle distrib es-tu ?

          Essaye de mettre ca dans ton Makefile : 

          SHELL:=/bin/bash
          
          all:
                  for file in *.mc; do cp "$$file" "$${file/.mc/_temp.c}";done



          -
          Edité par Zeenaseek 30 janvier 2015 à 15:44:41

          • Partager sur Facebook
          • Partager sur Twitter
            30 janvier 2015 à 16:10:57

            cat /etc/lsb-release 
            DISTRIB_ID=Ubuntu
            DISTRIB_RELEASE=14.04
            DISTRIB_CODENAME=trusty
            DISTRIB_DESCRIPTION="Ubuntu 14.04.1 LTS"
            
            cat /etc/shells 
            # /etc/shells: valid login shells
            /bin/sh
            /bin/dash
            /bin/bash
            /bin/rbash
            
            echo $SHELL
            /bin/bash
            

            Le shell de mon environnement est donc bien /bin/bash, mais quand je mets SHELL:=/bin/bash dans mon Makefile, CA MARCHE !!!! Merci beaucoup !!! :)

            Cependant j'ai encore une question du coup. Ce Makefile est destiné a etre utilisé par d'autres, donc potentiellement sur d'autres distributions utilisant d'autres shells, est-ce que cette ligne que tu m'as aidé a rajouter peut nuire à la portabilité du programme ?

            Et pour ma culture, pourquoi le rajout de cette ligne à fait fonctionner le code alors que le shell de mon environnement était déjà celui écrit dans le Makefile ?

            Encore merci pour ton aide !

            • Partager sur Facebook
            • Partager sur Twitter
              30 janvier 2015 à 16:20:01

              Non normalement pas de problèmes de portabilité

              Par défaut un make va utiliser /bin/sh.

              Doc :

              5.3.1Choosing the Shell------------------------The program used as the shell is taken from the variable `SHELL'. If this variable is not set in your makefile, the program `/bin/sh' is used as the shell.
              • Partager sur Facebook
              • Partager sur Twitter

              MAKEFILE : copie multiple avec changement de nom

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown