2017-04-21 8 views
4

私は、指定された.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オプションが働いていなかった問題だったと思います。私はコード内でそれを変更しましたが、プロジェクトで動作するかどうかはまだ検証していません。

+0

このようにして、ソースファイル自体にどのようなファイルが含まれているのかをCMakeに見せてもらいたいですか? – tambre

+0

説明のためだけです:「cmake -E cmake_depends」の呼び出しを「CMakeのcppファイル依存スキャナ」と呼んでいますか? – Florian

+0

@tambre正確には – Knitschi

答えて

0

私は私の質問への答えはありません、あなたはcmakeのコードに依存スキャナをcmakes使用することはできません...

だと思います。

cmake時にこの問題を解決することはできません.cmakeを再実行することなく.cppファイルの依存関係が変更される可能性があるためです。 問題はmake時にcmake自身で解決する必要があります。これは、IMPLICIT_DEPENDSオプションを使用するときに行われます。

また、私は実際には持っていない問題を解決しようとしました。この時点では、Linux上ではいつでもclang-tidyを実行できるからです。しかし、clang-tidyもウィンドウ上で利用できるようになるかもしれません。そして、私は再び問題を抱えているかもしれません。コメントを合計する

アップ:

  • タンブレはcmakeのは、コンパイラではありませんので、それを行うことができないと述べました。 これは間違っていると思います。このarticleによると、makeはそのような依存サーチャ自体を持たないので、CMakeはcppインクルード依存関係を解析できます。それは私にとってはニュースだったが、私はほとんどがWindows上に住んでいるので、私はそれに精通していない。その間にmakeが独自の依存関係検索を行うように拡張された可能性もあります。これはなぜIMPLICIT_DEPENDSオプションがmakeでのみ利用できるのかを説明しています。

  • フロリアンは、打ち鳴らす、きちんと実行するための独自のカスタムターゲットを作成する必要がないことを指摘しました。その代わりに、CXX_CLANG_TIDYターゲットプロパティを使用して、コンパイル後に各ファイルに対してclang-tidyを実行することができます。しかし、これは、静的解析をビルドから切り離すことができず、ビルド時間が許容できなくなる可能性があることを意味します。

  • cmakeの時の依存関係を取得するために使用することができcmake -E cmake_dependsコマンドラインは、あります。しかし、上記のように、私は誤って、私は実行時にそれらを必要としながら、私はcmake時の依存関係を必要と思った。私は私のcmakeのコードに誤りがあったので

  • IMPLICIT_DEPENDSオプションは動作しませんでした。

関連する問題