#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. Это полезно знать, но это не совсем то, что я пытаюсь сделать. Я отредактировал свой вопрос, чтобы сделать его более понятным.