У меня есть проект с огромным количеством автоматически сгенерированного кода, который мы встраиваем в статическую библиотеку перед добавлением в конечный исполняемый файл. Мы используем gcc / gnat 5.04a. Существует так много файлов, что нам нужно разбить задание на пакеты и несколько раз вызвать ar для построения библиотеки (чтобы избежать ограничения длины командной строки), например:
[echo] Archiving codegen
[echo] Deleting old codegen archive
[ar] Using ar found in /usr/bin
[ar] Batch 1 of 7 completed in 37.871 s
[ar] Batch 2 of 7 completed in 55.796 s
[ar] Batch 3 of 7 completed in 89.709 s
[ar] Batch 4 of 7 completed in 256.894 s
[ar] Batch 5 of 7 completed in 196.704 s
[ar] Batch 6 of 7 completed in 248.334 s
[ar] Batch 7 of 7 completed in 243.759 s
[ar] Archiving took: 1129.067 s
[ar] Using ranlib found in /usr/bin
[ar] Indexing took: 247.223 s
[echo] Done with codegen
Мы ищем потенциальные улучшения скорости. Похоже, что по мере роста архива каждый пакет занимает все больше и больше времени, предположительно потому, что у него есть что искать (для обновлений) перед добавлением объектов. Похоже, именно поэтому удаление архива делает это быстрее, чем просто обновление старого архива на месте. В нашем стремлении к большей скорости мы используем флаги "qcS" для команды ar. Согласно man-странице, «q» (который должен быть быстро добавлен) на самом деле является синонимом «r» (что означает «использовать замену»), «c» создает архив (ничего особенного там), и «S» пропускает создание индекса (который мы рассмотрим, снова используя в конце «ranlib».
Есть ли какой-нибудь удобный способ, используя встроенные инструменты, сделать эту операцию быстрее? Если бы работал режим «быстрого добавления», это, вероятно, было бы тем, что мы хотим, но увы.