Запуск cmake перед сборкой после извлечения из git

Этот проект хранится в репозитории git, который мы собираем с помощью cmake и ninja. Мы используем глобальные выражения/функции для сбора всех исходных файлов для компиляции. Это означает, что каждый раз, когда файл добавляется/удаляется, необходимо вызывать cmake для повторного анализа каталогов.

Мы видели, что это приводит к некоторой потере времени, когда кто-то извлекает после того, как кто-то запушил какой-то новый файл, без изменений в каком-либо из файлов cmake. Я говорю это в последнюю очередь, потому что модификация любого из файлов cmake вызовет вызов cmake (от ниндзя), и все будет в порядке.

Как я могу добиться того, чтобы cmake вызывался до/когда я снова начну сборку своего проекта после извлечения? (Примечание: не имеет значения, если cmake запускается немного больше, чем необходимо, если это не всегда)

Я строю из исходного кода, кроме того, используя несколько каталогов сборки, где, например, я тестирую разные компиляторы.

Я изучаю некоторые решения. Один с использованием скрипта git hooks, а именно post-merge (но как я могу гарантировать, что получу путь к source/CMakeLists.txt, чтобы прикоснуться к нему? Могу ли я закоммитить скрипт, чтобы он работал для всех? Это не общественный проект). Не знаю актуально ли это, мы в основном используем git через графический интерфейс (TortoiseGit).

Другим возможным решением было бы использование в cmake пользовательской цели, зависящей от содержимого каталога .git\refs\heads, но я не могу придумать комбинацию, которая действительно могла бы работать...

Некоторые ссылки:

  1. http://git-scm.com/book/en/Customizing-Git-Git-Hooks
  2. https://www.kernel.org/pub/software/scm/git/docs/githooks.html

Команды CMake: http://www.cmake.org/cmake/help/v2.8.11/cmake.html


person Antonio    schedule 24.07.2013    source источник


Ответы (1)


person    schedule
comment
Будет ли еще одним недостатком его платформа? (подозреваете, что это не будет работать на всех платформах?) - person ideasman42; 04.06.2015
comment
@ideasman42 Я думаю, все в порядке. Он протестирован в Windows, в которой даже нет сенсорного экрана, переносимость полностью зависит от git и его поддержки сценариев оболочки (и команды touch). - person Antonio; 04.06.2015
comment
Будет ли это работать на всех операциях git? (прошивка, смена веток, применение патчей) - person ideasman42; 04.06.2015
comment
@ideasman42 Это работает для смены веток. Для применения патча необходимо добавить дополнительный хук. Для тайника я должен проверить, вероятно, нет. Но stash — это то, что вы делаете локально, и вы можете научиться запускать cmake каждый раз, когда вы stash, как и каждый раз, когда вы добавляете файл. Смысл этого хука в том, чтобы избежать проблем, когда кто-то еще добавляет/удаляет файл. - person Antonio; 05.06.2015
comment
хорошо, что у вас это работает для вашего собственного проекта, но это кажется довольно ненадежным способом решить то, для чего CMake не был разработан. Разработчик должен помнить, какие действия вызывают повторный запуск CMake, всегда есть шанс, что вы примените патч снаружи git, или новый разработчик получает исходный код и забывает прикоснуться к нему после сохранения. Или... кто знает, кто-то может захотеть использовать libgit+MSVC... другую среду, по крайней мере, без такой же поддержки перехватчиков сценариев оболочки. Таким образом, вы предлагаете ненадежное решение, которое работает иногда, в качестве альтернативы перечислению файлов, которое работает всегда. - person ideasman42; 05.06.2015
comment
@ ideasman42 На практике это работает. И это будет работать во многих сценариях. Разработчикам, участвующим в проекте, необходимо минимальное образование. Мы избегаем громоздких файлов cmake, когда многие люди (неохотно) редактируют их. - person Antonio; 05.06.2015
comment
для вашего собственного использования, вероятно, он достаточно хорош, но тот факт, что он может дать сбой в обычных случаях, таких как применение патча, не следует замалчивать. Он также опирается на git, что само по себе является недостатком, учитывая, что с годами проекты могут перемещаться между системами VCS. - Проверьте все крупные проекты, использующие CMake, здесь приведена передовая практика, и она используется не зря. В разделе Недостатки этого ответа вам действительно следует перечислить все случаи, в которых он терпит неудачу. - person ideasman42; 06.06.2015
comment
@ideasman42 Тема вопроса заключалась в том, что git сочетается с cmake и ничем другим. Кроме того, до сих пор не упоминалось, что перечисление файлов имеет недостаток, заключающийся в потенциальных конфликтах в файле, содержащем список (и возможных ошибках ручного разрешения), которых нет в предлагаемом методе. Список файлов или подстановка, как вы знаете, является спорным предметом. - person Antonio; 26.04.2016
comment
@Antonio Антонио Чтобы увидеть альтернативу вашим крючкам только для cmake, см. Мой ответ на тот же спорный предмет. Единственный недостаток, о котором я знаю, - это дополнительные 30+ строк кода cmake и дополнительный файл something_changed, который вы должны хранить в системе управления версиями. - person Glen Knowles; 29.10.2017