カスタムウィザードでのプリコンパイル済みヘッダ設定のチェック

MEMORANDUM


 

カスタムウィザードでのプリコンパイル済みヘッダ設定のチェック

Microsoft Visual C++ 7.0

■ はじめに

ここの備忘録は、あくまでも走り書き程度のメモ的なものですので気をつけてください。

そのままでもちゃんと動くもの、手を加えないとだめなものなど、未完成レベルのコードです。ので、そのまま引用してしまうなど、プログラムを理解する知識のない方は利用しないでくださいね。

 

■ 概要

Visual Studio .NET のカスタムプロジェクトで Visual C++ 7.0 用のクラスウィザードを作成したときに、プリコンパイル済みヘッダの値に応じて、#include "stdafx.h" をつけるか否かの処理を書いてみました。

check_precompiled(proj) 関数は、default.js 内での呼び出しです。

 

■ コード

function check_precompiled(proj)

{

try

{

// プロジェクト内にプリコンパイル済みヘッダファイルがあるかを調べる。

var configs = proj.Object.Configurations;

var config_count = configs.Count;

 

if (config_count > 0)

{

// 全ての構成で同一のプリコンパイル済みヘッダかを確認

var conftool = configs(1).Tools("VCCLCompilerTool");

 

var symbol_use = "PCH_USE";

var symbol_name = "PCH_HEADER";

var symbol_comment = "// TODO: 必要に応じてプリコンパイル済みヘッダに必要なファイル (stdafx.h など) をインクルードしてください。\r\n// #include \"stdafx.h\"";

 

if (conftool.UsePrecompiledHeader != pchNone)

{

// とりあえず1番目の構成でのプリコンパイル済みヘッダのサポートは必須

var precomp_h = conftool.PrecompiledHeaderThrough;

 

// 2番目以上の構成でも、同一のプリコンパイル済みヘッダファイルを使用しているかの確認

for (i = 2; i <= config_count; i++)

{

// プリコンパイル済みヘッダを使用するかどうかの確認

conftool = configs(i).Tools("VCCLCompilerTool");

 

if (conftool.UsePrecompiledHeader != pchNone)

{

// プリコンパイル済みヘッダファイル名が他の構成と違っている場合はループ打ち切り

if (precomp_h != conftool.PrecompiledHeaderThrough)

{

precomp_h = "";

break;

}

}

else

{

// プリコンパイル済みヘッダを使用しない設定なっていた場合も打ち切り

precomp_h = "";

break;

}

}

 

// プリコンパイル済みヘッダ用のシンボルを追加

if (precomp_h == "")

{

// プリコンパイル済みヘッダ用のファイルが複数存在したため、組み込みをプログラマに任せる。

wizard.AddSymbol(symbol_use, true);

wizard.AddSymbol(symbol_name, symbol_comment);

}

else

{

// プリコンパイル済みヘッダを組み込むためのシンボルを作成

wizard.AddSymbol(symbol_use, true);

wizard.AddSymbol(symbol_name, "#include \"" + precomp_h + "\"");

}

}

else

{

// 全ての構成でプリコンパイル済みヘッダを使用しないようになっているかの確認

var precomp_use = false;

 

for (i = 2; i <= config_count; i++)

{

conftool = configs(i).Tools("VCCLCompilerTool");

precomp_use = precomp_use || (conftool.UsePrecompiledHeader != pchNone);

}

 

// ひとつでも使用する箇所があるようならば、注意事項を示すコメントを生成。

if (precomp_use)

{

wizard.AddSymbol(symbol_use, true);

wizard.AddSymbol(symbol_name, symbol_comment);

}

}

}

else

{

// 構成がひとつもみつからない場合は何もしません。

wizard.AddSymbol(symbol_use, false);

}

}

catch(e)

{

throw e;

}

}