2016-11-13 8 views
0

Microsoft Visual StudioとGCCの両方を使用してWindowsシステムでコンパイルしたいプロジェクトがあります。使用するコンパイラ(たとえば、COMPILER = VSまたはCOMPILER = GCC)を選択するための環境変数があります。最初の問題は、GCCの "includeオプション"が-Iで、Visual Studioのインクルードオプションが/ Iであるということです。Windowsには、変数をインクルードする変数を含むmakefileのパスが含まれています

COMPILER_INCLUDE_PATH = "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include" 
UCRT_INCLUDE_PATH  = "C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt" 
UM_INCLUDE_PATH   = "C:\Program Files (x86)\Windows Kits\8.1\Include\um" 
WINFAMILY_INCLUDE_PATH = "C:\Program Files (x86)\Windows Kits\8.1\Include\shared" 

INCLUDE_LIST = $(COMPILER_INCLUDE_PATH) $(UCRT_INCLUDE_PATH) $(UM_INCLUDE_PATH) $(WINFAMILY_INCLUDE_PATH) 

はだから今INCLUDE_LISTがある:私は含める必要があるパスのリストを構築今

ifeq ($(COMPILER), VS) 
    INCLUDE_DELIMITER = /I 
else 
    INCLUDE_DELIMITER = -I 
endif 

は、私はそれゆえ含める必要なオプションフラグを指定する変数を持っています引用符で囲まれた文字列のリスト(ウィンドウパスのスペースのため)これらの文字列のそれぞれにINCLUDE_DELIMITER(コンパイラ固有)を付加する変数を作成するにはどうすればよいですか?

私が試してみた:

INCLUDES = $(patsubst, "%", $(INCLUDE_DELIMITER)"%", $(INCLUDE_LIST)) 

なしavialに。私も試みました:

INCLUDES = $(foreach d, $(INCLUDE_LIST), $(INCLUDE_DELIMITER)$d) 

しかし、INCLUDE_LISTの各スペースが新しい単語として検出されました。

+0

あなたはcmakeの使用を検討しましたか? – wally

答えて

1

まず、あなたの質問のタイプミスではありませんが、構文は$(patsubst <pat>,<pat>,<words>)です。 patsubstキーワードの後に​​コンマはありません。

第2に、一般に、GNU makeはその関数内の空白を扱うことができません。 patsubst%各空白を意味$(INCLUDE_LIST)の膨張の単語がされるので、ワード分離:等最初"C:\Program、次Files、次(x86)\Microsoft、それらのいずれもパターン"%"と一致しないであろう。

あなたは代わりに、これを試みることができる:

$(patsubst "C:\Program,$(INCLUDE_DELIMITER)"C:\Program,$(INCLUDE_LIST)) 

第三に、あなたが本当に作るGNUへの引数にバックスラッシュを使用する必要はありません。幸いなことに、Visual Studioを含むほとんどのWindowsツールは、パス名区切り文字とバックスラッシュにスラッシュを使用します。私はそれらを使用するに切り替えることをお勧めします。

+0

はい、誤植を正しく識別しました。この解決策は、示唆通りに機能します。私はあるものがもう少しエレガントなもの(正規表現のサポートなど)が存在することを期待していましたが、今のところ私は動作するものと一緒に行かなければなりません。 – CudamanKevin

関連する問題