部分シリアル化にGNU makeを使用する方法

部分シリアル化にGNU makeを使用する方法

他のターゲットの前に特定のターゲットを作成する必要があるmake操作がある場合は、並列モードでSunPro Make(dmake)を使用するのは簡単です。生成されたファイルは次のとおりです。

install:  dir dir/file

dir:
    mkdir dir

dir/file:
    cp source dir/file

最初の行を平行に変更すると、安全に実行できます。

install: dir .WAIT dir/file

または以下を使用して:

.NO_PARALLEL: install

左または右のターゲットリストがパラレルモードで処理さ.WAITれても、makefileの残りの部分はまだパラレルモードで処理されます。

望むより:http://schilytools.sourceforge.net/man/man1/make.1s.htmlそしてhttp://schilytools.sourceforge.net/man/man1/dmake.1.html

しかし、GNU makeには同様のオプションがないようです。 GNU makeでこれを行う方法は本当にありませんか?

より具体的には、メイクファイルを他のメイク実装で処理できるようにソリューションを作成する必要があります。

特別なターゲット.WAITは、makeプログラムに関連する$(WAIT)というマクロに配置できます。

役に立たない確実な解決策があります。

理論的には、コピーを試みる前にdir依存関係を設定してdir/file強制的に生成することができますが、後で別のファイルをコピーすると、この方法よりも高速になります。もう一度、ソースが最新になるまでコピーしても期待した結果が出ない場合にのみ可能です。dirdir/file,dir,dirdir/filemakedir/filemakedir/file.

makeこれは別の質問を提起します。依存せずに複製前に生成を強制する依存性トポロジを持つことは可能ですか?dirdir/filedirdir/file.

答え1

GNU makeでは、次のものを使用できます。前提条件のみ注文dir作成したいルールを実行する前に作成する必要がありますdir/file

バラよりこのページ詳細については。

GNU make マニュアルの例では、ファイルを生成する前に作成されるディレクトリへの依存関係を追加するために実際にカスタマイズされていることがわかります。

具体的な例として、次のようにします。

dir/file: | dir
        cp source dir/file

既存のルールを変更する必要はありませんが、Makefileの他の場所にこの依存関係を追加できます。

より具体的には、メイクファイルを他のメイク実装で処理できるようにソリューションを作成する必要があります。

私はこれが他のmake実装では動作しないと思います...可能な解決策の1つGNUmakefileincludeMakefileGNUで作成された特定の拡張も追加されました。

たとえば、ルール.WAITGNUmakefile

この指示が役に立つことを願っています!

答え2

ディレクトリがその下のファイルの前に作成されるように依存関係を追加する必要があります。

「タグ」ファイルを使用してディレクトリの依存関係を表示すると、その下にファイルを作成してもディレクトリのタイムスタンプには影響しません。また、GNU make固有の機能は必要ありません。

あなたの例では:

install: dir/file

dir/.marker:
        mkdir -p dir
        touch dir/.marker

dir/file: dir/.marker
        cp source dir/file

.directoryまたはマークアップファイルとして.dir使用できます。.folder

答え3

以下は、Filipe Brandenburgerが提案したアイデアと、Schily Makefileシステムで使用される一般的なアプローチから派生した私の答えです。

makefile システムは、make macros以下がこのように設定されることを保証します。

WAIT=       # empty with GNU make
WAIT= .WAIT # .WAIT special target with SunPro Make

MAKEPROG= <name of the make program> # This is from: smake, gmake, sunpro

_UNIQ= .XxZzy-

次に、上記のマクロ定義makefileを使用します。

_NORULE=    $(_UNIQ)$(MAKEPROG)
__NORULE=   $(_NORULE:$(_UNIQ)gmake=)
NORULE=     $(__NORULE:$(_UNIQ)%=%)

install: dir $(WAIT) dir/file

dir/file: source
        cp source dir/file

dir:
        mkdir -p dir

$(NORULE)dir/file: | dir

$(NORULE)gmakeを使用してnullに拡張でき、sunproSunPro Makeを使用してnullに拡張できます。

gmakeの場合、makefile全体は次のように展開されます。

install: dir dir/file

dir/file: source
        cp source dir/file

dir:
        mkdir -p dir

dir/file: | dir

SunPro Makeの場合、makefile全体は次に展開されます。

install: dir .WAIT dir/file

dir/file: source
        cp source dir/file

dir:
        mkdir -p dir

sunprodir/file: | dir

最後の行は関連性のないジャンクルールと見なされます。

関連情報