3

誰かがここで違いを明らかにできますか:

$(tsdir)/projには前提条件$(tsdir)/projaとがあり$(tsdir)/projbます。ビルドするたびにprojaprojbの makefile が呼び出されるようにしprojます。projaまたはが古くて更新されている場合projb、そのメイクファイルはそれぞれ$(tsdir)/projaおよびに影響し$(tsdir)/projbます。これらのファイルが よりも新しい場合は$(tsdir)/proj、proj を再構築します。

FORCE以下のコードとターゲットを使用して、これを機能させます。ターゲットを使用するように切り替えようとする.PHONYと、これは機能しません。.PHONYそれがおそらくこれを行うためのより「正しい」方法であるため、私は好みます。しかし、それは機能せず、理由がわかりません。projaprojbの makefile は.PHONYターゲットで呼び出されませんが、proj再構築されます。

GNU make 3.81 を使用しています。

ありがとうナチュム

$(tsdir)/proj: $(tsdir)/proja $(tsdir)/projb
...

$(tsdir)/%: FORCE  
    make -C $(prereqdir)/$*

FORCE:

#or

$(tsdir)/proj: $(tsdir)/proja $(tsdir)/projb
...

.PHONY: $(addprefix $(tsdir)/, $(projects))

$(tsdir)/%:  
    make -C $(prereqdir)/$*
4

2 に答える 2

4

.PHONYターゲットは、実際のファイルではなく、暗黙のルール検索がファイルに対してのみ機能するタスクを表すことになっています。したがって、暗黙のルールで偽のターゲットを構築する方法はありません。

偽のターゲットの章から:

偽のターゲットは、他のファイルから作り直すことができる実際のファイルに名前を付けないことがわかっているため、偽のターゲットmakeの暗黙のルール検索をスキップします

あなたの場合、明示的なルールを使用するだけで、静的パターンを使用できます。

.PHONY: $(addprefix $(tsdir)/, $(projects))

$(addprefix $(tsdir)/, $(projects)) : $(tsdir)/% :  
    make -C $(prereqdir)/$*
于 2013-03-02T12:27:20.890 に答える
1

マスタープロジェクトプロジェクトから削除された(実際の)タイムスタンプファイルに偽の依存関係を追加することで、希望する結果が得られると思います。

.PHONY: phony
phony: ; : $@

ts := $(addprefix $(tsdir)/, $(projects))

${ts} : $(tsdir)/%: phony
    make -C $(prereqdir)/$*

$(tsdir)/proj: $(tsdir)/proja $(tsdir)/projb
...
于 2013-03-04T12:15:31.700 に答える