でターゲット固有の変数を使用する:私は、次のメイクファイルを持っているメイクファイル
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
私はそれが正しい出力を生成するように、このメイクファイルを調整するために何をする必要がありますか?
おかげ具体的には、私はまた、AVR Studioの5およびVisual C++(メイクファイルプロジェクトタイプ)と呼ばれるこのメイクファイルを持っている:あなたのメインのMakefileは次のようになります。 AVR Studio 5では、外部メイクファイルにパスを入力する必要があります。 VC++では、さまざまなビルドタイプに対して "make all"、 "clean clean"などのコマンドを入力する必要があります。私の主張は、「すべてを作る」がすべての構成を構築するような、ある種のメイクファイルからすべてを開始する必要があることです。私はautotoolsでそれをどうやって行うことができないのか分かりません... - それは私がちょうどそれをよく知っていないためかもしれません。 –
別の考慮点は、WinAVR(http://winavr.sourceforge.net/)に含まれているユーティリティに自分自身を限定しようとしていることです。私はautotoolsを含めないと思います。この小さなプロジェクトのために構築された互換性のあるautotoolsを作成しようとすれば、それを構築したいすべての開発者にとって面倒なことになるだろうか?私たちはautotoolsやGNU makeを使っていません。 –
@JamesJohnston:十分な時間、ホイール再発明の時間のための時間:-)。 – thiton