2010-07-08 3 views
106

Я рассматриваю возможность переключения кросс-платформенного проекта из отдельных систем управления компоновкой в ​​Visual C++, XCode и make-файлы в CMake.CMake - автоматически добавлять все файлы в папку к цели?

Одна существенная функция, которая мне нужна, - это автоматически добавлять все файлы в каталог к ​​цели. Хотя это легко сделать с make, это не легко справиться с Visual C++ и XCode (исправьте меня, если я ошибаюсь). Можно ли сделать это непосредственно в CMake? Как?

Не стесняйтесь добавлять какие-либо другие вещи, о которых я должен знать, прежде чем перейти к изучению CMake, учитывая, что в настоящее время проект имеет средний размер (8 библиотек, 2 исполняемых файла, 8 тестовых проектов и в зависимости от около 8 внешних библиотек).

+0

КПП. в In Visual Studio, по крайней мере в проектах C#, есть кнопка на панели инструментов в проводнике проекта, именованные показать все файлы. Это делает все подкаталоги проекта видимыми, серыми, если они не содержат файлов, логически включенных в проект. Вы можете включить эти каталоги через контекстное меню, которое включает в себя все исходные файлы внутри них, рекурсивно :) – yeoman

ответ

154

Это возможно. Например. с file(GLOB:

cmake_minimum_required(VERSION 2.8) 

file(GLOB helloworld_SRC 
    "*.h" 
    "*.cpp" 
) 

add_executable(helloworld ${helloworld_SRC}) 

Заметим, что это требует ручной повторно ход cmake если исходный файл был добавлен или удален, так как генерируемый системой сборки не знает, когда просить CMake к регенерации, и делает это на каждая сборка увеличивала время сборки.

+8

Альтернативой ручному запуску cmake является касание файла CMakeLists.txt перед запуском make. –

+1

Альтернатива 'GLOB': [' file (переменная GLOB_RECURSE [RELATIVE path] [FOLLOW_SYMLINKS] [выражения для подстановки] ...) '] (https://cmake.org/cmake/help/v3.0/command/ file.html). – Hydro

+2

> «Мы не рекомендуем использовать GLOB для сбора списка исходных файлов из исходного дерева. Если файл CMakeLists.txt не изменяется при добавлении или удалении источника, сгенерированная система сборки не может знать, когда следует запросить CMake для регенерации». Это больше не рекомендуется в документах CMAKE3.7, связанных с Hand1Cloud – triple

27

Ответ на Клейсте, конечно, работает, но есть важное предостережение:

При написании Makefile вручную, вы можете сгенерировать SRCS переменные с помощью функции, чтобы выбрать все .cpp и .h файлов. Если впоследствии будет добавлен исходный файл, его включит повторный запуск make.

Однако CMake (с такой командой, как file(GLOB ...)) будет явно генерировать список файлов и поместить его в автоматически сгенерированный Makefile. Если у вас есть новый исходный файл, вам нужно будет сгенерировать Makefile путем повторного запуска cmake.

Редактировать: нет необходимости удалять файл Makefile.

+4

Невозможно перезаписать smake, который должен удалить/изменить устаревший Makefile? – Ethan

+1

Этан: попробовал, вы правы. Отредактировал ответ. –

+7

Это не ответ, это комментарий о ответе @ Kleist. – Neowizard

Смежные вопросы