GNU make가 명령을 순차적으로 실행하도록 강제

GNU make가 명령을 순차적으로 실행하도록 강제

다음 Makefile을 사용하여 GNU make는 이 두 명령을 병렬로 실행합니다. 첫 번째 작업은 완료하는 데 시간이 걸리기 때문에 rm *.log파일이 생성되기 전에 실행되어 실패합니다.log

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

파일 dummy.tex라인: \bye(TeX의 경우 짧은 빈 파일). 다른 명령으로 바꾸면 tex dummy.tex동일한 동작이 표시됩니다. 이를 제거하면 &> /dev/null확실히 문제가 해결되지만 Makefile은 제3자가 제공하므로 나에게는 좋은 선택이 아닙니다.

GNU make가 병렬로 작업을 수행하는 것을 방지할 수 있습니까? (플래그는 -j 1도움이 되지 않습니다).

편집: 터미널로 출력:

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.

답변1

실제로 make에는 문제가 없지만 명령에는 문제가 있습니다.

tex dummy.tex &> /dev/null;

백그라운드에서 "tex"를 실행합니다. ">/dev/null"을 제거할 필요는 없지만 "&"는 "tex"를 백그라운드로 보냅니다.

이것을 시도해 보세요. 효과가 있을 것입니다.

tex dummy.tex > /dev/null;

또는 다음과 같이 동일한 서브셸에서 모든 것을 실행합니다.

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

또는 덜 현명하게도 다음과 같습니다.

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

PD: &>는 stdout과 stderr을 동일한 대상으로 리디렉션하기 위해 일부 쉘(bash 포함)에서 제공하는 확장이지만 이식성이 없으므로 대신 '>/dev/null 2>&1'을 사용해야 합니다. (@gils에게 감사드립니다)

건배

답변2

잘? make대상을 병렬화합니다(사용 -j). 대상 내에서 명령의 순서를 바꾸지 않습니다.

관련 정보