Как использовать все файлы * .c в каталоге с системой сборки Cmake? - PullRequest
52 голосов
/ 21 января 2010

Я хочу найти все .c файлы в каталоге и добавить их все в файлы SRC для компиляции в cmake. Как я могу сделать это в CMakeList.txt.

для обычных make-файлов, которые я могу создать

SPECIFIED_SRC_FILE  = $(foreach d,$(SPECIFIED_SRC_DIRS),$(wildcard $(addprefix $(d)/*,*.c)))

но я не мог понять, как сделать что-то подобное в CMakeList.txt.

Ответы [ 5 ]

55 голосов
/ 30 июля 2010

А как насчет старого доброго шарика?

FILE(GLOB MyCSources *.c)
ADD_EXECUTABLE(MyExecutable ${MyCSources})
44 голосов
/ 21 января 2010

Попробуйте это:

AUX_SOURCE_DIRECTORY

Найти все исходные файлы в каталоге.

AUX_SOURCE_DIRECTORY(dir VARIABLE) 

Собирает имена всех исходных файлов в указанном каталоге и сохраняет список в предоставленной переменной. Эта команда предназначена для использования в проектах, использующих явную реализацию шаблона. Файлы экземпляров шаблона могут храниться в «Шаблонах» подкаталог и собирается автоматически с помощью этой команды, чтобы избежать вручную перечисляя все экземпляры.

Соблазнительно использовать эту команду, чтобы не писать список источников файлы для библиотеки или исполняемой цели. Хотя это, кажется, работает, CMake не может сгенерировать систему сборки, которая знает, когда новый исходный файл был добавлен. Обычно сгенерированная система сборки знает, когда нужно перезапустить CMake, потому что файл CMakeLists.txt изменен, чтобы добавить новый источник. Когда источник только что добавлен в каталог без изменения этого файла, придется вручную Перезапустите CMake, чтобы сгенерировать систему сборки, включающую новый файл.

2 голосов

GLOB_RECURSE рекурсивный пример

В основном * также входит в подкаталоги:

cmake_minimum_required(VERSION 3.0)
file(GLOB_RECURSE SOURCES RELATIVE ${CMAKE_SOURCE_DIR} "src/*.c")
add_executable(main ${SOURCES})

И тогда наши источники могут быть расположены, например, как:

src/main.c
src/d/a.c
src/d/a.h

И main.c использует #include "d/a.h", а a.c использует #include "a.h".

Использование GLOB_RECURSE на верхнем уровне CMake (т. Е. "*.c" вместо "src/*.c"), вероятно, является плохой идеей, поскольку он может принимать .c файлы, сгенерированные самим CMake и помещаемые в build/.

Пример запуска на GitHub .

2 голосов
/ 01 июня 2017

Да, у вас есть два варианта. Предположим, у вас структура папок примерно такая.

├── autopilot
            │   ├── _AutoPilot.cpp
            │   ├── _AutoPilot.h
            │   └── action
            │       ├── ActionBase.cpp
            │       ├── ActionBase.h
            │       ├── APcopter
            │       │   ├── APcopter_avoid.cpp
            │       │   ├── APcopter_avoid.h

Если вы хотите использовать AUX_SOURCE_DIRECTORY, вам нужно добавить CMakeLists.txt каждый из подкаталогов. Затем вы должны включить и связать все эти подкаталоги. Это довольно сложная задача. Таким образом, вы можете GLOB и делать работу очень легко. Вот как это делается.

  file(GLOB autopilot_sources ./*.cpp ./*/*.cpp ./*/*/*.cpp ./*/*/*/*.cpp ./*.c ./*/*.c ./*/*/*.c ./*/*/*/*.c)
  SET( autopilot ${autopilot_sources})  

Если вы хотите создать библиотеку, используя приведенный выше исходный код, это команда:

  ADD_LIBRARY ( autopilot  ${autopilot})
  TARGET_LINK_LIBRARIES ( autopilot)  

Если вы хотите создать исполняемый файл, используя приведенный выше исходный код, это команда:

 ADD_EXECUTABLE(autopilot ${autopilot})
0 голосов
/ 23 января 2010

Вы можете использовать AUX_SOURCE_DIRECTORY, как описано @whitequark, но на самом деле это не будет работать так, как вы ожидаете, поскольку CMake не сможет определить, когда добавляются новые файлы (что является целым смыслом с использованием подстановочного знака) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...