【関連】

【BCC】C++コンパイラーの謎シリーズ

【bcc32c】BCCSkeltonのbcc32c.exe(Clang文法チェック)対応

【bcc32c】BCCSkeltonのClang対応修正後リンカーエラーとその対応

【bcc32c】BCCSkeltonのClang対応結果

【bcc32c】BCCSkeltonのClang対応結果(追補)

【bcc32c】BCCSkeltonのClang対応の恩恵

【bcc32c】コンパイラーオプション続報

【bcc32c】コンパイラーオプション続々報-DLL(12月22日修正、追記)

 

さて、表面上はMENACEの連続投稿をしていましたが、水面下で新しいプロジェクトを進行させていました。
それはbcc55用のBCCMakerに相当する、bcc32c専用の「バッチグー!」(旧っ!死語ですね)、"BatchGood"という、コンパイル用のバッチファイル生成ツールです。尤も、bcc32c.exeのオプションの使い方が充分にわかっていない状態なので大がかりなことをやるつもりはなく、BCCMakerをダウンサイズして「コンパイルするのはcppファイル一つとrcファイル一つ」に限定し、「暇プログラマーが通常使うようなオプションだけ」に絞ったシンプルな簡易ツールを目指しました。

しかし、その途上でまたまた頭を抱える事態が出来しましたので、今までの振り返りを行います。

(1)先ず、bcc32c(Embarcadero C++ 7.30)でbcc32(Borland C++ 5.5.1)のコマンドオプションを使うと(例:BCCMaker)、

Warning: option '-6' is not supported in Clang-based compiler.(その他'-H-'や'-k'等)
という警告の他に、Turbo Linkerから

Error: Unresolved external '_main' referenced from C:\BORLAND\BCC102\LIB\WIN32C\DEBUG\C0X32.OBJ
というエラーが出ました。(ウィンドウプログラムの"-W"オプションを与えているが、コンソールプログラムと認識されている。)

(2)従って、bcc32cは新しいClang対応のコンパイラーで、文法チェックが厳しくなり、bcc32とはオプションも異なると認識しました。それがBCCSkeltonのClang対応修正につながります。

(3)ここで頭を悩ませたのがbcc32cにはヘルプが二つあることです。具体的には、

①"bcc32c -h"で出てくるもの(これは旧bcc32とほぼ同じものです)と、

②内容は全く異なりますが、"bcc32c -Xdriver --help"(この"-Xdriver"オプションは「その後のオプションを直接Clangコンパイラーに伝える」ものだそうです)で出てくる

   Embarcadero C++ 7.30 for Win32 Copyright (c) 2012-2017 Embarcadero Technologies, Inc.

   OVERVIEW: Embarcadero C/C++ compiler driver for Win32

   USAGE: bcc32c [options] <inputs>

