CMake / Ninja: рекурсивная «очистка» выходных каталогов, когда содержимое неизвестно ...? - PullRequest
0 голосов
/ 12 декабря 2018

Коллеги!

Мы используем "cmake" для нашей системы сборки и регрессии.Некоторые пользователи используют «ninja», а другие «make» для базового генератора cmake.

У нас есть несколько пользовательских целей, которые вызывают внешние инструменты, которые генерируют DIRECTORIES с различными подкаталогами и файлами.

При попытке «очистить» пользователи Ninja получают сообщение об ошибке:

ninja: error: remove(<dirABC>/<subdirXYZ>): Directory not empty
ninja: error: remove(<dirABC>): Directory not empty
...

Я перечисляю выходной каталог как выходной файл моей пользовательской цели сборки («dirABC» выше).Это не позволяет рекурсивное удаление.

Список файлов и имен подкаталогов (ниже «dirABC») не может быть известен во время настройки или генерации.Имена на самом деле известны только после запуска.

Мой вопрос:

Как пользователи-ниндзя могут удалить эти выходные каталоги и их содержимое при запуске "ninja clean"?

Обратите внимание, что у пользователей "make" нет этой проблемы.Я помечаю каталог с помощью свойства "ADDITIONAL_MAKE_CLEAN_FILES".Make делает "rm -rf" в каталоге вывода верхнего уровня, и мы чисты.Ключ в том, что «-r»!

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

1 Ответ

0 голосов
/ 19 декабря 2018

Способ, которым я решил это, состоял в том, чтобы определить НОВУЮ цель "Очистить":

if(${CMAKE_GENERATOR}" STREQUAL "Ninja")
  add_custom_target(Clean COMMAND ninja clean)
else()
  add_custom_target(Clean COMMAND ${MAKE} clean)
endif()

Теперь у меня есть первоклассная цель высшего уровня, к которой я могу прикрепить вещи:

…
  add_dependencies(Clean whatever-clean)
…

Когда пользователь вводит «Очистить ниндзя» или «Очистить gmake», сначала запускается цель «what-clean», а затем запускается «очистка» по умолчанию.

...