Конвейеры Cmake и многоступенчатой сборки (повторное использование)

#c #cmake

#c #cmake

Вопрос:

У меня есть проект cpp cmake, для компиляции основных компонентов которого требуется немного времени.

Допустим

  • Компонент A (компиляция занимает 2 часа)
  • Компонент B (компиляция занимает 1 час)
  • Компоненту C необходимо статически связать компоненты A и B (занимает 5 минут)

В основном мы меняем только компонент C.

Но мы хотим, чтобы наши элементы сборки PR перестраивали A и B, если это необходимо, но не обязательно, если не было никаких изменений.

Я хотел бы создавать компоненты A и B один раз за ночь.

Затем в течение дня разрешите нашим PR-шлюзам загружать из них промежуточные компоненты, а затем выполнять инкрементную сборку, восстанавливая только те части, которые были изменены.

Однако cmake, похоже, встраивает много информации о пути к папке в промежуточные файлы / файлы штампов кэша и прочее. И наши машины сборки каждый раз имеют немного разные пути. (например c:repo###sourceDir и ### меняется каждый раз.

Есть ли какой-нибудь простой способ сделать это? Или мне нужно «изменить все соответствующие файлы .txt, .tlog, текст в кэше и т.д.», А также вернуть временные метки к их оригиналам после изменения пути к файлам в соответствии с текущей машиной.

Я попытался просто скопировать папку /intermediates / со всеми .obj и другими вещами, но я думаю, что cmake придирчив к путям к папкам.

И я не хочу использовать предварительно созданный.библиотека lib или .dll из компонента A или B, потому что мы могли внести в них изменения, поэтому в этом случае она должна быть инкрементной.

Редактировать /ответы

Я еще не заглядывал в ccache, не слышал об этом.

мы вызываем это через cmake.exe (настройка/сборка/установка) cmakelists.txt . У каждого компонента есть свои собственные cmakelists.txt в папке верхнего уровня

  • src/componentA/cmakelists.txt (управляет всем сам по себе, не имеет уступа B или C)
  • src/componentA/cmakelists.txt (управляет всем сам по себе, не имеет уступа A или C)
  • src/componentC/cmakelists.txt (управляет всем сам по себе включает из A и B)

Комментарии:

1. вы думали об использовании ccache ?

2. Как здесь задействован cmake? Используете ли вы древовидную структуру cmake, в которой B и C являются подпапками cmakelist в папке cmakelist верхнего уровня?

3. Я изучу ccache, не знаком с ним.

4. отредактированный основной комментарий.

5. «Промежуточные элементы» CMake (артефакты, созданные на этапе конфигурирования и сборки) не предназначены для переноса на другую машину. Если только эта другая машина не очень-очень «похожа» на ту, на которой создаются эти промежуточные продукты, с теми же утилитами и их путями, теми же исходными кодами и каталогами сборки и так далее.