ものです。(後でわかったのですが、これは従来のコンパイラーとは完全に別物のClangコンパイラー、bcc32x.exeのヘルプそのものでした。

    Embarcadero CLANG 7.30 Copyright (c) 2012-2017 Embarcadero Technologies, Inc.
    OVERVIEW: clang LLVM compiler
    USAGE: bcc32x [options] <inputs>

更に困惑したのは、矢張りbcc32cでプログラムをされている方のサイトで、↑の①のヘルプについて「※「-h」で出てくるオプションの一覧はこちらをご覧ください。BCC32C.EXEで有効ではないオプションが分かるようにしています。」とされていたからです。

 

「では、いったい何が正しいんだ???」

 

というのが正直なところであり、それがBatchGoodを作ろうという動機になりました。そして上記の情報を基にBatchGoodのプロトタイプができたのでテストをしたころ、呼び出し規約で躓きます。bcc32cのヘルプファイルには"-pxxx Use Pascal calling convention"と使えるように書かれていますが、Pascal呼び出しなのか?xxxxは何なのか?が分かりません。また-Xdriver --Helpで取得するClangヘルプファイルには"-mcdecl Make CDecl calling convention the default"、"-mfastcall Make FastCall calling convention the default"、"-mstdcall Make StdCall calling convention the default"と表記が違います。更にEmbarcaderoのコンパイラースイッチの解説サイトでは「呼び出し規約」のところで、bcc32では"-pc"、"-ps"、"-pm"ですが、bcc32cでは"-mcdecl"、"-mstdcal"、"-mfastcall"とはっきり書かれています。ということなので、BatchGoodはbcc32cの"-m系"オプションにしたのですが、テスト時になんと"E2075 Incorrect command line option: -mcdecl(-mstdcall、-mfastcall)"というエラーが出ました。E2075は「E2075 type オプションの間違い」とのことで「どうなっているの???」と頭を抱えました。

所が「ひょっとして?」と、このオプションにbcc55の"-p系"のものを使うと、あーら不思議、キレイに通ってしまいます。

これではWEBの情報はうのみにできないと必要な情報は自分でテストして調べることにし、その結果を一覧(注)にまとめたところ、「bcc32cでは使えない」とEmbarcaderoや他の方のサイトで言われていたことが、呼び出し規約の他にも最適化の-Oxオプションや、-R、-vや-yオプション等が実はコンパイラーを通ることが判明しました。

注:BatchGoodのヘルプに掲載します。

 

このことから"-Xdriver"の説明も氷解し、「bcc32cは、bcc32xというClangコンパイラーに従来のbcc32と可能な限り互換性のあるオプションを変換して伝える翻訳機能付きのコンパイラーである」ということです。それは、

bcc32c.exe 17,438KB(翻訳機能の分だけClangコンパイラーよりも大きい)

bcc32x.exe 17,243KB

からも傍証されます。

 

この結果を踏まえて、BatchGoodは要らない情報は排除する次の方針をプログラムの中で謳っています。

【BatchGoodReadMe.txt】

【bcc32c.exe】BCCForm and BCCSkeltonプログラムのコンパイルに関連するオプション

1.必須のオプション
(1)ターゲットオプション(-tX)
   -tC CUIアプリケーション
   -tW Windowsアプリケーション
   -tD Dynamic Link Library(DLL)
   -tR RTL(Run Time Library - cc32c250.dll)を利用するアプリ
(2)ファイルインクルードオプション
   -I<ファイルパス、名>(#includeで読み込むヘッダーファイルのサーチパス)
(3)警告表示オプション(-w、-w-)
   警告を表示する(-w)、表示しない(-w-)
(4)最適化オプション(-Ox)
   -O1 サイズを最適化
   -O2 速度を最適化

2.使う可能性のあるオプション
(1)コンパイルのみオプション(別途リンクが必要)
   -c
(2)呼び出し規約オプション
   -pc C呼び出し
   -ps stdcall呼び出し
   -pm fastcall呼び出し
(3)重複文字列等号オプション
   -d
(4)出力先指定オプション
   -n<出力先パス>
(5)OBJファイルパス、名指定オプション
   -o<OBJファイルパス、名>
(6)enum列挙型をint とするオプション(デフォルト)
   -b
(7)ソースレベルデバッグオプション(デバッグ用)
   -v
(8)ソース行番号オプション(デバッグ用)
   -y

【参考】使う可能性のあるbrc32c.exeコンパイルオプション
-r コンパイルのみ(resファイル出力-別途リンクが必要)

 

なお、前にも書きましたが、デバッグ環境が無いので-v、-yオプションはほとんど不要です。

 

【BatchGoodリリース予定】 本年中

なお、BCCMakerもbcc32cに対応しています。-Wや-WCを使わずきちんと-tW、-tCオプションを与えればビルド可能です。(注)

注:-Od<最適化しない>は-O1,-O2と同じく通りますが、与えなくても結果は同じです。また不要なオプション(-6、-AT、-H、-k、-Q)を与えてもエラーではなく、警告で見逃してくれます。