誰もCMakeファイルに "一度"パターンを適用する簡単な方法を知っていますか? C/C++では、以前は#pragmaが共通化されるまでヘッダファイルの先頭と末尾に#ifdef/#endifの組が必要でした。もちろん、CMakeで同じことをすることは可能ですが、明示的な条件文を必要としないならいいと思いました。cmakeファイルのinclude onceコマンドはありますか?
リビジョン:return()コマンドを実行する必要があります。そして、私はこのようなマクロを定義します:
macro(include_once)
if (INCLUDED_${CMAKE_CURRENT_LIST_FILE})
return()
endif()
set(INCLUDED_${CMAKE_CURRENT_LIST_FILE} true)
endmacro()
マクロを引数なしで使用してください。それはマクロなので、ファイル自体のインクルードコマンドではなく、インクルードコマンドからの戻り値です。
作成された変数には奇妙な名前がありますが、CMakeはこれを受け入れるようです。
でなければならないことあなたの設定は何ですか?複数の組み込みに対する保護が必要ですか?個人的には、私は通常、「メイン」のCMakeLists.txt(「インクルード」を取得しない)とヘルパー機能を持つモジュール(最初は複数のインクルードについては不平を言う)を持っています。私は、ここでユースケースが何であるかはよく分かりません。 – DevSolar
これが必要な場合はさまざまです。具体的には、私はサブディレクトリを持つトッププロジェクトを持っており、各サブディレクトリをスタンドアロンプロジェクトにするオプションが必要です。したがって、トッププロジェクトとすべてのサブディレクトリにはすべて共有定義ファイルが含まれています。定義ファイルが物を印刷すると、それは私が望むよりもはるかに多く印刷されます。それは処理のオーバーヘッドです。それで、はい、私はこれを求める良い理由があると思います。 –
サブディレクトリがスタンドアロンプロジェクトとして構築されている - 各プロジェクトの出力がスタンドアロンで完了する必要がある場合、または処理オーバーヘッドの影響(私が最も関与しているプロジェクトであっても無視できると考えられる場合)私はCMakeで処理していますが、私は1つのCMakeLists.txt(インクルード付き)からビルドしています。しかし、私はこれを休みにして、Tsyvarevの優れた答えを「方法」と「理由」の両方で指摘しています。 – DevSolar