OVH Cloud OVH Cloud

Commande evaluée dans un Makefile

9 réponses
Avatar
NICOLAS MAUPU
Bonjour,

J'ai un petit souci dans un Makefile.
Je souhaite faire une commande pour faire une version
de mon projet sous forme de tar.
Voici ce que j'ai déjà fait:

tar: cleanall
tar cfj simu.`date +%d-%m-%y.%H-%M`.tar.bz2 *

He oui, c'est un projet de simulation ;)
Le problème avec ceci, c'est que lors de la décompression
de l'archive, tous les fichiers et répertoires du projets
sont extraits directement dans le répertoire courant.
J'aimerais donc compresser tout dans un répertoire avec une
commande du type:
tar cfj foo.tar.bz2 rep/

Pour avoir le répertoire courant, j'ai pensé faire:
pwd | sed s/^\\/.*\\///
Stocké dans une variable du Makefile ca donne:
REP = `pwd | sed s/^\\\\/.*\\\\///`

L'idée serait donc de faire:
cd ..
tar cfj simu.`date +%d-%m-%y.%H-%M`.tar.bz2 $(REP)
cd $(REP)

Mais le problème avec ça, c'est le 'cd ..' car le $(REP)
donne le repertoire précédent du projet (..) et non le
répertoire courant.


Merci.

9 réponses

Avatar
Jean-Marc Bourguet
NICOLAS MAUPU writes:

L'idée serait donc de faire:
cd ..
tar cfj simu.`date +%d-%m-%y.%H-%M`.tar.bz2 $(REP)
cd $(REP)


Les lignes des Makefile sont souvent (pas toujours...) interpretees
separement. Mettre des ; a la fin pour n'en faire qu'une grande
ligne logique.

A+

--
Jean-Marc
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Laurent Wacrenier
Jean-Marc Bourguet écrit:
L'idée serait donc de faire:
cd ..
tar cfj simu.`date +%d-%m-%y.%H-%M`.tar.bz2 $(REP)
cd $(REP)


Les lignes des Makefile sont souvent (pas toujours...) interpretees
separement. Mettre des ; a la fin pour n'en faire qu'une grande
ligne logique.


mettre des && plutôt quand on veut que ça s'arrete quand ça se passe mal.


Avatar
Nicolas
Laurent Wacrenier wrote:
Jean-Marc Bourguet écrit:

L'idée serait donc de faire:
cd ..
tar cfj simu.`date +%d-%m-%y.%H-%M`.tar.bz2 $(REP)
cd $(REP)


Les lignes des Makefile sont souvent (pas toujours...) interpretees
separement. Mettre des ; a la fin pour n'en faire qu'une grande
ligne logique.



mettre des && plutôt quand on veut que ça s'arrete quand ça se passe mal.


Exacte, c'etait une erreur de ma part lors de la copie (j'obterais pour
ma part plutôt pour &&...). Mais le problème ne vient pas de là!

Je me suis mal exprimé, essayons de faire mieux!
Le problème est que je voudrais faire un tar de mon dossier de projet
avec make mais que je voudrais tarrer le dossier entier et non son
contenu.

Par exemple, vous avez le répertoire de projet /home/toto/projet.
Pour le tarrer, on se placera dans /home/toto et on fera:
tar cvfj simu.`date +%d-%m-%y.%H-%M`.tar.bz2 projet/

Il faut donc récupérer le nom du répertoire du projet (projet)
(avec `pwd | sed s/^\/.*\///`) et le tarrer.
Sauf que, ça ne fonctionne pas car on fait un cd.. avant et avec la
commande `pwd | sed s/^\/.*\///`, on obtient non pas 'projet' mais
toto!

Si quelqu'un a une idée pour stocker le resultat evalué de la commande
sed et non la commande pour pouvoir l'utiliser ensuite...

Merci
dans une variable



Avatar
Jean-Marc Bourguet
Nicolas writes:

Si quelqu'un a une idée pour stocker le resultat evalué de la commande sed
et non la commande pour pouvoir l'utiliser ensuite...


rep=$(basename $(pwd)) && cd .. && tar cf foo.tar "$rep"

A+

--
Jean-Marc
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Nicolas
Jean-Marc Bourguet wrote:
Nicolas writes:


Si quelqu'un a une idée pour stocker le resultat evalué de la commande sed
et non la commande pour pouvoir l'utiliser ensuite...



rep=$(basename $(pwd)) && cd .. && tar cf foo.tar "$rep"

A+



