2017-02-16 6 views
0

私は別のコンパイラフラグで複数回ビルドする必要があるバイナリを持っています。私はまた、各OBJECTS_xのフラグを変更するには、ルールを定義メイクファイルは同じソースファイルから、異なるフラグで

OBJECTS_A := $(addprefix $(OBJFOLDER)/, $(SOURCES:.cpp=.a.o)) 
OBJECTS_B := $(addprefix $(OBJFOLDER)/, $(SOURCES:.cpp=.b.o)) 
OBJECTS_C := $(addprefix $(OBJFOLDER)/, $(SOURCES:.cpp=.c.o)) 

:したがって、私は何かを述べてMakefileを持って

$(OBJECTS_B): DEFINES+=-D_B 
$(OBJECTS_C): DEFINES+=-D_C 

をし、問題が発生した場所です。私が述べる場合別のターゲットとして、

$(OBJFOLDER)/%.a.o: %.cpp 
    $(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c $< -o [email protected] 

$(OBJFOLDER)/%.b.o: %.cpp 
    $(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c $< -o [email protected] 

$(OBJFOLDER)/%.c.o: %.cpp 
    $(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c $< -o [email protected] 

すべての作品。私は1つにすべてのルールをマージする場合は、最初に評価されます。私は予行演習に乗ることはAOオブジェクトが構築されているだけで$(OBJFOLDER)/%ということですが、リンクルールに

$(OBJFOLDER)/%.a.o $(OBJFOLDER)/%.b.o $(OBJFOLDER)/%.c.o: %.cpp 
    $(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c $< -o [email protected] 

各バイナリはそのオブジェクトを必要とします(したがって、bとcのバイナリはビルドに失敗します)。

アイデア? ありがとうございました!あなたはこのsecondary expansionを使用して達成することができます

+0

複数のターゲットパターンを持つパターンルールは、あなたが経験してきたように、正確に意味:それはレシピの単一呼び出しが_all_ターゲットをビルドするために期待し、同じ1つの汎用パターンルール(OBJFOLDER)/%.o: %.cppがあなたのターゲットのすべてを構築することができます。この方法。これは、プログラムが複数の出力ファイルを作成するときに使用されます。 https://www.gnu.org/software/make/manual/html_node/Pattern-Intro.html(最後の段落) – MadScientist

答えて

3

:これは、これを行うのは非常に慣用的な方法ではないことを

.SECONDEXPANSION: 
$(OBJFOLDER)/%.o: $$(basename $$*).cpp 
     $(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c $< -o [email protected] 

注意を、より一般的なdefine/call/evalコンボは、あなたの最初のようにルールを生成するために使用することができます解決策:

VARIANTS=a b c 

DEFINES_FOR_a= 
DEFINES_FOR_b=-D_B 
DEFINES_FOR_c=-D_C 

define make_target = 
$$(OBJFOLDER)/%.$(1).o: %.cpp 
     $$(COMPILER) $$(CFLAGS) $$(INCFOLDER) $$(DEFINES_FOR_$(1)) -c $$< -o [email protected] 

endef 

$(eval $(foreach variant,$(VARIANTS),$(call make_target,$(variant)))) 
+0

なぜターゲット固有の変数の割り当てはもはや機能しませんか? – MadScientist

+0

私の悪い、それは完璧に動作し、私は答えを編集した –

0

もう一つの方法は、ソースファイルへのシンボリックリンクを作成して、異なるフラグを有するものをコンパイルすることです。

OBJECTS_A := $(SOURCES:%.cpp=$(OBJFOLDER)/%.a.o) 
OBJECTS_B := $(SOURCES:%.cpp=$(OBJFOLDER)/%.b.o) 
OBJECTS_B := $(SOURCES:%.cpp=$(OBJFOLDER)/%.c.o) 
$(OBJECTS_B): DEFINES+=-D_B 
$(OBJECTS_C): DEFINES+=-D_C 

%.a.cpp : %.cpp 
    ln -s $< [email protected] 

%.b.cpp : %.cpp 
    ln -s $< [email protected] 

%.c.cpp : %.cpp 
    ln -s $< [email protected] 

$(OBJFOLDER)/%.o: %.cpp 
    $(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c -o [email protected] $< 
関連する問題