他のターゲットの前に特定のターゲットを作成する必要がある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
強制的に生成することができますが、後で別のファイルをコピーすると、この方法よりも高速になります。もう一度、ソースが最新になるまでコピーしても期待した結果が出ない場合にのみ可能です。dir
dir/file,
dir,
dir
dir/file
make
dir/file
make
dir/file.
make
これは別の質問を提起します。依存せずに複製前に生成を強制する依存性トポロジを持つことは可能ですか?dir
dir/file
dir
dir/file.
答え1
GNU makeでは、次のものを使用できます。前提条件のみ注文dir
作成したいルールを実行する前に作成する必要がありますdir/file
。
バラよりこのページ詳細については。
GNU make マニュアルの例では、ファイルを生成する前に作成されるディレクトリへの依存関係を追加するために実際にカスタマイズされていることがわかります。
具体的な例として、次のようにします。
dir/file: | dir
cp source dir/file
既存のルールを変更する必要はありませんが、Makefileの他の場所にこの依存関係を追加できます。
より具体的には、メイクファイルを他のメイク実装で処理できるようにソリューションを作成する必要があります。
私はこれが他のmake実装では動作しないと思います...可能な解決策の1つGNUmakefile
はinclude
Makefile
GNUで作成された特定の拡張も追加されました。
たとえば、ルール.WAIT
をGNUmakefile
。
この指示が役に立つことを願っています!
答え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に拡張でき、sunpro
SunPro 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
最後の行は関連性のないジャンクルールと見なされます。