Как избежать проблем concurrency при использовании GNU make для параллельных сборок архивных файлов?

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

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

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

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

Ответ 2

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

AR := flock make.lock $(AR)

clean::
    rm -f make.lock

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

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

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