2016-05-10 18 views
2

これについてはまだ質問はないでしょうが、私は見つけられません。とにかく私はmakefileを書いていますが、envrionment変数CCで設定されたプログラムをコンパイルするためにGNUコンパイラかインテルコンパイラが使用されているかによって、異なるCFLAGSを設定する条件文が必要です。Makefile:CC/CXX/FC値に基づいてコンパイラフラグを変更してください。

は今、GNUでのセクションでは、この上でマニュアルを作るがあり、そしてそれは、次のような何かを言う:

https://ftp.gnu.org/old-gnu/Manuals/make-3.79.1/html_chapter/make_7.html

ifeq ($(CC),gcc) 
    libs=$(libs_for_gcc) 
else 
    libs=$(normal_libs) 
endif 

(OK設定のライブラリではないフラグが、何でも、同じ考え方)。これは実際にはこれを行うための愚かな方法なので、条件付きで動作する方法の例です。 CC変数には、gcc以外のあらゆる方法が含まれていても、GNU Cコンパイラを効果的に使用することができます。 CCでコンパイラへの絶対パスを指定するだけでも、この例は分かりません。

これを行うには、賢明で堅牢な方法は何ですか?また、重要な場合は、C++コンパイラとFortranコンパイラの選択についても同じことをしたいと思います。

+0

最も賢明で強固な方法(IMHO)は、CMakeなどのmakefileコンパイラを使用してmakefileを生成することです。 CMake(および他の人)は、さまざまなプラットフォームとツールセットを認識しています。 –

+0

しかし、CMakeを使用しても、コンパイラに応じて追加のコンパイラフラグ(または異なるライブラリなど)を設定する場合は、コンパイラ(通常はCMAKE_CXX_COMPILER_IDに従っています)を検出する必要があります。だから、コンパイラの検出を完全に取り除くことができないかもしれません(例えば、他のコンパイラが認識しないGCC/CLangで "-Wall -Wextra -Werror"を強制したい場合など)。しかし、もし私がこのオプションを持っていれば、CMakeを使うことも好きです。 – axalis

+0

ええCMakeは間違いなく優れていますが、実際にはいくつかのレガシーコードを扱っています。既存のmakefileを修正して、簡単に壊れないようにしたいだけです。 –

答えて

2

これはあまり堅牢ではないことは間違いありません。より堅牢な方法は、findstringコマンドを使用することができます:

ifneq (,$(findstring gcc,$(CC))) 
    libs=$(libs_for_gcc) 
else 
    libs=$(normal_libs) 
endif 
+0

うん、これのようなものは、少なくとも改善の次のステップと思われる:)。しかし、これは、完全なautotools/cmakeタイプのシステムに行かないとできない最高のものですか? –

関連する問題