Ответ 1
Сделайте архивацию как один шаг, а не пытайтесь обновить архив пошагово:
libfoo.a: $(OBJS)
-rm -f [email protected]
$(AR) rc [email protected] $^
$(RANLIB) [email protected]
Я использую 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.
Есть ли более простое или лучшее решение этой проблемы?
Сделайте архивацию как один шаг, а не пытайтесь обновить архив пошагово:
libfoo.a: $(OBJS)
-rm -f [email protected]
$(AR) rc [email protected] $^
$(RANLIB) [email protected]
Попробуйте следующее:
AR := flock make.lock $(AR)
clean::
rm -f make.lock
Теперь ar (1) выполнит с исключительной блокировкой файл make.lock, тем самым сериализуя доступ к библиотеке.
Вы можете добавить команду для удаления файла make.lock после команды ranlib.
Добавьте export AR
, чтобы распространять определение на суб файлы, если это необходимо.