Я пытаюсь добавить пользовательскую цель с CMake, который выполняет одну команду для каждого данного файла .cpp. Команда должна быть выполнена повторно только при изменении самого исходного файла или одного из включенных исходных файлов. AFAIK для достижения этого мне нужен список всех включенных файлов и добавить их в DEPENDS
вариант add_custom_command()
звонки, которые принадлежат моей пользовательской цели.
Так есть ли встроенный способ получить этот список включенных файлов?
Я знаю о IMPLICIT_DEPENDS
вариант add_custom_command()
функция, но она работает только для генераторов Makefile. Я хотел бы сделать эту работу для всех генераторов.
Спасибо за ваше время
Редактировать:
По запросу я опубликую некоторый код cmake, чтобы показать, чего я хочу достичь.
Я хочу добавить пользовательскую цель, которая запускает clang-tidy для всех указанных файлов .cpp. При поэтапном построении пользовательской цели команды clang-tidy должны быть перезапущены всякий раз, когда изменяется файл .cpp или один из его прямо или косвенно включенных заголовочных файлов. Точно так же, как перезапуски компилятора обрабатываются.
# ----------------------------------------------------------------------------------------
# mainTargetName The name of the target that shall be analyzed
# files A list of all the main targets .cpp files
#
function( addStaticAnalysisTarget mainTargetName files )
set(targetName runStaticAnalysis_${mainTargetName})
set(command "clang-tidy-4.0 -checks=* -p ${CMAKE_BINARY_DIR}")
foreach( file ${files} )
get_filename_component( baseName ${file} NAME_WE)
set(stampFile ${CMAKE_CURRENT_BINARY_DIR}/analyze_${baseName}.stamp )
set(fullFile ${CMAKE_CURRENT_SOURCE_DIR}/${file})
set(commandWithFile "${command} ${fullFile}")
separate_arguments_for_platform( commandList ${commandWithFile})
add_custom_command(
OUTPUT ${stampFile}
DEPENDS "${fullFile}"IMPLICIT_DEPENDS CXX "${fullFile}"COMMAND ${commandList}
COMMAND cmake -E touch "${stampFile}" # without creating a file as a touch-stone the command will always be re-run.
WORKING_DIRECTORY ${CPPCODEBASE_ROOT_DIR}
COMMENT "${commandWithFile}"VERBATIM
)
list(APPEND stampFiles ${stampFile})
endforeach()
set_source_files_properties(${stampFiles} PROPERTIES GENERATED TRUE) # make the stamp files known to cmake as generated files.
add_custom_target(
${targetName}
DEPENDS ${stampFiles}
)
endfunction()
Проблема в том, что это не похоже на работу. Когда я изменяю включенные файлы, clang-tidy не запускается повторно для затронутых файлов.
Я использовал генератор «Unix Makefile» для этого примера, поэтому он должен работать по крайней мере с make. Любые намеки, почему это не так?
Я надеюсь, что когда-нибудь я смогу добиться желаемого поведения для всех генераторов, каким-то образом получая файловые зависимости во время cmake, а затем добавляя их в список » ‘DEPENDS’ » ‘. Но сканирование зависимостей должно выполняться при каждом запуске команды, поэтому его нельзя выполнить во время выполнения команды cmake. Это означает, что сканирование должно быть реализовано с помощью cmake, чего в настоящее время нет.
Парень с похожими проблемами:
https://gitlab.kitware.com/cmake/cmake/issues/16830
Изменить 2:
Я думаю, что проблема в том, что опция IMPLICIT_DEPENDS не работала, была в том, что я не использовал правильные имена файлов. Я изменил это во фрагменте кода, но я еще не проверял, работает ли он в проекте.
Я думаю, что ответ на мой вопрос …
Нет, вы не можете использовать сканер зависимостей cmakes в коде cmake.
Это имеет смысл, потому что эта проблема не может быть решена во время cmake, потому что зависимости файла .cpp могут измениться без повторного запуска cmake.
Проблема должна быть решена в самом cmake во время выполнения. Это делается при использовании IMPLICIT_DEPENDS
вариант.
Кроме того, я попытался решить проблему, которой у меня на самом деле не было, потому что на данный момент я все равно могу запускать только clang-tidy на linux. Тем не менее, clang-tidy может стать доступным и в Windows, и тогда у меня снова может возникнуть проблема.
Чтобы суммировать комментарии:
Тамбре заявил, что CMake не является компилятором и поэтому не может этого сделать.
Я думаю, что это неправильно. Согласно этому статья, CMake может анализировать зависимости cpp include, так как make не имеет такого искателя зависимостей. Это было для меня новостью, но я в основном живу на Windows, поэтому я не очень знаком с make. Также возможно, что в это время make будет расширен для выполнения собственного поиска зависимостей. Также это объясняет, почему IMPLICIT_DEPENDS
опция доступна только для марки.
Флориан отметил, что нет необходимости создавать собственную настраиваемую цель для запуска clang-tidy. Вместо этого можно использовать CXX_CLANG_TIDY
Свойство target для запуска clang-tidy для каждого файла после его компиляции. Это означает, однако, что статический анализ нельзя отделить от сборки, что может привести к недопустимому времени сборки.
Здесь cmake -E cmake_depends
командная строка, которая может быть использована для получения зависимостей во время cmake. Но, как указано выше, я ошибочно думал, что мне нужны зависимости во время создания, а мне они нужны во время выполнения.
IMPLICIT_DEPENDS
параметры не работали, потому что у меня была ошибка в моем коде cmake.
Других решений пока нет …