2012-05-08 12 views
0

私はメイクファイルで指定してるライブラリフォルダのリストがあります:私も地元のOBJにそれぞれ1をコンパイルするための規則の数を持っているのMakefile - 異なるターゲットフォルダにコンパイル

LIBRARIES = Ethernet    \ 
      SPI      \ 
      SD 

をフォルダ:私のプロジェクトの

obj/SPI/%.cpp.o: $(LIBS_DIR)/SPI/%.cpp 
    @echo "Compiling $<" 

obj/SD/%.cpp.o: $(LIBS_DIR)/SD/%.cpp 
    @echo "Compiling $<"  

obj/Ethernet/%.cpp.o: $(LIBS_DIR)/Ethernet/%.cpp 
    @echo "Compiling $<"  

(それぞれ独自のサブフォルダを使用しています)。これらのルールを$(LIBRARIES)から自動的に生成するには、どうすればこのように複製する必要はありませんか?

答えて

4

あなたはただ行うことができます:上記%キャプチャdir/src一部で

obj/%.cpp.o : $(LIBS_DIR)/%.cpp 
    g++ -c -o [email protected] ${CPPFLAGS} ${CXXFLAGS} $< 

を。

あなたはそれがsecondary expansionメイク機能で行うことができ、自動的に作成される出力ディレクトリを希望した場合:

.SECONDEXPANSION: 

obj/%.cpp.o : $(LIBS_DIR)/%.cpp | $${@D} # object file depends on its directory 
    g++ -c -o [email protected] ${CPPFLAGS} ${CXXFLAGS} $< 

obj/% : # directory creation rule 
    mkdir -p [email protected] 
+1

おかげマキシム、二次拡張は、私が最後に使用して巻き取るものです。 –

3

十分に新しいバージョンのGNU makeがeval機能をサポートしています。あなたがはるかに長いために作るGNUの特徴となっている自動生成メイクファイルを、使用することができるということに依存したくない場合は

define SUBDIR_RULE 
obj/$1/%.cpp.o: $(LIBS_DIR)/$1/%.cpp 
     @echo "Compiling $$<" 
enddef 

$(foreach D,$(LIBRARIES),$(eval $(call SUBDIR_RULE,$D))) 

:あなたはこのようにそれを使用することができます。しかし、この方法は使用するのがやや難解です。

関連する問題