Добро пожаловать, Гость. Пожалуйста авторизуйтесь здесь.
FGHIGate на GaNJa NeTWoRK ST@Ti0N - Просмотр сообщения в эхоконференции RU.UNIX.BSD
Введите FGHI ссылку:


Присутствуют сообщения из эхоконференции RU.UNIX.BSD с датами от 18 Jan 11 22:51:00 до 16 Sep 24 17:28:15, всего сообщений: 10763
Ответить на сообщение К списку сообщений Предыдущее сообщение Следующее сообщение
= Сообщение: 7353 из 10763 ===================================== RU.UNIX.BSD =
От   : Victor Sudakov                   2:5005/49          11 May 18 14:25:56
Кому : Eugene Grosbein                                     11 May 18 14:25:56
Тема : Makefile
FGHI : area://RU.UNIX.BSD?msgid=2:5005/49+5af54826
На   : area://RU.UNIX.BSD?msgid=grosbein.net+1a9c2489
= Кодировка сообщения определена как: CP866 ==================================
Ответ: area://RU.UNIX.BSD?msgid=grosbein.net+6f307467
==============================================================================
Dear Eugene,

11 May 18 15:02, you wrote to me:

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."

(это так объясняют в https://www.cmcrossroads.com/article/rules-multiple-outputs-gnu-make)
т.е. от лишней траты вычислительных ресурсов до возможного повреждения файлов, если в них станут писать одновременно. В реальности ведь там не touch).

EG> Hапример, такой вариант (не тестировал):

EG> .MAKE.JOBS?=     2
EG> all:    result

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 в этот раз пересоздавать не надо, случится что-нибудь странное.

Victor Sudakov, VAS4-RIPE, VAS47-RIPN
--- GoldED+/BSD 1.1.5-b20160322-b20160322
* Origin: Ulthar (2:5005/49)

К главной странице гейта
Powered by NoSFeRaTU`s FGHIGate
Открытие страницы: 0.112216 секунды