2011-11-15 19 views
2

でターゲット固有の変数を使用する:私は、次のメイクファイルを持っているメイクファイル

OUTPUTDIR = build 

all: v12target v13target 
v12target: INTDIR = v12 
v12target: DoV12.avrcommontargets 
v13target: INTDIR = v13 
v13target: DoV13.avrcommontargets 

%.avrcommontargets: $(OUTPUTDIR)/%.elf 
    @true 

$(OUTPUTDIR)/%.elf: $(OUTPUTDIR)/$(INTDIR)/main.o 
    @echo TODO build ELF file from object file: destination [email protected], source $^ 
    @echo Compiled elf file for $(INTDIR) > [email protected] 

$(OUTPUTDIR)/$(INTDIR)/%.o: %.c 
    @echo TODO call GCC to compile C file: destination [email protected], source $< 
    @echo Compiled object file for $<, revision $(INTDIR) > [email protected] 

$(shell rm -rf $(OUTPUTDIR)) 
$(shell mkdir -p $(OUTPUTDIR)/v12 2> /dev/null) $(shell mkdir -p $(OUTPUTDIR)/v13 2> /dev/null) 

.SECONDARY: 

考え方は同じソースコードからコンパイルする必要がいくつかの異なるコードの設定があるということです。 「すべての」ターゲットはv12targetとv13ターゲットに依存し、ターゲットは特定のビルドにいくつかの変数を設定します。また、実際にコンパイルする方法を定義する "avrcommontargets"パターンにも依存します。 avrcommontargetsはELFファイルに依存します.ELFファイルは、Cソースコードから作成されたオブジェクトファイルに依存します。

コンパイルされた各Cファイルは、オブジェクトファイル(* .o)になります。各構成(v12、v13など)は異なる出力になるので、Cファイルは、出力を複数の異なるサブディレクトリに配置してビルドする必要があります。例えば、

など、 "/ V13/main.oを構築する"、 "/ V12/main.oを構築し、" 出力例:

TODO call GCC to compile C file: destination build//main.o, source main.c 
TODO build ELF file from object file: destination build/DoV12.elf, source build//main.o 
TODO build ELF file from object file: destination build/DoV13.elf, source build//main.o 

は問題はオブジェクトファイルは行っていないということです正しいサブディレクトリに移動します。たとえば、 "build/v12/main.o"の代わりに "build // main.o"と入力します。これにより、main.oが正常に再構築されてmain.oのv13バージョンが生成されなくなります。

私は、$(INTDIR)がターゲット固有の変数であり、%.elfと%.oに対して定義したパターンターゲットでは使用できない可能性があると推測しています。

正しい出力は次のようになります。

TODO call GCC to compile C file: destination build/v12/main.o, source main.c 
TODO build ELF file from object file: destination build/DoV12.elf, source build/v12/main.o 
TODO call GCC to compile C file: destination build/v13/main.o, source main.c 
TODO build ELF file from object file: destination build/DoV13.elf, source build/v13/main.o 

私はそれが正しい出力を生成するように、このメイクファイルを調整するために何をする必要がありますか?

答えて

1

あなたの出力から「コンパイルエルフファイル」の行をリダイレクトし、次のようになりた:

Compiled elf file for v13 

ターゲット固有の変数置換は、一般的に動作しますが、それは標的の選択後に行われるようです - そうでなければ、実行するのはかなり難しいでしょうから十分です。

$(foreach)$(eval)を使用して、ターゲットごとに1つのルールを作成できます。しかし、ここではツリー構造から再構築していることをもう一度指摘したいと思います。最も良い方法は、オートツールを使うことです。 2番目の方法は、Out-of-Treeビルドロジックを完成させ、ターゲットごとに1つのビルドツリーを使用し、コンパイルフラグをMakefileに挿入する小さなconfigure shスクリプトです。第二の溶液にエラボレーション

は、サブディレクトリ、ターゲットごとに1で実行する定期的なメイクをしてみましょう。サブメイクの実行を制御するメインのメイクファイルにスイッチを入れてください。 ...応答のための

TARGETS = v12 v13 

CFLAGS_v12 = -foo 
CFLAGS_v13 = -bar 

ifeq ($(TARGET),) 
all : 
    mkdir --parents $(TARGETS) 
    $(foreach t,$(TARGETS),SRCDIR=.. CFLAGS="$(CFLAGS_$t)" TARGET=$t $(MAKE) -C $t -f ../Makefile &&) true 
clean : 
    rm -rf $(TARGETS) 
else 
all : main.elf 
endif 

%.elf : %.o 
    echo "Linking [email protected] from $< with $(CFLAGS)" 

%.o : $(SRCDIR)/%.c 
    echo "Compiling [email protected] from $< with $(CFLAGS)" 

.PHONY : all 
+0

おかげ具体的には、私はまた、AVR Studioの5およびVisual C++(メイクファイルプロジェクトタイプ)と呼ばれるこのメイクファイルを持っている:あなたのメインのMakefileは次のようになります。 AVR Studio 5では、外部メイクファイルにパスを入力する必要があります。 VC++では、さまざまなビルドタイプに対して "make all"、 "clean clean"などのコマンドを入力する必要があります。私の主張は、「すべてを作る」がすべての構成を構築するような、ある種のメイクファイルからすべてを開始する必要があることです。私はautotoolsでそれをどうやって行うことができないのか分かりません... - それは私がちょうどそれをよく知っていないためかもしれません。 –

+0

別の考慮点は、WinAVR(http://winavr.sourceforge.net/)に含まれているユーティリティに自分自身を限定しようとしていることです。私はautotoolsを含めないと思います。この小さなプロジェクトのために構築された互換性のあるautotoolsを作成しようとすれば、それを構築したいすべての開発者にとって面倒なことになるだろうか?私たちはautotoolsやGNU makeを使っていません。 –

+0

@JamesJohnston:十分な時間、ホイール再発明の時間のための時間:-)。 – thiton

関連する問題