Windows で GNU 並列ジョブ (-j) を作成するには、どのようなセットアップが機能しますか?
MinGW make 3.81 を使用してシェルを cmd.exe に設定しようとしましたが、これは複数のプロセスを作成する際に機能しますが、make は「ジョブを待っています」というメッセージで失敗します。
これは機能しますか?最適なセットアップは何ですか? (MinGW / Cygwin / ???) 誰かがテストする実際の例を教えてもらえますか?
Windows で GNU 並列ジョブ (-j) を作成するには、どのようなセットアップが機能しますか?
MinGW make 3.81 を使用してシェルを cmd.exe に設定しようとしましたが、これは複数のプロセスを作成する際に機能しますが、make は「ジョブを待っています」というメッセージで失敗します。
これは機能しますか?最適なセットアップは何ですか? (MinGW / Cygwin / ???) 誰かがテストする実際の例を教えてもらえますか?
As Far as I can understand, GNU Make's parallel jobs depend on the underlying platform to supply (CPU) load information. This is unfortunately done in a non-Windows-compatible way, and only the "make -j" command does anything scalingwise. That command (without max number of jobs) is potentially quite dangerous, as it will eat memory like a rabid starving dog (I tried it on Qt, and it crashed on QtWebkit, the largest project in Qt, 4GB RAM, Win7).
On second thought, I get the feeling make -j3 runs faster than make, but in light of what I can find on the web (forums, manual...) it seems very POSIX/linux specific functionality.
BTW, I'm surprised your question was voted down.
CMake ユーザーに役立つヒント
cmake-makefiles が通常行うように、makefile が make を再帰的に呼び出す場合、-jN オプションは機能しません。しかし、生成されたメイクファイルで CMake がそのような構文を介して呼び出すため、再び機能する解決策があります。
$(MAKE) -f CMakeFiles\Makefile2 <subproject>
これは、変数 MAKE を変更できることを意味します。
mingw32-make "MAKE=mingw32-make -j3"
これで、subproject-make が開始されるたびに、再び「-j3」オプションが取得されます。ただし、これにより、並列コンパイルの数が事実上 3 に制限されるわけではないことに注意してください。同じ階層に互いに依存しない 3 つ以上のプロジェクトがある場合、3 つのプロジェクトすべてが並行してビルドされ、それぞれが 3 つのコンパイル ステップを開始します。その結果、9 つの並列コンパイル ステップが発生します。
cmake によって生成された最上位の Makefile をもう一度詳しく調べると、ターゲット "all" が基本的にサブ make のみを開始することがわかります。
$(MAKE) -f CMakeFiles\Makefile2 all
したがって、サブプロジェクトの並列処理の 1 つのレイヤーを削除するには、次の呼び出しを行います。
mingw32-make "MAKE=mingw32-make -j3" -f CMakeFiles\Makefile2 all
しかし、これは進捗レポートを犠牲にします。
それにもかかわらず、これが役立つことを願っています。
Windows での並列 make ビルドの問題を説明しているDanny Thorpe のブログ エントリを見つけました。基本的に、最初に次の環境変数を設定することをお勧めします。
set SHELL=cmd.exe
これで、スタイル コマンドを実行できましたmake -j
が、残念ながら制御されたスタイル コマンドは実行できませんでしたmake -jN
。
この問題を解決したので、解決策をみんなに共有します。
MinGW-TDM (ホーム ページ: http://tdm-gcc.tdragon.net/ ) または MinGW-Equation (ダウンロード ページ: http://www.equation.com/servlet/equation.cmd?fa=fortran ) を試すことができます。 )。
たとえば、 32 ビット バージョンをインストールしますD:\MinGW\MinGW32
(64 ビット コンパイル バイナリを使用する場合は、64 ビット バージョンを D:\MinGW\MinGW64 にインストールします)。
次のようにバッチ ファイルを作成し、ビルド ディレクトリで実行します。
Set MinGW_bin=D:\MinGW\MinGW32\bin
Set MSys_bin=D:\MinGW\msys\bin
Set Path=%MSys_bin%;%MinGW_bin%
mingw32-make SHELL=CMD.exe -j6 -f makefile
MSYS はhttp://sourceforge.net/apps/trac/mingw-w64/wiki/MSYSからダウンロードできます。多くのオープン ソース ライブラリ、アプリケーションを構築する必要がある多くの UNIX のようなユーティリティがあります。
-j6 は、6 つの並列コンパイル ジョブを実行するオプションです。
ヒント: オプション -jN を設定できます。ここで、N は CPU コア (スレッド) の数の 1.5 倍です。私の場合、CPU には 4 つのスレッドがあるため、この値を 6 に設定します。
注:実行できます
make.exe -jN -f メイクファイル
オプションなし SHELL=CMD.exe
で、コンパイルは並行して実行されますが、場合によっては互換性がありません ( make.exe
MSYS ディレクトリからのもの)。
よろしく、
make -jn
Cygwin で問題が発生したことはありません。それはかなりうまく機能します。私は定期的に Microsoft のcl.exe
コンパイラで使用しています。それは私にとって箱から出してすぐに機能します。非常に UNIX に似ており、Good Thing™ です。ビルド スクリプトは、Linux および Mac に適切に移植されます。徹底的にお勧めします。
バックスラッシュが 5 つでは少なすぎて 6 つでは多すぎる場所にたどり着いて以来、MinGW の作成は好きではありませんでした。はぁ!(バックスラッシュで区切られたパス名をmake AFAIKで許可するようにするためのMinGWハックを行うため。)