私は、指定された.cppファイルごとに1つのコマンドを実行するCMakeでカスタムターゲットを追加しようとしています。このコマンドは、ソースファイル自体またはインクルードされたソースファイルのいずれかが変更されたときにのみ再実行する必要があります。これを達成するAFAIK私はすべてのインクルードファイルのリストを必要とし、それらを私のカスタムターゲットに属するadd_custom_command()
コールのDEPENDS
オプションに追加します。CMakeのcppファイルdependency-scannerをcmakeコードで手動で使用できますか?
それで、インクルードされたファイルのリストを取得する組み込みの方法はありますか?
私はadd_custom_command()
機能のIMPLICIT_DEPENDS
オプションについて知っていますが、それはMakefileジェネレータでのみ機能します。私はすべての発電機のためにこの仕事をしたいと思います。
編集:私は私が達成したいかを示すためにいくつかのcmakeのコードをポストする要求として
。 私は、指定されたすべての.cppファイルに対してclang-tidyを実行するカスタムターゲットを追加したいと思います。カスタムターゲットを段階的に構築するときは、.cppファイルまたはその直接的または間接的にインクルードされたヘッダーファイルのいずれかが変更されるたびにclang-tidyコマンドを再実行する必要があります。ちょうどコンパイラの再実行のように処理されます。
# ----------------------------------------------------------------------------------------
# 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オプションが働いていなかった問題だったと思います。私はコード内でそれを変更しましたが、プロジェクトで動作するかどうかはまだ検証していません。
このようにして、ソースファイル自体にどのようなファイルが含まれているのかをCMakeに見せてもらいたいですか? – tambre
説明のためだけです:「cmake -E cmake_depends」の呼び出しを「CMakeのcppファイル依存スキャナ」と呼んでいますか? – Florian
@tambre正確には – Knitschi