Мы переезжаем из MPC в CMake.
Мы предоставляем библиотеку с некоторыми образцами. Образцы идут с make-файлами.
Проблема в том, что make-файлы, сгенерированные cmake, содержат абсолютные пути, но не относительные:
# The main all target
all: cmake_check_build_system
cd /.../Projects/cpp_trunk && $(CMAKE_COMMAND) -E cmake_progress_start /.../Projects/cpp_trunk/CMakeFiles /.../Projects/cpp_trunk/samples/CMakeFiles/progress.make
cd /.../Projects/cpp_trunk && $(MAKE) -f CMakeFiles/Makefile2 samples/all
$(CMAKE_COMMAND) -E cmake_progress_start /.../cpp_trunk/CMakeFiles 0
Итак, когда он скопирован, он становится сломанным.
Есть ли способ обойти это?
UPD: я прочитал Часто задаваемые вопросы, но мой вопрос все еще имеет место, возможно, кто-то сумел обойти?
Чтобы обойти подобные вещи, я написал небольшой Makefile-обертку вокруг cmake. Я поместил Makefile в корень проекта с таким содержимым:
all: cmake
cmake:
[ -f build/CMakeCache.txt ] && [ "$$(pwd)" != "$$(grep 'CMAKE_HOME_DIRECTORY:INTERNAL' build/CMakeCache.txt | cut -d '=' -f 2)" ] \
&& rm -rf build || true
mkdir -p build && cd build && cmake ..
make -C build
clean:
rm -rf build
Вероятно, есть более чистый способ сделать это, но он работает для меня:
make # build in one directory
cd ..
olddir=$(basename $OLDPWD) && rsync -ravz $olddir ${olddir}-test && cd ${olddir}-test # copy to another directory
make # running make in the new dir triggers a full rebuild
make # running make a second time in the new dir does not rebuild
Makefile, созданные CMake, не являются частью вашей базы исходного кода. Файлы CMakeLists.txt, которые вы используете в качестве входных данных для CMake являются часть вашей базы исходного кода. Когда вы копируете свой исходный код в другое место и хотите создать его там, создайте его из своего исходного кода. Это означает повторный запуск CMake. (И это ваш обходной путь.)
Я использую CMake более десяти лет непрерывно в одном проекте. Одна из полезных уловок, которую выучила моя команда, заключается в том, что вы можете иметь несколько копий одной части базы исходного кода на одном хосте разработки, которые все совместно используют одну и ту же копию остальной части базы исходного кода. Попробуйте сделать это с относительными путями! Мы полагаться на том факте, что каждый раз, когда мы собираем исходный код в новом каталоге сборки, CMake будет определять правильные пути ко всем исходным файлам, которые не обязательно совпадают с новым каталогом сборки, как это было в предыдущей сборке.
Файлы сборки, сгенерированные cmake (make-файлы, файлы ninja и т. Д.), Будут содержать жестко закодированные пути и другие непереносимые элементы. Это нормально. Рассматривайте их как временные файлы, которые являются частью процесса сборки. Вы будете только создавать версии файлов CMakeLists.txt, а затем генерировать новые make-файлы (или что-то еще) на других машинах или в других каталогах, когда вы проверяете их. У вас даже могут быть разные люди в команде, использующие разные файлы сборки — один человек, использующий make-файлы, один человек, использующий eclipse + ninja и т. Д., Все сгенерированные cmake.