OVH Cloud OVH Cloud

Qui m'a foutu ce make ??

3 réponses
Avatar
cedric
Derrière ce sujet un rien provocateur ce cache une question toute bête :

$ cd /tmp
$ cat > Makefile
all:
@false; true;
^D
$ make
*** Error code 1

Stop in /tmp.
$ gmake
$

Résumons : une ligne de commande, dans le Makefile, ne semble pas
être équivalente à "sh -c 'la ligne de commande'" mais est apparement
interpreté d'une facon bizarre...

Question : pourquoi une ligne de commande n'est-elle pas équivalente à
une seule ligne de commande lancée dans un seul shell, dont make ne
regarderait que le code d'erreur global (et pas tous les codes d'erreurs
intermédiaires) ? Est-ce par pure méchanceté, ou est-ce un moyen
détourné de faire l'apologie de gnumake ? :-)

3 réponses

Avatar
cedric
C'est bon, je viens de faire man sh et j'ai trouvé.

Comme je le pensais, il s'agit donc bien de quelquechose d'ingénieux :
lancer sh avec l'option -e pour éviter qu'une commande dont l'erreur
n'est pas "catchée" entraine une gross katasstroff.

Merci à moi même pour cette réponse rapide et précise.
Avatar
espie
In article <40f28bcf$0$26954$,
cedric wrote:
Derrière ce sujet un rien provocateur ce cache une question toute bête :

$ cd /tmp
$ cat > Makefile
all:
@false; true;
^D
$ make
*** Error code 1

Stop in /tmp.
$ gmake
$

Résumons : une ligne de commande, dans le Makefile, ne semble pas
être équivalente à "sh -c 'la ligne de commande'" mais est apparement
interpreté d'une facon bizarre...

Question : pourquoi une ligne de commande n'est-elle pas équivalente à
une seule ligne de commande lancée dans un seul shell, dont make ne
regarderait que le code d'erreur global (et pas tous les codes d'erreurs
intermédiaires) ? Est-ce par pure méchanceté, ou est-ce un moyen
détourné de faire l'apologie de gnumake ? :-)


Essaie plutot sh -e -c 'la ligne de commande'.

C'est de la mechancete, mais pas pure du tout. Un fragment de shell qui
lance des commandes intermediaires qui echouent autrement que dans des
tests merite de se gauffrer dans les grandes largeurs.

Ca evite de rechercher trois cents lignes plus loin pourquoi ca marche
pas, alors que c'est une bete commande intermediaire qui a plante.

Accessoirement, au moins sous OpenBSD, il y a un petit bug dans notre shell
(ksh) qui fait que deux/trois constructions qui devraient passer ne
fonctionnent pas.

En particulier, le test classique
false && true
fonctionne tout seul, mais foire dans une boucle.

Avatar
cedric
Marc Espie wrote:
C'est de la mechancete, mais pas pure du tout. Un fragment de shell qui
lance des commandes intermediaires qui echouent autrement que dans des
tests merite de se gauffrer dans les grandes largeurs.


Le shell qui me posait problème faisait ca :

@find machin1 machin2
ERR=$$?
if [ $ERR ... ] etc...

Je n'osais pas trop insister pour que l'on utilise un style plus direct
lorsqu'on travaille en shell. Maintenant, j'ai un argument-massue ;)