Я рассматриваю возможность переключения кроссплатформенного проекта с отдельных систем управления сборками в Visual C ++, XCode и make-файлах на CMake.
Одна важная функция, которая мне нужна, - это автоматическое добавление всех файлов в каталоге к цели. Хотя это легко сделать с помощью make, это нелегко сделать с помощью Visual C ++ и XCode (поправьте меня, если я ошибаюсь). Возможно ли сделать это непосредственно в CMake? Как?
c++
cross-platform
cmake
martjno
источник
источник
Ответы:
Это возможно. Например, с
file(GLOB
:Обратите внимание, что это требует повторного запуска вручную,
cmake
если исходный файл добавлен или удален, поскольку сгенерированная система сборки не знает, когда запросить CMake для регенерации, и выполнение этого при каждой сборке увеличит время сборки.источник
GLOB
:file(GLOB_RECURSE variable [RELATIVE path] [FOLLOW_SYMLINKS] [globbing expressions]...)
.Ответ Клейста, конечно, работает, но есть важное предостережение:
Когда вы пишете
Makefile
вручную, вы можете сгенерироватьSRCS
переменную, используя функцию для выбора всех.cpp
и.h
файлов. Если исходный файл добавлен позже, повторный запускmake
включит его.Тем не менее, CMake (с такой командой
file(GLOB ...)
) явно генерирует список файлов и помещает его в автоматически сгенерированныйMakefile
. Если у вас есть новый исходный файл, вам нужно будет заново сгенерировать егоMakefile
путем повторного запускаcmake
.редактировать: не нужно удалять Makefile.
источник
Расширение для ответа @Kleist :
Так как CMake 3.12 дополнительные опции CONFIGURE_DEPENDS будет поддерживаться с помощью команд
file(GLOB)
иfile(GLOB_RECURSE)
. С помощью этой опции нет нет потребности в вручную повторно запустить CMake после добавления / удаления исходного файла в каталоге - CMake будет повторно запускаться автоматически на следующий строительный проект.Однако опция CONFIGURE_DEPENDS подразумевает, что соответствующий каталог будет перепроверяться при каждом запросе сборки , поэтому процесс сборки будет занимать больше времени, чем без CONFIGURE_DEPENDS .
Даже с доступной опцией CONFIGURE_DEPENDS, документация CMake по-прежнему не рекомендует использовать
file(GLOB)
илиfile(GLOB_RECURSE)
собирать источники.источник
file(GLOB)
илиfile(GLOB_RECURSE)
собирать источники» Что они тогда рекомендуют? Используя что-то еще, чтобы собрать источники или вручную перечислить каждый отдельный исходный файл?Так почему бы не использовать powershell для создания списка исходных файлов для вас. Посмотрите на этот скрипт
Предположим, у вас есть папка с этой структурой
Теперь сохраните этот файл как «generateSourceList.ps1», например, и запустите скрипт как
файл out.txt будет содержать
источник