Добавить все файлы из папки в глобус CMake?

Я только что прочитал это:

CMake - автоматически добавлять все файлы в папке в цель?

С ответом, предлагающим глобальный файл, например:

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

Теперь, что, если я хочу, чтобы моя цель зависела от всех файлов определенного типа в определенной папке, которая может находиться в нескольких подпапках? Я пробовал использовать

execute_process(COMMAND find src/baz/ -name "*.cpp" OUTPUT_VARIABLE BAR)

а потом

add_executable(foo ${BAR}

но это дает мне ошибку:

Не удается найти исходный файл:

  src/baz/some/file/here

src/baz/some/other_file/here

src/baz/some/other_file/here2

(да, с таким интервалом.)

Что я здесь делаю не так?


person einpoklum    schedule 15.02.2016    source источник
comment
Может file(GLOB_RECURSE ...)? Но имейте в виду Почему файл cmake GLOB является злом? и Лучший способ указать исходные файлы в CMake   -  person Florian    schedule 15.02.2016
comment
Использование find таким образом - плохая идея, но вы можете решить проблему, с которой вы, похоже, столкнулись, добавив -type f.   -  person bames53    schedule 15.02.2016
comment
@ bames53: Я попробую. Насчет того, что это плохая идея - я прочитал ссылки, опубликованные Флорианом, и думаю, что согласен с этим ответом первым комментарием в этом ответе   -  person einpoklum    schedule 16.02.2016
comment
@einpoklum Я думаю, что комментарий, на который вы ссылаетесь, сравнивает неправильные вещи: но разве не правда, что если вы не используете glob, вам все равно придется вручную обновлять CMakeLists.txt, что означает, что cmake по-прежнему не обновляет систему сборки автоматически? Первоначальная жалоба на то, что подстановка файлов не обновляет систему сборки автоматически, не сравнивалась с системой, которая автоматически обновляет систему сборки. Возможно, исходная точка зрения не была столь четко выражена, но жалоба касалась режима отказа двух методов.   -  person bames53    schedule 16.02.2016
comment
@einpoklum Режим отказа для сборок, основанных на подстановке, возможно, трудно диагностировать, возможно, даже незаметно, сломанные сборки, которые могут произойти в результате проблемы, которая не имеет ничего общего с кодом, фактически находящимся в системе управления версиями. Режим отказа для сборок, основанных на явных списках файлов, представляет собой явный и воспроизводимый сбой, который можно контролировать / предотвращать с помощью кода, фактически находящегося в системе управления версиями, независимо от того, какой другой мусор может оставить в своем рабочем каталоге разработчик, проверяющий код.   -  person bames53    schedule 16.02.2016
comment
@ bames53: Я уважаю то, что вы говорите, хотя и не согласен. Я не говорю, что все должно быть повсюду глобально, но это можно разумно использовать во многих случаях. В любом случае, я не думаю, что мы должны пытаться убедить друг друга избегать глобализации или применять глобализацию здесь, в комментариях ...   -  person einpoklum    schedule 16.02.2016
comment
@einpoklum О, еще мой комментарий об использовании find таким образом не касался обычной проблемы подстановки. Причина, по которой я бы не советовал использовать здесь find, заключается в том, что он добавляет дополнительную зависимость без реальной причины. file(GLOB_RECURSE ...) здесь кажется правильным.   -  person bames53    schedule 16.02.2016
comment
Авторы CMake не рекомендуют использовать его в проектах, а только в скриптах. презентация   -  person Damian    schedule 28.11.2017


Ответы (1)


Превращаю мой комментарий в ответ

Если вы хотите добавить рекурсивный поиск файлов, используйте file(GLOB_RECURSE ...)

file(GLOB_RECURSE source_list "*.cpp" "*.hpp")

Ваш второй пример будет переведен на

file(GLOB_RECURSE BAR "src/baz/*.cpp")

Ссылки

person Florian    schedule 16.02.2016
comment
Здесь было бы неплохо добавить, что также можно использовать встроенные переменные CMake для указания точного местоположения файлов, которые мы хотим добавить рекурсивно, то есть - file (GLOB_RECURSE SRC $ {CMAKE_CURRENT_LIST_DIR} / src / *. cpp) - добавит все исходные файлы C ++, расположенные в папке src, которая сама находится в той же папке, где находится текущий обрабатываемый файл CMakeList.txt. - person Guy Avraham; 13.09.2017
comment
Поддерживает ли это исключение определенных файлов? - person coin cheung; 24.10.2018
comment
Этот ответ будет неполным без обсуждения CONFIGURE_DEPENDS, который восстанавливает базовый, фундаментальный контракт на сборки CMake о том, что сгенерированная система сборки имеет все, что ей нужно знать, когда следует повторно настраивать. - person Alex Reinking; 01.07.2021
comment
Также следует отметить, что разработчики CMake делают не рекомендую использовать GLOB для сбора списка исходных файлов из вашего исходного дерева. Это довольно строгий язык, и перед этим следует сделать одну паузу. Если вы придете к разработчикам CMake с ошибкой и ошибкой, они скажут вам исправить это, прежде чем помогут вам. - person Alex Reinking; 01.07.2021