2011-12-19 33 views
20

CMakeのコマンドラインでプリプロセッサマクロを設定しようとしました。CMakeでコマンドラインからC++プリプロセッサマクロを定義するには?

set generator="Visual Studio 8 2005" 
set params=-D MY_MACRO=1 
cmake.exe -G %generator% %params% ..\some_project 

を私はコンパイル時には、どちらも定義されていないだも私はそれが形で存在だCMakeCache.txtを除き、すべてでCMakeので生成されたファイルに名前MY_MACROを見つけることができます:私が試した

MY_MACRO:UNINITIALIZED=1 

どうすればいいですか?あなたがいないに十分な理由を持っていない限り、あなたはADD_DEFINITIONS(<name>=<value>[, ...])を使用する必要があります-D CMAKE_CXX_FLAGS=/DMY_MACRO=1

+1

これで解決したら、私は解決策に興味があります –

+1

@TimMeyer:いいえ、明らかに不可能です。 – ybungalobill

+0

@ybungalobill: CMakeLists.txtで定義されている既存のマクロのみを変更することはできますが、コマンドラインからマクロを挿入することはできません。 また、* set params = -D MY_MACRO = 1 *は設定する必要がありますparams = -DMY_MACRO = 1 * – NeoH4x0r

答えて

6

はこれを試してみてください。

ちょうどあなたのCMakeLists.txtに次の行を追加します。

ADD_DEFINITIONS("MY_MACRO=1") 

CMakeのは(それが-D<name>=<value>、または/D<name>=<value>こと)スイッチの構文の世話をします。条件が続く

OPTION(DEFINE_MACRO "Option description" ON) # Enabled by default 

+3

実際には半分の動作です。それは 'CMAKE_CXX_FLAGS'の値を上書きします。私は '-D CMAKE_CXX_FLAGS ="/DMY_MACRO = 1 $ {CMAKE_CXX_FLAGS} "を試しましたが、' $ {CMAKE_CXX_FLAGS} 'は展開されません。誰でもこれを修正する方法を知っていますか? – ybungalobill

+0

コマンドラインで二重引用符で囲まれた文字列は、bashによって展開されます。 CMAKE_CXX_FLAGSという名前の環境変数がないので、bashはcmakeがそれを見る前に ""に展開します。代わりに一重引用符を使用してください。 – Tolli

+0

@Tolliもうまくいかないようです。 bashが変数を展開するのを防ぎますが、cmakeは変数を展開しません。リテラル値 '/ DMY_MACRO = 1 $ {CMAKE_CXX_FLAGS} 'を直接コンパイラに渡します。 – pavon

-5

+13

CMakeLists.txtを変更することはコマンドラインソリューションとしてカウントされません。そして、はい、私はこれをしない理由があります。私はビルドプロセスを自動化しなければならず、ソースを変更してはいけません。 – ybungalobill

+0

スペースは残念です。私はコマンドラインソリューションを追加したかったのですが、それはあなたが探していたものではありませんでした。それにもかかわらず、コマンドラインから実行することは、あなたの一日を悲惨なものにするだけです。 – hiobs

+0

コマンドラインは、GUIアプリケーションよりも有用であり、時にはそうでない場合もあります。私は本当にあなたの日が悲惨なものになると言うことができるとは思わないと思います。本当に状況、ユーザーのスキル、個人の好みによって決まります。 – NeoH4x0r

14

良い代替はcmakeのオプションを定義することです

IF(DEFINE_MACRO) 
    ADD_DEFINITIONS(-DMACRO) 
ENDIF(DEFINE_MACRO) 

を次に、あなたが使用してcmakeを使用してコマンドラインを介してON/OFF、そのオプションを有効にすることができます-Dフラグ。例:

cmake -DDEFINE_MACRO=OFF .. 

コンパイラが定義権を受信して​​いる、あなたは冗長モードで作る呼び出すと定義されているマクロのかをチェックすることができることを確認する:

make VERBOSE=1 

また、これは良い解決策でありますcmakeオプションが変更されたときにmakeがコードを再コンパイルするためです。

+2

これはCMakeListの修正を必要とするので、解決策ではありません(-1)。 – ybungalobill

関連する問題