2009-06-11 13 views
2

私はautomakeのために新しいですし、私はリンクせずにコンパイルしようとしています。私の目標は、Automakeを使って以下に示すような単純なMakefileを生成することです。Automakeでリンクせずにどのようにコンパイルしますか?

CFLAG = -Wall 

build: Thread.o 

Thread.o: Thread.cc Thread.h 
    g++ $(CFLAG) -c Thread.cc 

clean: 
    rm -f *.o 

これまでの試みでは、次のMakefile.acに私が参加しました。

noinst_PROGRAMS = thread 

thread_SOURCES = Thread.cc 

EXTRA_DIST= Thread.h 

オリジナルのMakefileをどのようにシミュレートできますか? Automakeは、このような機能を持っていなかった場合、私は驚いされないよりも

thread_LINK = true 

その他:

答えて

2

一つの方法は、これはリンクしませんリンクコマンドを提供することで、Automakeのをだますことです行うことです。

+0

など、詳細については-pにgmakeと暗黙的、明示的なルールのトピックではgmakeのためTexinfoマニュアルを見てみましょう、パターン、サフィックス。アドバイスをいただきありがとうございます。 –

2

あなたたとえば、あなただけの例えば、直接あなたの.oファイルを構築するためにはAutomakeを依頼することができます

$ make Thread.o 

私はあなたが出力Makefileでそれを見ることはありませんので、これは、暗黙のルールであると考えています。

一般に、Automakeは、allを含む変数を、実行可能ファイルまたはライブラリの各ターゲットに必要なオブジェクトを生成します。それはちょうど、ターゲット名に_OBJECTSを追加することによって、自分の名前を生成するので、あなたのMakefileでそれらを使用するために非常に簡単です。あなたはこのようMakefile.amで独自の目標を作ることができる:

build-thread: $(thread_OBJECTS) 

次に、あなただけのThread.o(およびthreadのために必要なその他のオブジェクト)を構築することができ、このように:

$ make build-thread 

それとも、複数を持っていた場合

build: $(foo_OBJECTS) $(bar_OBJECTS) $(baz_OBJECTS) 
foobar、および bazを対象に、このよう Makefile.amであなたのコンパイルのみターゲットを作ることができます

ここでの唯一の痛みはあなた自身があなたのMakefile.amに目標に基づいて、このリストを維持する必要がありますということです。コマンドラインで次のように呼び出すことができます。

$ make build 
2

Automakeはオブジェクトを生成するようには設計されていません。プログラムまたはライブラリを構築します。 それはあなたが単一のオブジェクトファイルではなく、何か他のものをコンパイルしたいと思いますなぜ知らなくても、あなたの質問に答えるのは難しいです。おそらくあなたの "本当の"問題に対するより洗練された答えがあるでしょう。

あなたが書くことができMakefile.amが結果MakefileだけlibThread.oを含むライブラリlibThread.aを建設する

noinst_LIBRARIES = libThread.a 
libThread_a_SOURCES = Thread.cc Thread.h # No need to put headers in EXTRA_DIST 

ある*.aライブラリは単にオブジェクトファイルの集合全くリンク関与がないですので、ANS。 上記Makefile.amはまた、あなたが好きなら、あなたがbuild:ルールを追加することができますので、libThread.oをコンパイルするためのルールを含むようにMakefileを放出される原因となります。

あなたは本当にAutomakeはライブラリを構築し、このコンパイルルールを放出しますが、しないようにしたい場合は、あなたが

EXTRA_LIBRARIES = libThread.a # EXTRA here means "output build rules but don't 
           # build unless something depends on it". 
libThread_a_SOURCES = Thread.cc Thread.h 
build: Thread.$(OBJEXT) 

は今、あなたが明示的として、あなたはmake buildを入力した場合にのみ構築されるファイルThread.$(OBJEXT)を必要としていると行くことができます元のMakefileにあります。

(Automakeは.$(OBJEXT)というよりも、.o変種DOSで.objのような拡張機能をサポートするために、使用しています。)

0

まず第一には、Automakeは自動メイクのMakefileを作るためのツールです。自分自身を作り上げることは、まったく違う獣です(そして私はあなたが探していたことが解決策であると確信しています)。ここで

はあなたが望むものを達成するための最も簡単なGNUベースのMakefileです:

all: Thread.o 

これは、次のようなもの(デフォルト)(ハードタブに4スペース空白を変更してください)に記入:

all: Thread.o 

Thread.o: Thread.cc 
    $(COMPILE.cpp) $(OUTPUT_OPTION) $< 

COMPILE.cppマクロとOUTPUT_OPTIONマクロは、デフォルトでGNUに展開され、指定された値を持ち、移植性がありません。 $ <はAT &です。しかし、pmake(1)のマンページによれば標準的な構文になっています。

GNU makeには、明示的なルール、パターン、サフィックスなどの概念がありますが、すべてのバージョンのmakeには移植できません。そのため、すべてのMakefileは明白にターゲットと変数は、POSIXがMakefileをどのように書くべきかについての望ましいシナリオの多くを記述していない。

実行して、これが問題の簡単な解決策だった

関連する問題