4

antlrパーサーの出力ファイルを生成するmakefileルールがあります。

XLexer.c XLexer.h XParser.c XParser.h X.tokens: X.g
    $(ANTLR) $(ANTLRFLAGS) X.g

これは正常に機能し、Xgが変更されたときに、結果のすべてのファイルを期待どおりに再構築します。しかし、-jフラグを指定して並列makeを実行すると、上記のルールはファイルごとに1回実行されるため、この場合、antlr呼び出しは5回並列に実行されます。

このタイプのルールを実行する方法はありますが、コマンドを1回だけ実行しますか?.NOPARALLEL:ルールについては知っていますが、それでは目的が果たせません。ロックファイルを使用して、複数の実行がすでに実行されている場合に複数の実行を終了させようとしましたが、成功しませんでした。

4

2 に答える 2

4

すべての出力ファイルが共通の語幹を共有しない限り(たとえば、「XLexer.c」と「XLexer.h」の語幹が「XLexer」)、GNUmakeでこれを行うクリーンな方法はありません。センチネルファイルの使用など、さまざまな回避策があります。

XLexer.c XLexer.h XParser.c XParser.h X.tokens: dummy
    @

dummy: X.g
    $(ANTLR) $(ANTLRFLAGS) X.g && touch dummy

CMCrossroadsのMr.Makeコラムに、GNUMakeの複数の出力を含むルールのオプションの完全な記述があります。

(「@」行は「no-op」コマンドですが、重要です。これがないと、GNU makeは、フレンドが増分再構築によって更新されないと想定するXLexer.cため、Xgを変更するにはmakeを2回実行する必要があります。有効にする)

または、 ElectricAcceleratorなどのよりスマートなバージョンのmakeを使用すると、この問題が自動的に解決されます(免責事項:私はElectricAcceleratorのアーキテクトです)。

于 2012-04-26T16:59:22.773 に答える
0

パターンルールは、プレーンルールとは異なる動作をします。マニュアルには次のように書かれています。

パターンルールには複数のターゲットが含まれる場合があります。通常のルールとは異なり、これは同じ前提条件とレシピを持つ多くの異なるルールとして機能しません。パターンルールに複数のターゲットがある場合make、ルールのレシピがすべてのターゲットを作成する責任があることを知っています。レシピは一度だけ実行され、すべてのターゲットが作成されます。

X共通の語幹( )があるため、これはあなたのケースで機能します。

all: XLexer.c XLexer.h XParser.c XParser.h X.tokens
# (or more realistically, several targets that depend on the above)

%Lexer.c %Lexer.h %Parser.c %Parser.h %.tokens: %.g
    $(ANTLR) $(ANTLRFLAGS) $<
于 2017-01-20T16:11:15.350 に答える