スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--.--.-- | スポンサー広告

VC++「カスタムビルドステップ」の罠

VisualC++には「カスタムビルドステップ」という、(本来は・・)とっても便利な機能があります。
これは、プロジェクトに含まれたファイルについて、いわゆる一般的なビルド時の依存関係に加えて、オリジナルの依存関係を追加することができるものです。

いってみれば、VC++IDEにおいて、unix系のmakeコマンドと同様の柔軟さを実現することができる機能です。VC++2005では拡張子単位でビルド方法を指定できる(と思われる)「カスタムビルド規則」が追加されており、さらに強化されています。

たとえば、スクリプト言語のバインドコードを作成する場合なんかにとっても有用といえます。
固定値をエクセルファイルで管理している場合などにも使えますね。

しかし、僕にとっては、この機能を利用したとき、わけがわからなくなって、悩んだ思い出ばかりが思い出されるのです・・・。
今回Webで情報を探しまくった結果、その理由の一端がわかったような気がします。


まずはカスタムビルドステップの概要からご紹介。

VC++には一般的な依存関係が最初から定義されており、以下のようなことがビルド時に自動的に処理されるようになっています。

.cpp をコンパイルすれば .obj になる、
ということは、.cppファイル が更新されたら .obj を更新するためにコンパイルをしなければならない、
さらに、.cpp からincludeされている .hファイル が更新されたら、やっぱりコンパイルしなければならない。

test.cpp, test.h -(コンパイル)→ test.obj -(リンク)→test.exe


カスタムビルドステップを使えば、たとえば・・・
test.cppファイルは test.def ファイルから自作のconvコマンドで生成される、といった場合に、
test.defファイルが更新されたら、ビルド時に自動的にconvコマンドを呼んでtest.cppを更新する。
その結果test.cppがコンパイルされてtest.objが更新され、さらにリンクされてexeが更新される。

test.def -(自作コンバータ)→ test.cpp -(コンパイル)→ test.obj -(リンク)→test.exe

といったことを自動化することが可能です。

これを利用すれば、手作業でのコンバート作業などを幾分減らすことができます。
プログラマーは難しい問題に頭をつかわないと勿体ないですから、こんな単純なルーチンワークについてはコンピュータにやらせるのが一番です。



うまく設定できたら・・・の話だけどね。

さて、カスタムビルドステップは、ソリューションに加えたファイルのプロパティから設定することができますが、設定する情報は、

・コマンドライン 実行したいコマンド文字列を入れる。複数行記述可能。
・説明カスタムビルドステップ実行時に表示する文字。マクロ使用可能。
・出力ファイル

コマンドラインの実行結果として生成されるファイルのパスを入れる。
パスはプロジェクトのパスからの相対パス。
※ダブルクォーテーションでくくらないこと

・追加の依存ファイル

依存関係に追加したいファイルのパスを ; 区切りで入れる。
パスはプロジェクトのパスからの相対パス。
※ダブルクォーテーションでくくらないこと



の4点、説明を除けば実質3点であり、別に難しいことはありません。・・・のように見えます。少なくとも。

つまり、

(カスタムビルドステップを設定した対象ファイル+追加依存ファイル)のどれかが更新された場合、
「コマンドライン」を実行すれば、
「出力ファイル」が更新される。

という流れです。別に難しいことはなさそうに見えます。
ただし、小さい罠としては、以下のようなことに気をつける必要があります。

・「出力ファイル」および「追加依存ファイル」について、ダブルクォーテーションでくくると
ちゃんと動かなかったような記憶があります。

・コマンドラインの内容にはマクロ $(Project) 等を指定できますが、通常そのコマンドは表示されないので、ちゃんと実行されているかわかりにくいです。
「コマンドライン」の1行目に@echo onとすれば良いようです。
また、「説明」の項目にコピーしておくと実行時に内容を確認できる、という方法もあります。

・「出力ファイル」あたりを間違えると、何度ビルドしても、ビルドが完了していない(更新が存在する)扱いになることがあります。


しかし、最も深い闇はこの後すぐ。

何度も迷路をさまよった経験からすると、Webで見つけたこちらの書き込みのようなことが、事実、あります。
>If you enter Additional Dependencies in the Custom Build Step it seems to be random if they immediatly work or not.
訳すと・・・

「追加依存ファイル」に設定した内容がすぐに反映するかどうかは、ランダムのように思われる。

たぶんこれは事実です。

つまり、追加依存ファイルをいろいろ調整しようとして、値を変えてビルドしても、
「すぐに反映するかどうかは博打」という、わけのわからない状況に陥ります。

技術者のトラブル解決方法とは、大抵、「1つの値を動かしてみて、結果が変わらなければ、その部分は問題と直接関連していない」というようなロジックのもとに実行されることが多いと思いますが、

「追加依存ファイル」については、「すぐに反映するかどうかは博打」ですから、「「追加依存ファイル」をいじってみたが結果が変わらない」ということが起こり、その結果、全く関係のない部分を疑いはじめることになってしまうのです。

しかし、ソリューションを閉じて、開きなおせばちゃんと依存性は反映されるようです。

経験からすると、「ソリューションのクリア」では足りません。「閉じる」必要があります。

この結果、
・「「追加依存ファイル」をいじってみたが、いまいち変化があるような感じがしない」
・「でもいつのまにかだいたい動いていた」
というような、なんとも納得のいかない経験として残ります。

BBSなどで質問を出そうものなら、「うちでは動くよ」「あ、結局動いたからいいや」といったように、ろくでもない展開になりかねません。


最近、VC++2005 SP1でも同じ経験をしてしまいました。修正されていないようです。

悲しいプログラマーを増やさないためにも、修正してください、MSさん!

スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

2007.11.16 | Comments(1) | Trackback(0) | プログラミング

コメント

情報

カスタムビルドの設定保存にはいろいろバグがあるようです。
私の環境ではhoge.vcprojファイル内のCommandLine=の部分に本来の文字列に加えて、
などの文字列が追加されて正しく動かなかったのですが、エディタで削除したら正しく動くようになりました。ご参考までに。

2010-06-25 金 16:33:43 | URL | pebble #- [ 編集]

コメントの投稿


秘密にする

新しい記事へ <<  | HOME |  >> 古い記事へ

広告:

カテゴリ展開メニュー

  • 未分類(13)
  • Lua(38)
  • プログラミング(11)
  • 食べ物(3)
  • SPAM(2)
  • ゲーム開発(4)
  • GIS/GPS/GoogleMaps(2)
  • スポーツ(1)
  • Skype API(1)
  • AR(1)

はてブ ランキング

ブログ全体: このWikiのはてなブックマーク数

プロフィール

はむ!

Author:はむ!
よく使う言語・環境:
C++,C,Lua,java,VBA,DB
たまにPHPとかjavascript
血液型:O型

メール: lua%ham.nifty.jp
(%を@に変えてください)
ついったー: @hammmm

Lua関連アンテナ

ブロとも申請フォーム

この人とブロともになる

全記事表示リンク

全ての記事を表示する

ブログ内検索


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。