web-dev-qa-db-ja.com

CMakeを使用して特定のターゲットのC#defineを作成するにはどうすればよいですか?

私は今少し愚かだと感じています。最近、いくつかの小さなプロジェクトをCMakeを使用するように変換した後、いくつかの「Platform_Config.h」ファイルも削除することにしました。これらのファイルには、#define USE_NEW_CACHEや制御コンパイルなどのいくつかの前処理ディレクティブが含まれています。

これらの定義をCMakeで制御するように「変換」するにはどうすればよいですか?理想的には、これらの「キャッシュ」変数を使用することで、ユーザーは簡単に編集できます。

19
Marcus Riemer

2つのオプションがあります。 add_definitions メソッドを使用して、定義をコンパイラフラグとして渡すことができます。プロジェクトのどこかcmakelists.txt:

add_definitions( -DUSE_NEW_CACHE )

CMakeは、-Dプレフィックスがコンパイラの正しいフラグに変換されていることを確認します(msvcの場合は/ D、gccの場合は-D)。

または、 configure_file を確認してください。これはより複雑ですが、Platform_Configファイルを使用した元のアプローチに適している場合があります。

元のPlatform_Config.hと同様の入力ファイルを作成し、それに「#cmakedefine」行を追加できます。

Platform_Config.h.inを呼び出しましょう:

// In Platform_Config.h.in
#cmakedefine USE_NEW_CACHE
// end of Platform_Config.h.in

その後実行するとき

configure_file( ${CMAKE_SOURCE_DIR}/Platform_Config.h.in ${CMAKE_BINARY_DIR}/common/Platform_Config.h )

ビルドディレクトリに新しいPlatform_Configファイルが生成されます。 cmakedefineでもあるcmakeの変数は、生成されたファイルに存在し、他の変数はコメントアウトされるか、定義されません。

もちろん、ソースファイルに含めるときに、実際に生成されたファイルが正しく見つかることを確認する必要があります。

22
André

optionコマンドはあなたが探しているものを提供するかもしれません。
ターゲットのCOMPILE DEFINITIONSプロパティと一緒に使用すると、完了したと思います。ターゲットにプロパティを設定するには、コマンドset target propertiesを使用します。

option(DEBUGPRINTS "Prints a lot of debug prints")
target(myProgram ...)
if(DEBUGPRINTS)
set_target_properties(myProgram PROPERTIES COMPILE_DEFINITIONS "DEBUGPRINTS=1")
endif()

編集:

例で書いたオプションは、CMakeGUIのチェックボックスとして表示されます。

13
0xbaadf00d

ターゲットごとに定義を設定する場合:2.8.11以降、 target_compile_definitions を使用できます。

以前のバージョンでは、以前に設定した定義が上書きされるため、set_target_propertiesをそのまま使用することはおそらく望ましくありません。代わりに、最初にget_target_propertyを呼び出してから、前の値とマージします。 add_target_definitionsここ を参照してください。

3