IBM Support

CL コンパイラの /MP オプションを使うことにより、ビルド効率を大幅に向上させる方法

技術情報(FAQs)


質問

[Japanese] Visual Studio のコンフィギュレーション(MSVC9 または MSVC)で下記のように、コンパイラに複数のソースファイル名を渡すような Makefile を生成するようにはどうしたらよいでしょうか。

cl -c a.cpp b.cpp c.cpp d.cpp e.cpp

回答

Rhapsody が自動生成する MakeFile をデフォルトの状態で実行すると、1つ1つのソースコードに対して個別にコンパイラが呼び出されます。そうすると、各ソースファイルごとにコンパイルが呼び出されるため、複数のソースコードを引数に指定して一括コンパイルする場合と比べて、どうしてもビルド速度が遅くなります。

この問題を解決するためには、NMAKE (v1.62 以降) の「バッチモード推論規則(Batch-Mode Inference Rules)」を利用します。バッチモード推論規則の詳細につきましては、本技術文献の下にある関連リンクを参照してください。

バッチモード推論規則ではターゲットラインの指定に二重のコロン (::) が使われます。

#
# バッチモード推論規則版 MakeFile のサンプル
#
Objs = a.obj/b.obj/c.obj/d.obj/e.obj

all : $(Objs)

!ifdef NOBatch
.cpp.obj:
!else
.cpp.obj::
!endif
cl -Fd.\ $<

$(Objs) :

#end of makefile

バッチモード推論規則を使用しない場合の実行結果:

E:\tmp> nmake -f test.mak -a NOBatch=1

Microsoft (R) Program Maintenance Utility Version 1.62.6200
Copyright (C) Microsoft Corp 1988-1996. All rights reserved.

cl -Fd.\ a.cpp
a.cpp
cl -Fd.\ b.cpp
b.cpp
cl -Fd.\ c.cpp
c.cpp
cl -Fd.\ d.cpp
d.cpp
cl -Fd.\ e.cpp
e.cpp

バッチモード推論規則を使用した場合の実行結果:

E:\tmp> nmake -f test.mak -a

Microsoft (R) Program Maintenance Utility Version 1.62.6200
Copyright (C) Microsoft Corp 1988-1996. All rights reserved.

cl -nologo -Fd.\ a.cpp b.cpp c.cpp d.cpp e.cpp
a.cpp
b.cpp
c.cpp
d.cpp
e.cpp
Generating Code...

このように、バッチモード推論規則を使用することで複数のソースコードをまとめてコンパイルすることができるようになります。以下、バッチモード推論規則と /MP オプションを併用してビルド時間を大幅に短縮する方法をご紹介します。

【設定手順 - 3 ステップ】

(1)msvc9make.bat (または msmake.bat) をコピーして my_fast_msmake.bat を作成する。
(2)my_fast_msmake.bat を編集して新しいターゲット(例、fast_compile)を追加する。

if "%2"=="" set target=fast_compile all

if "%2"=="build" set target=fast_compile all

if "%2"=="rebuild" set target=clean fast_compile all

if "%2"=="clean" set target=clean


注意:
"fast_compile" の後ろの "all" がない場合、リンクが実施されず、実行ファイルが生成されません。

(3)手順(1)で作成したバッチファイルを呼び出すようにプロジェクト設定(InvokeMake および MakeFileContent)を変更します。

●CPP_CG::MSVC9::InvokeMake の設定例:

"$OMROOT/etc/Executer.exe" "\"\"$OMROOT\"\etc\my_fast_msmake.bat $makefile $maketarget $CPU $IDEVersion \" "

●CPP_CG::MSVC9::MakeFileContent の "Generated dependencies" セクションを書き換える。

変更内容:

・$OMContextDependencies を削除する。

・バッチモード推論規則を追加する。

変更前:
################## Generated dependencies ########################
##################################################################
$OMContextDependencies

$OMFileObjPath : $OMMainImplementationFile $(OBJS)

    $(CPP) $(ConfigurationCPPCompileSwitches) /Fo"$OMFileObjPath" $OMMainImplementationFile

変更後:
################## Generated dependencies ########################
##################################################################

fast_compile : $(OBJS)
.cpp.obj::


    @echo Bath-Mode compilation started....
    $(CPP) /MP4 $(ConfigurationCPPCompileSwitches) $<


$OMFileObjPath : $OMMainImplementationFile
    $(CPP) $(ConfigurationCPPCompileSwitches) /Fo"$OMFileObjPath" $OMMainImplementationFile


【検証方法】
タスクマネージャを起動して、Rhapsody からビルドを実行する。
ビルド中に複数の CL.exe が立ち上がっていることを確認する。

関連情報

バッチモード規則
/MP (複数のプロセスを使用したビルド)
English Technote 1469621 : How to allow builds to utili

Document information

More support for: Rational Rhapsody
Rational Rhapsody Developer

Software version: 7.5, 7.5.0.1, 7.5.1, 7.5.1.1, 7.5.2, 7.5.2.1, 7.5.3, 7.5.3.1, 7.5.3.2, 7.6, 7.6.0.1, 7.6.1, 7.6.1.1, 7.6.1.2, 8.0

Operating system(s): Windows

Reference #: 1612696

Modified date: 15 October 2012