に偽の前提条件が含まれないようにするにはどうすればいいですか?ターゲットをビルドしようとする前に常に実行する必要があるターゲットについて宣言する必要があります。実際にはファイルを生成しません。問題は、それをターゲット自体の最初の依存として宣言すると、偽の依存関係が$ ^で終わり、後続のリンクステップが混乱することです。ここで
は一例です:
他の場所.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検討するかもしれない
まさに私が探していたものです、ありがとう! – Michael
奇妙なことに、makeは私の注文のみの前提条件を最初に実行していませんが、私はそれがこれで逃げることができるかどうかは分かりません。しかし、出力が乱れてしまいます。なぜなら、開始するコンパイルの詳細をエコーする前に、コンパイルすることがあるからです。 – Michael
prereqをビルドする前に実行するには、その前提条件が必要です。この例では、 'start'は.oファイルの前提条件ではないため、最初に.oファイルを作成することもできます(-jを使用すると同時に作成することもできます)。現在のところ、リンクステップの前に 'start'が実行されているという唯一の順序があります。 –