Как избежать проблем параллелизма при использовании GNU make для параллельных сборок архивных файлов? - PullRequest
11 голосов
/ 11 января 2012

Я использую GNU make для создания группы статических библиотек, используя для этого неявные правила make.Эти правила запускают команду ar (1) для обновления библиотеки / архива.Профилирование показало, что время сборки сократилось бы, если бы я использовал опцию -j для запуска параллельных заданий во время сборки.

К сожалению, в руководстве по GNU make есть раздел http://www.gnu.org/software/make/manual/html_node/Archive-Pitfalls.html, в котором в значительной степени сказано, что make не предоставляет средств защиты от параллелизма для запуска ar (1), и, следовательно, он может (и делает) повреждать архив.В руководстве также указывается, что это может быть исправлено в будущем.

Одним из решений этого является использование http://code.google.com/p/ipcmd,, которое в основном выполняет блокировку семафора перед выполнением команды, таким образом сериализуя команды ar (1)строит архив.Это конкретное решение не подходит для меня, потому что я строю с помощью инструментов кросс-компиляции на основе mingw в Windows.

Есть более простое или лучшее решение этой проблемы?

Ответы [ 2 ]

3 голосов
/ 01 декабря 2014

Попробуйте следующее -

AR := flock make.lock $(AR)

clean::
    rm -f make.lock

Теперь ar (1) будет выполняться с эксклюзивной блокировкой файла make.lock, тем самым сериализовав доступ к библиотеке.

Вы можете добавить команду для удаления файла make.lock после команды ranlib.

Добавьте export AR, чтобы распространить определение на подмодели, если это необходимо.

2 голосов
/ 18 января 2012

Выполняйте архивирование за один шаг, а не пытайтесь обновлять архив постепенно:

libfoo.a: $(OBJS)
        -rm -f $@
        $(AR) rc $@ $^
        $(RANLIB) $@
...