VS>> Как правильно написать Makefile на тот случай, если программа VS>> генерирует одновременно два файла, чтобы при этом она не VS>> запускалась дважды даже при -j2 и больше? VS>> ============================================================== VS>> .MAKE.JOBS= 2 VS>> all: result VS>> foo bar: source VS>> touch foo bar VS>> result: foo bar VS>> cat foo bar > result VS>> clean: VS>> rm -f foo bar result VS>> ============================================================== VS>> Вышеприведенный пример запускает touch дважды.
EG> Решение зависит от того, почему именно мы не хотим запускать touch EG> дважды, так как лекарство не должно быть хуже болезни.
"Unfortunately this Makefile does not describe a single rule with two outputs, but rather two distinct rules that each have a single output, and that happen to use the same series of commands. In a serial build this distinction is often irrelevant and sometimes even undetectable: although GNU Make will schedule both rules to run, the second rule will never do any work because its output file will already have been updated (by the first rule). But try running this build in parallel [...]
the files are actually updated twice. In the best case, this just results in a little wasted work. In the worst case, the rules both try to update the output files at the same time, resulting in corrupted output."
EG> foo: source EG> .if ( ${.MAKE.JOBS} = 1 ) EG> touch foo bar EG> .else EG> make -j1 foo bar EG> .endif
EG> bar: foo EG> [ -f $@ ] || make -j1 foo
Вызов еще одного make изнутри Makefile мне в голову не приходил, это свежо. Но "bar: foo" конечно быть не должно, это не отражает реальной зависимости. Если например прога, обрабатывающая source, решит что foo в этот раз пересоздавать не надо, случится что-нибудь странное.