Бывает, что
make -j работает нормально, а затем сборка случайно падает на CI или новой машине. Частая причина — одна цель неявно рассчитывает, что другая успеет выполниться раньше, хотя эта зависимость нигде не объявлена.В GNU Make 4.4 для поиска таких проблем появился
--shuffle:make -j8 --shuffle
Make сохраняет зависимости между целями, но намеренно меняет допустимый порядок их выполнения. Если Makefile случайно зависит от привычной последовательности, вероятность воспроизвести проблему резко возрастает.Полезно прогнать сборку несколько раз:
for i in {1..20}; do
make clean
make -j8 --shuffle || break
doneЕсли сборка упала,
Make сообщает seed перемешивания. Его можно передать повторно и воспроизвести тот же порядок:make -j8 --shuffle=123456789
Интересно, что
--shuffle полезен даже без параллельной сборки:make -j1 --shuffle
Так можно обнаружить зависимости от порядка выполнения отдельно от настоящих проблем конкурентного выполнения.
🔥
make --shuffle превращает порядок сборки в fuzz-тест: отличный способ найти отсутствующие зависимости в Makefile до того, как они проявятся случайным падением на CI.🚪 Linux Ready | #совет
