Добавить цель во все вложенные папки

#cmake

#cmake

Вопрос:

Я работаю над библиотечным проектом, построенным следующим образом

 Base/
  CMakeLists.txt
  src/
  tools/
     CMakeLists.txt
  tests/
     CMakeLists.txt
  debug/
  release/
 

Main CMakeLists.txt , in Base/ содержит цель для создания библиотеки, источник которой находится внутри src/ , и у меня есть настройка для создания debug/ и release/ и вызова cmake -DCMAKE_RELEASE_TYPE=<DEBUG|RELEASE> .. для получения структур сборки.

Это приводит к следующей структуре

 debug/
   Makefile
   tests/
      Makefile
   tools/
      Makefile
 

Программы встроены tools/ и tests/ создают выходные файлы, и я пытаюсь создать clean_output цель для каждого Make-файла в созданной структуре сборки.

Я использовал add_custom_target(clean_output rm -rf *.ext) , но он не переносится в файлы Makefile в tests/ и tools/ . Я попытался добавить ту же команду в CMakeLists.txt файлы в этих каталогах, но я получаю сообщение об ошибке, что я не могу определить цель, уже определенную в том же проекте.

Я пытался использовать WORKING_DRECTORY в сочетании с CMAKE_CURRENT_LIST_DIR , CMAKE_CURRENT_BINARY_DIR но безрезультатно.

Кто-нибудь знает, как определить пользовательскую цель во всех каталогах проекта?

РЕДАКТИРОВАТЬ: я не пытаюсь добавлять файлы в стандартную clean цель. Я пытаюсь создать дополнительную clean_output цель для удаления некоторых файлов, сохраняя при этом исполняемые файлы на месте.

Комментарии:

1. Cmake имеет встроенную чистую цель. Попробуйте использовать set_directory_properties(directory ADDITIONAL_MAKE_CLEAN_FILES files)

2. Но это все равно приведет к удалению исполняемых файлов, верно? Я пытаюсь настроить цель так, чтобы очищать только выходные файлы. Перед переносом моего проекта на cmake у меня было три разные цели, clean , clean_all и clean_output .

Ответ №1:

Вы можете указать рабочий каталог и несколько команд для выполнения в одной цели. Кстати, вы можете использовать cmake -E remove_directory :

 add_custom_target(
    clean_output
    COMMAND
    "${CMAKE_COMMAND}" -E remove_directory "${CMAKE_CURRENT_LIST_DIR}/directory/with/exts"
    COMMAND
    "${CMAKE_COMMAND}" -E remove_directory "${CMAKE_CURRENT_LIST_DIR}/other-dir/with/exts"
    WORKING_DIRECTORY
    "${CMAKE_CURRENT_LIST_DIR}"
)
 

Комментарии:

1. Я переписал его, используя CMAKE_CURRENT_BINARY_DIR , и он работает для корневого каталога сборки, но он по-прежнему не добавляет цели в Make-файлы в подкаталогах (я отредактировал подробности о том, как это выглядит). Нет ли способа добавить цель ко всем Make-файлам?

2. @Lexiel Я сомневаюсь, что это возможно, потому что cmake разработан как кроссплатформенный инструмент. И то, что вы просите, применяется только к Makefile, но это не имеет смысла для такого генератора, как Xcode . Кстати, у AFAIK make есть -C опция, так что вы пробовали make -C .. targetname ?

3. Спасибо. make -C .. clean_output это то, что я делаю прямо сейчас, я надеялся иметь локальные цели в структуре. Тем более, что структура каталогов будет усложняться по мере развития проекта. Но если это невозможно в cmake, я буду искать обходной путь вместо этого.

4. @Lexiel I'll look for a workaround instead ИМХО, вам нужно взглянуть на этот вопрос под другим углом. Может быть, лучше организовать этот запуск в test ( add_test ) или добавить опцию --clear-output в ваше приложение для тестирования (?)

Ответ №2:

Если я понимаю ваши вопросы, вы можете выполнить то, что хотите, с помощью set_directory_properties ADDITIONAL_MAKE_CLEAN_FILES

Комментарии:

1. Это полезно знать, но это не совсем то, что я пытаюсь сделать. Я отредактировал свой вопрос, чтобы сделать его более понятным.