Merci beaucoup!
Ca n'a pas marché du premier coup mais en arrangeant un peu, tout roule!
Voici le code final, si ça peut servir:

REP=`basename $$PWD`; cd .. ;
tar cfj simu.$(NOM_TAR_VERSION).tar.bz2 $$REP &&
cd $$REP


@+
Nicolas


Avatar
Jean-Marc Bourguet
Nicolas writes:

Jean-Marc Bourguet wrote:
Nicolas writes:

Si quelqu'un a une idée pour stocker le resultat evalué de la commande sed
et non la commande pour pouvoir l'utiliser ensuite...
rep=$(basename $(pwd)) && cd .. && tar cf foo.tar "$rep"

A+



Merci beaucoup!
Ca n'a pas marché du premier coup mais en arrangeant un peu, tout roule!
Voici le code final, si ça peut servir:

REP=`basename $$PWD`; cd .. ;
tar cfj simu.$(NOM_TAR_VERSION).tar.bz2 $$REP &&
cd $$REP


Le cd final est inutile, make lance des sous-process et un
sous-process est incapable de changer quoi que ce soit a
l'environnement du parent.

A+

--
Jean-Marc
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
Stephane Chazelas
2005-01-6, 10:47(+00), NICOLAS MAUPU:
J'ai un petit souci dans un Makefile.
Je souhaite faire une commande pour faire une version
de mon projet sous forme de tar.
Voici ce que j'ai déjà fait:

tar: cleanall
tar cfj simu.`date +%d-%m-%y.%H-%M`.tar.bz2 *

He oui, c'est un projet de simulation ;)
Le problème avec ceci, c'est que lors de la décompression
de l'archive, tous les fichiers et répertoires du projets
sont extraits directement dans le répertoire courant.
J'aimerais donc compresser tout dans un répertoire avec une
commande du type:
tar cfj foo.tar.bz2 rep/

Pour avoir le répertoire courant, j'ai pensé faire:
pwd | sed s/^/.*///
Stocké dans une variable du Makefile ca donne:
REP = `pwd | sed s/^\/.*\///`

L'idée serait donc de faire:
cd ..
tar cfj simu.`date +%d-%m-%y.%H-%M`.tar.bz2 $(REP)
cd $(REP)
[...]


cwd=$$(pwd -L) &&
rep=$$(basename -- "$cwd") &&
cd -L .. &&
pax -Hw -- "$$rep" | bzip2 > "simu.$$(date +%d-%m-%y.%H-%M)".tar.bz2"

Note que "cd" fait par defaut un "cd -L", mais c'est pour rendre
plus clair le fait qu'on ne veut pas faire un chdir(".."), mais
un chdir(dirname(current-shell-wd)). Cette version prend en
compte le cas ou $(pwd -L) peut etre un lien symbolique (valable
pour les shells qui utilisent $PWD et qui ne sont pas POSIX
conformants sur ce point [ce qui est le cas de la plupart des
shells pretendument conformants]).

J'utilise pax plutot que tar parce qu'elle est standardisee par
SUSv3 au contraire de tar, mais c'est histoire de gout.

SUSv3> PWD
SUSv3> Set by the shell to be an absolute pathname of the
SUSv3> current working directory, containing no
SUSv3> components of type symbolic link, no components
SUSv3> that are dot, and no components that are dot-dot
SUSv3> when the shell is initialized. If an application
SUSv3> sets or unsets the value of PWD , the behaviors of
SUSv3> the cd and pwd utilities are unspecified.

mais bash, pdksh, zsh, dash, ksh93 gardent tous les liens
symboliques dans $PWD si cette variable se trouve dans leur
environnement au demarrage (ce qui permet de propager le
"current-shell-wd" d'un shell a l'autre).

--
Stephane

Avatar
Nicolas
cwd=$$(pwd -L) &&
rep=$$(basename -- "$cwd") &&
cd -L .. &&
pax -Hw -- "$$rep" | bzip2 > "simu.$$(date +%d-%m-%y.%H-%M)".tar.bz2"



Cette version est aussi très interressante. Je ne connaissais même pas
pax qui a le bon goût d'être standardisé par SUSv3...

Merci en tout cas pour cette leçon!

Avatar
drkm
Nicolas writes:

REP=`basename $$PWD`; cd .. ;
tar cfj simu.$(NOM_TAR_VERSION).tar.bz2 $$REP &&
cd $$REP


Une autre solution, spécifique GNU je pense, serait :

REP = $(shell basenam $$PWD)

tar:
tar cfj simu.$(NOM_TAR_VERSION).tar.bz2 $(REP)

--drkm