2

C++ プロジェクトで cmake を使用しています。GCC でプリコンパイル済みヘッダーを使用したい。

cmake一度実行してから、実行時にmake次のアクションを実行したい:

  1. ソース ツリー全体でカスタム ツール (python スクリプト) を実行します。一部のサブディレクトリに precompiled.h ヘッダーを生成します。その目的は、#include の *.h と *.cpp をスキャンし、それらを共通のプリコンパイル済み.h ファイルに移動することです。
  2. g++ -c precompiled.h -o precompiled.h.gchステップ 1 の後に precompiled.h ファイルが変更された場合にのみ、GCC のプリコンパイル済みヘッダー ( ) を生成します。
  3. 古いターゲットをビルドします(ステップ2の後。.gchファイルを使用したいため)

依存関係を追加することができたので、ターゲットをビルドするたびに、python スクリプトのターゲットが実行されます (すべてのターゲットが単一の global_init ターゲットに依存する必要があるため、これは醜いです)。また、python スクリプトを変更できるので、不要な場合は precompiled.h を変更しません。

しかし、次に何をすべきかわかりません。カスタムスクリプトを実行する必要があることをcmakeに伝え、その後、precompiled.h.gchを作成する必要があるかどうかを判断する方法はありますか? これで常にビルドされます (このファイルには多くの #include が含まれているため、時間がかかります)。基本的:

  1. Python スクリプトを実行 -> precompiled.h が更新される場合があります
  2. precompiled.h タイムスタンプを調べて、それが新しい場合 -> precompiled.h.gch をビルドします
  3. 標準のコンパイル手順

私は多くの場所を見てきましたが、依存関係を計算するcmake(およびmake)の方法は、このタスクを達成するには弱すぎるようです。

この質問 では、lazycpp が実行された後に常に遅延 C++コンパイルが発生します。私の場合、これは最適ではありません。

4

1 に答える 1

7

次の CMake コマンドは、プロジェクトの出発点として役立ちます。

add_custom_target(scanner COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/scanner.py"
    COMMENT "Scanning include files ..."
    WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")

このコマンドは、ステップ 1 をカバーします。これにより、python スクリプトが呼び出さprecompiled.hれ、CMAKE_CURRENT_SOURCE_DIR.

add_custom_command(OUTPUT precompiled.h.gch
    COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS} 
    -c "${CMAKE_CURRENT_SOURCE_DIR}/precompiled.h" -o precompiled.h.gch
    DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/precompiled.h"
    IMPLICIT_DEPENDS CXX "${CMAKE_CURRENT_SOURCE_DIR}/precompiled.h")

add_custom_target(generate_precompiled DEPENDS
    "${CMAKE_CURRENT_BINARY_DIR}/precompiled.h.gch")

add_dependencies(generate_precompiled scanner)

これらのコマンドはステップ 2 をカバーします。プリコンパイル済みヘッダーは、インクルードする他のヘッダーにprecompiled.h暗黙に依存するカスタム コマンドで生成さprecompiled.hれます。 precompiled.h.gchディレクトリに生成されCMAKE_CURRENT_BINARY_DIRます。プリコンパイル済みヘッダーの生成はprecompiled.hPython スクリプトで更新する必要があるため、 target にターゲット レベルの依存関係を追加しますscanner

include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR})

add_executable(main main.cpp)

set_target_properties(main PROPERTIES COMPILE_FLAGS "-include precompiled.h -H")

add_dependencies(main generate_precompiled)

これらのコマンドは、実行可能ファイルを生成する標準のコンパイル手順を追加しますmain-includeプリコンパイル済みヘッダーは、gcc のスイッチでデフォルトのヘッダーとして含まれています。CMAKE_CURRENT_BINARY_DIRを含むprecompiled.h.gchがインクルード ディレクトリとして追加されます。precompiled.h がインクルードされると、gcc はprecompiled.h.gchそこから取得します (プリコンパイル済みヘッダーの使用を参照)。

最後に、対象の依存関係generate_precompiledにより、プリコンパイル済みヘッダーが必要に応じて更新されます。

于 2011-07-11T20:59:07.450 に答える