cmake: как создать ИМЕНОВАННУЮ пользовательскую цель С выводом, чтобы она не создавалась, если вывод есть

#makefile #cmake #target

Вопрос:

Я ищу способ в CMake добавить пользовательские целевые объекты, но это не перестраивается, если зависимости старше выходных данных. Проблема в том, что add_custom_target они всегда будут перестраиваться, потому что у них нет условия вывода, и проблема в add_custom_command том, что не создается цель.

Есть ли что-то, что делает и то, и другое (но не включает add_executable и add_library , поскольку мои цели не имеют ничего общего с компилятором).

Спасибо.

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

1. Общий подход в CMake к вызову add_custom_command , который содержит правильные ЗАВИСИМОСТИ и КОМАНДЫ, а затем вызов add_custom_target без КОМАНДЫ, и который просто зависит от add_custom_command ВЫВОДА. Таким образом, у вас будет именованная цель, которая перестраивает файлы только при изменении зависимостей (более новых).

2. Ах. Я понимаю. Поймите это сейчас. Cmake болезненно неинтуитивен.

3. «Cmake болезненно неинтуитивен». — Это довольно субъективно. Например, в отличие от Make, CMake полностью разделяет зависимости на уровне файлов , когда выходной файл перестраивается, если обновляется одна из его зависимостей, и зависимости на уровне цели , когда цель создается только после зависимой.

4. Да, но если подумать, CMake заставляет схему генерации процедур основываться на по сути декларативном описании зависимостей. И вместо того, чтобы использовать существующий язык, они изобрели какой-то очень непонятный язык. Который имеет все недостатки процедурного характера, но на самом деле не имеет преимуществ. Все это можно было бы решить с помощью библиотеки Python, что дало бы гораздо большую гибкость. Даже «читаемые» файлы CMake не так читаемы. И еще раз: описание зависимостей-это абсолютно декларативная задача.