Forçando o GNU make a executar comandos em ordem

6

Com o Makefile a seguir, o GNU make executa os dois comandos em paralelo. Como o primeiro demora para ser concluído, rm *.log é executado antes da criação do arquivo log e falha.

dummy.pdf: dummy.tex
    tex dummy.tex &> /dev/null;
    rm *.log

O arquivo dummy.tex one line: \bye (um arquivo curto e vazio para o TeX). Substituir tex dummy.tex por qualquer outro comando mostra o mesmo comportamento. Remover &> /dev/null naturalmente resolveria o problema, mas não é uma opção muito boa no meu caso, já que o Makefile é fornecido por terceiros.

É possível impedir que o GNU make faça alguma coisa em paralelo? (o sinalizador -j 1 não ajuda).

EDIT: saída para o terminal:

bruno@bruno-laptop:~/LaTeX/make-experiment$ make
tex dummy.tex &> /dev/null;
rm *.log
rm: cannot remove '*.log': No such file or directory
make: *** [dummy.pdf] Error 1
bruno@bruno-laptop:~/LaTeX/make-experiment$ This is TeX, Version 3.1415926 (TeX Live 2009/Debian)
(./dummy.tex )
No pages of output.
Transcript written on dummy.log.
    
por Bruno Le Floch 17.03.2011 / 20:34

2 respostas

11

Na verdade, você não tem problemas com o make, mas com o seu comando:

tex dummy.tex &> /dev/null;

Executa 'tex' em segundo plano. Você não precisa remover '> / dev / null', mas '&' está enviando 'tex' para o plano de fundo.

Tente isso, deve estar tudo bem para você:

tex dummy.tex > /dev/null;

ou execute tudo no mesmo subshell, assim:

(tex dummy.tex > /dev/null;rm *.log)

ou menos são, isto:

if test 1 = 1; then tex dummy.tex > /dev/null;rm *.log; fi

PD: & > é uma extensão fornecida por alguns shells (incluindo o bash) para redirecionar stdout e stderr para o mesmo destino, mas não é portátil, você deve usar '> / dev / null 2 > & 1' em seu lugar. (Obrigado @Gilles)

Felicidades

    
por 17.03.2011 / 20:43
1

Er? make paralela alvos (com -j ); nunca reordena comandos dentro de um alvo.

    
por 17.03.2011 / 20:37