Я запускаю CI-сервер, который использую для создания собственного ядра Linux. Сервер CI не является мощным и имеет ограничение по времени в 3 часа на сборку. Чтобы работать в рамках этого ограничения, у меня возникла идея кэшировать сборки ядра с помощью ccache. Я надеялся, что смогу создавать кеш один раз при каждом выпуске младшей версии и повторно использовать его для выпусков патчей, например. У меня есть кеш, который я сделал для 4.18, который я хочу использовать для всех ядер 4.18.x.
После удаления отметок времени сборки это отлично работает для той версии ядра, для которой я создаю. Для ядра 4.18, упомянутого выше, построение его на CI дает следующие статистические данные:
$ ccache -s
cache directory
primary config
secondary config (readonly) /etc/ccache.conf
stats zero time Thu Aug 16 14:36:22 2018
cache hit (direct) 17812
cache hit (preprocessed) 38
cache miss 0
cache hit rate 100.00 %
called for link 3
called for preprocessing 29039
unsupported code directive 4
no input file 2207
cleanups performed 0
files in cache 53652
cache size 1.4 GB
max cache size 5.0 GB
Скорость попадания в кеш 100% и час на завершение сборки, фантастическая статистика, как и ожидалось.
К сожалению, когда я пытаюсь собрать 4.18.1, я получаю
cache directory
primary config
secondary config (readonly) /etc/ccache.conf
stats zero time Thu Aug 16 10:36:22 2018
cache hit (direct) 0
cache hit (preprocessed) 233
cache miss 17658
cache hit rate 1.30 %
called for link 3
called for preprocessing 29039
unsupported code directive 4
no input file 2207
cleanups performed 0
files in cache 90418
cache size 2.4 GB
max cache size 5.0 GB
Это 1,30% попаданий, и время сборки отражает эту низкую производительность. Это из-за изменения только одной версии патча.
Я ожидал, что производительность кэширования со временем ухудшится, но не до такой степени, поэтому я думаю только о том, что существует больше недетерминированности, чем просто временная метка. Например, все ли исходные файлы включают строку с полной версией ядра? Насколько я понимаю, что-то подобное полностью нарушит кеширование. Есть ли способ заставить кеширование работать так, как хотелось бы, или это невозможно?
gcc -H
вывод компиляции некоторого объекта ядра, чтобы получить список заголовков, найдите их версию ядра с помощью команды grep. - person osgx   schedule 18.08.2018include/generated/uapi/linux/version.h
с#define LINUX_VERSION_CODE 0x041012
(для 4.16.18), а также$KERNELVERSION
экспортируется из верхнего файла Makefile elixir.bootlin.com/linux/v4.16.18/source/Makefile - person osgx   schedule 25.08.2018