2016-01-22 6 views
5

cmakeは、プリプロセッサが定義されているかどうかをテストできません。例:cmake:プリプロセッサが定義されているかどうかを確認する方法

cmake_minimum_required(VERSION 2.8.9) 
project (cmake-test) 
add_definitions(-DOS=LINUX) 

if(NOT <what condition goes here?>) 
    message(FATAL_ERROR "OS is not defined") 
endif() 

次のテストは動作しません:

if (NOT COMMAND OS) 
if (NOT DEFINED OS) 
if (NOT OS) 

私はそれがset()を使用し、普通のcmake変数をテストして、プリプロセッサマクロを定義することによって、仕事を得ることができます。例:変数/プリプロセッサは、最終的な実装では、これらは外部ファイルから来るので、それはだ、同じファイル内にある場合、私はそれをテストする必要がある理由の場合

set(OS LINUX) 
if (OS) 
    add_definitions(-DOS=${OS}) 
else() 
    message(FATAL_ERROR "OS is not defined") 
endif() 

、あなたは迷っていますメインCMakeFile.txt例:中include編:

include(project_defs.txt) 
if (OS) 
    .... 
+0

プリプロセッサとはどういう意味ですか? CMakeは1つも持っていません... – usr1234567

+0

CMakeは、システムを記述するいくつかの変数を自動的に定義します。したがって、OS依存コードをインクルードするためにこれらの変数をチェックすることができます( 'if'コマンドで)。 [情報を提供する変数](https://cmake.org/cmake/help/v3.0/manual/cmake-variables.7.html#variables-that-provide-information)を参照してください。 – Tsyvarev

+0

@ usr1234567プリプロセッサは、 'gcc'の' -D'オプションで定義された変数を意味しました( '#define'と同じです)。 –

答えて

1

通常、コンパイラに渡されるすべての定義は、CMakeので制御されています。それはあなたが

option(SOMEFEATURE "Feature description" ON) 

または

set(OS "" CACHE STRING "Select your OS") 

でCMakeの変数を作成し、あるユーザーはcmake -D OS=DOSを介して、またはCMakeのGUIでそれらを設定します。次に、if()演算子を条件付きでadd_definitions()のコンパイラコマンドラインに使用できます。

UPDATE:

あなたが本当にプリプロセッサフ​​ラグにアクセスしたい場合は、COMPILE_DEFINITIONS targetプロパティがあります。

get_target_property(OUTVAR target COMPILE_DEFINITIONS) 
+1

それでは私が言及した2番目のアプローチはおそらくこれを行う唯一の方法でしょう。 'cmake'が' add_definitions'によって設定されたものをテストすることができればいいでしょう。 –

+0

@MandeepSandhu更新された回答を参照してください。 – arrowd

+0

更新いただきありがとうございます。私は 'COMPILE_DEFINITIONS'を' add_definitions() 'のためのドキュメントとして参照しました。しかし、私は指定された定義をフェッチすることができませんでした( 'get_target_property'を使用してあなたの提案を試みましたが、代わりに' NOTFOUND'を得ました)。私は 'cmake 2.8.12.2'を使用しています –

1

これはarrowdによる回答を完了するためです。

また、上記のようにCOMPILE_DEFINITIONSオプションをarrowdで失敗しました。 CMakeののドキュメント以下

は、少なくともバージョン3.xのために、それはあなたがCMakeのでadd_definitions()を呼び出すとき、それはCOMPILE_DEFINITIONS ディレクトリプロパティに定義を追加することが判明しました。

したがって、あなたのコードごとに以下を定義していると言うことができます:

add_definitions(-DOS=LINUX) 

変数に追加定義で文字列を取得するには、「MYDEFS」あなたはCMakeの中に以下の行を使用することができます。

get_directory_property(MYDEFS COMPILE_DEFINITIONS) 
MESSAGE(STATUS "Compile defs contain: " ${MYDEFS}) 

${MYDEFS}で探している定義が存在するかどうかを確認できます。たとえば

if(MYDEFS MATCHES "^OS=" OR MYDEFS MATCHES ";OS=") 
    MESSAGE(STATUS "OS defined") 
else() 
    # You can define your OS here if desired 
endif() 
関連する問題