2012-03-09 4 views
1

に偽の前提条件が含まれないようにするにはどうすればいいですか?ターゲットをビルドしようとする前に常に実行する必要があるターゲットについて宣言する必要があります。実際にはファイルを生成しません。問題は、それをターゲット自体の最初の依存として宣言すると、偽の依存関係が$ ^で終わり、後続のリンクステップが混乱することです。ここで

は一例です:

他の場所
.PHONY: start 
    sample-prog-1 : start sample-prog-1.o 

私は、オブジェクトファイルから実行可能ファイルを構築するためのルールを持っている:

%: %.o 
     echo "Building executable [email protected]";$(CC) $(LDFLAGS) $^ $(LOADLIBES) $(LDLIBS) -o [email protected] $([email protected]) 

問題は、「スタート」、である偽のターゲットであるので、は存在しませんが、リンクステージはオブジェクトファイルの1つとして "start"を使用して呼び出されているので、ビルドプロセスがうまくいきます!

私は、回避策、オブジェクトファイルのリストから、「スタート」を取り除くために、単純であるが見つかりました:

%: %.o 
    echo "Building executable [email protected]";$(CC) $(LDFLAGS) $(shell echo "$^" | sed s/start//g) $(LOADLIBES) $(LDLIBS) -o [email protected] $([email protected]) 

をしかし非常にハックと醜い見せかけに加えて、それはまた、私ができることを意味しますソースファイルに "start"が含まれています。私はまた、 "始まり"が常に作り直されてしまうので、いつもsample-prog-1を再構築してしまいます。

これはちょうど間違った解決策のようですが、私はこれを行うための「正しい」方法が何であるかについて迷っています。私はこのようなもので、私は実行可能ファイルをくくり出す何かをしなければならないと思っています:

sample-prog-1 : sample-prog-1.o 
    do_sample-prog-1 : start sample-prog-1 

しかし、私は与えられた目標を構築したい場合は、今私はいくつかを付加または追加することを忘れないように持っているので、これは、直感的です実行ファイルがビルドされる前に起動コードが実行されるように、そのターゲット名に他の文字列を追加します。あなたがorder-only prerequisite検討するかもしれない

答えて

3

:とりわけ

sample-prog-1 : sample-prog-1.o | start 

、オーダーのみの前提条件は$^には表示されません。

+0

まさに私が探していたものです、ありがとう! – Michael

+0

奇妙なことに、makeは私の注文のみの前提条件を最初に実行していませんが、私はそれがこれで逃げることができるかどうかは分かりません。しかし、出力が乱れてしまいます。なぜなら、開始するコンパイルの詳細をエコーする前に、コンパイルすることがあるからです。 – Michael

+0

prereqをビルドする前に実行するには、その前提条件が必要です。この例では、 'start'は.oファイルの前提条件ではないため、最初に.oファイルを作成することもできます(-jを使用すると同時に作成することもできます)。現在のところ、リンクステップの前に 'start'が実行されているという唯一の順序があります。 –

1

あなたはターゲットの.o後に偽のターゲットを配置し、代わりに$^$<を使用することができます。

sample-prog-1 : sample-prog-1.o start 

%: %.o 
     echo "Building executable [email protected]";$(CC) $(LDFLAGS) $< $(LOADLIBES) $(LDLIBS) -o [email protected] $([email protected]) 

それとも、あなたはメイクGNUを使用している場合、単にオブジェクトを取得するには、組み込みfilterを使用しますファイル:

$(CC) $(LDFLAGS) $(filter %.o $^) $(LOADLIBES) $(LDLIBS) -o [email protected] 
+0

ターゲットが複数のオブジェクトファイルを必要としない限り、最初の方法は問題ありません。 2番目の方法は効果的であり、ほんのわずかです。 +1 – Beta

+0

場合によっては、複数のオブジェクトファイルがあるため、2番目の方法を使用する必要があります。これは私が試したもののほんの短いバージョンであり、開始点が変更されたと考えられるので、実行する必要がなくても実行可能ファイルを再構築しようとしているという問題が残っていると思います。 – Michael