Есть ли способ выполнить атомарную сборку CMake?
Я рассматриваю возможность реализации нашей системы сборки (в настоящее время GNU Make
) в CMake
,
Отказ от ответственности: это больше теоретический вопрос и вопрос "передового опыта". Я не знаю CMake
глубоко. Также, пожалуйста, не стесняйтесь переносить вопрос программистам, если он более тематический.
Насколько я понимаю, стандартный рабочий процесс для CMake
является
cmake .
make
Я подозреваю, что могут быть проблемы с десинхронизацией CMake
файлы и Makefiles.
Итак, во время обычного процесса разработки вы должны запустить make
чтобы избежать ненужных перестроений CMakeCache
а также Makefiles
и, как правило, сделать процесс более простым. Но тогда, если вы добавите, скажем, новый исходный файл в CMakeLists
и беги make
Буду использовать старый CMakeCache
а также Makefiles
и не будет восстанавливать их автоматически. Я думаю, что это может вызвать серьезные проблемы при использовании в масштабе, так как в случае, если что-то строится не так, как должно, вам придется попытаться выполнить make clean
тогда, если это не поможет, вам нужно удалить CMakeCache
и восстановить все (вручную!).
Если я не прав насчет чего-либо из вышеперечисленного, поправьте меня.
Я хотел бы просто сделать
awesome-cmake
и пусть он обновит все, что нужно обновить и построить проект.
Итак, вопрос: есть ли способ сделать "атомарную сборку" с помощью CMake, чтобы он отслеживал всю необходимую информацию и абстрагировался от использования make
?
2 ответа
Я думаю, что у вас есть несколько неверных идей здесь:
Я подозреваю, что могут быть проблемы с десинхронизацией файлов CMake и Makefiles.
В конечном счете, CMake - это создание правильных Makefile-файлов (или файлов решений Visual Studio, или файлов проекта XCode, или чего-либо еще). Если вы не измените сгенерированный Makefile вручную, не может быть проблем с синхронизацией между CMake и Makefile, так как CMake генерирует Makefile.
Но тогда, если вы добавите, скажем, новый исходный файл в
CMakeLists
и бегиmake
Буду использовать старыйCMakeCache
а такжеMakefiles
и не будет восстанавливать их автоматически.
На самом деле, все наоборот: если вы изменили CMakeLists.txt (например, добавили новый источник, изменили флаг компилятора, добавили новую зависимость), затем запустили make
вызовет повторный запуск CMake автоматически. CMake будет считывать ранее кэшированные значения (включая любые аргументы командной строки, ранее переданные CMake) и генерировать обновленный Makefile.
в случае, если что-то строится не так, как надо, вам придется попытаться выполнить
make clean
тогда, если это не поможет, вам нужно удалитьCMakeCache
и восстановить все (вручную!).
Да, это был бы нормальный рабочий процесс, если что-то пошло не так. Однако в моем опыте не все так плохо.
Итак, вопрос: есть ли способ сделать "атомарную сборку" с помощью CMake, чтобы он отслеживал всю необходимую информацию и абстрагировался от использования make?
Учитывая, что работает make
заставит CMake "делать правильные вещи", т.е. перезапускать при необходимости, я думаю, что с помощью make
как можно ближе к "атомной сборке".
Здесь следует остерегаться использования file(GLOB ...)
или аналогичный для создания списка исходных файлов. Из документов:
Мы не рекомендуем использовать GLOB для сбора списка исходных файлов из вашего исходного дерева. Если файл CMakeLists.txt не изменяется при добавлении или удалении источника, то сгенерированная система сборки не может знать, когда попросить CMake сгенерировать заново.
Другими словами, если вы используете file(GLOB ...)
чтобы собрать список источников, вам нужно привыкнуть к перезапуску CMake после добавления / удаления файла из дерева исходных текстов; Бег make
не будет запускать повтор CMake в этой ситуации.
Стандартный рабочий процесс для CMake - сборка вне исходного кода.
mkdir build
cd build
cmake ..
make