|
本サイトは移転しました。旧アドレスからのリダイレクトは2025年03月31日(月)まで有効です。
|
🛈 | ✖ |
統合開発環境Code::Blocksの機能補助として導入する自作ツールの使用方法を説明する。
C++プログラミング環境の構築目的で以下の自作ツールを公開する。これらはCode::BlocksのToolsメニューあるいはプレ/ポストビルドステップから利用される。
名称 | 実行ファイル | 機能 | タイプ |
---|---|---|---|
KGetText | KGetText.exe | GNU gettextの実行単純化 | コンソール |
KUdCheck | KUdCheck.exe | コンパイルビルドされるファイルの更新判断 | コンソール |
KAutoVer | KAutoVer.exe | バージョン番号の統一管理 | GUIを持つコンソール |
KGitWVer | KGitWVer.exe | Git for Windowsの実行単純化 | GUIを持つコンソール |
全てコンソールアプリケーションで標準出力する。オプションは起動時のコマンドラインで与えるが、KAutoVerとKGitWVerはGUIメインウィンドウとなるダイアログで起動後に変更または設定できる。標準出力は全てサイト作成者が自己理解するための英語風表記で、これは利用するCode::Blocksの[Tool Output]ウィンドウの表示がASCII文字に限定されている事を理由とする。ダイアログも標準出力とCode::Blocksとの統一感から英語風表記のままとする。
GNU gettextツールチェーンの実行を単純化し、GetとEditと名付ける二つのコマンドに集約する。
コマンド | オプション | 機能 |
---|---|---|
Get | -g [ --get ] | ソースコード/インクルードファイル(*.cpp、*.c、*.h)を解析してテキスト形式翻訳ファイル(*.po)を作成/更新する。 |
Edit | -e [ --edit ] | *.poを編集してからバイナリ形式翻訳ファイル(*.mo)を作成する。 |
ヘルプ表示(--help)する場合を除きどちらかのコマンドオプションは必須だが、同時指定はできない。翻訳対象の文字列を取得するファイルはプロジェクトディレクトリ(-d)内の*.cpp、*.c、*.hに制限される。翻訳対象の文字列を検索するキーワードはxgettextデフォルトと"_"に固定される。
MSYS2定義のロケールはPOSIX互換コンソールで確認できる。文字コード(encoding)は英数小文字のみに縮約されて例えばUTF-8はutf8と表示される。
ja_JP.CP932ロケールは存在しない一方でGNU gettextはja_JP.SJISロケールでCP932文字コードを選択する。文字コード変換ライブラリ(iconv)ではSJIS文字コードとCP932文字コードが異なっている(0x5Cが円マークかバックスラッシュ)点を改めて注意しよう。以下に環境変数LANGとロケール(-l)との組み合わせで作成されるpoファイルの言語(Language)、文字コード(Content-typeのcharset)、コメント文字列を示す。
LANG | ロケール(-l) | Language | charset | コメント |
---|---|---|---|---|
ja_JP.UTF-8 | ja_JP.UTF-8 | ja | UTF-8 | 日本語 |
ja_JP | ja | EUC-JP | 日本語 | |
ja_JP.SJIS | ja | CP932 | 日本語 | |
ja_JP.CP932 | ja | ASCII | 英語 | |
ko_KR.UTF-8 | ko | ASCII | 英語 | |
en_US.UTF-8 | ja_JP.UTF-8 | ja | ASCII | 英語 |
ja_JP | ja | EUC-JP | 日本語 | |
ja_JP.SJIS | ja | CP932 | 日本語 | |
ja_JP.CP932 | ja | ASCII | 英語 | |
ko_KR.UTF-8 | ko | ASCII | 英語 | |
ko_KR.UTF-8 | ja_JP.UTF-8 | ja | ASCII | 英語 |
ja_JP | ja | EUC-JP | 日本語 | |
ja_JP.SJIS | ja | CP932 | 日本語 | |
ja_JP.CP932 | ja | ASCII | 英語 | |
ko_KR.UTF-8 | ko | UTF-8 | 韓国語 |
存在しないja_JP.CP932ロケールはエラーなのでASCII文字コードを出力する。ja_JPロケールとja_JP.SJISロケールはLANGに関係なくEUC-CPとCP932を出力する。ja_JP.UTF-8ロケールはLANGと一致する場合のみUTF-8を出力し、そうでない場合はエラーでASCIIを出力する。すなわちGNU gettextでUTF-8文字コードを翻訳ターゲットとするにはLANGとロケールを一致させなければならない。
ビルドターゲットに前回ビルド後に更新されたファイルがあるかどうかをチェックし、ファイルのタイムスタンプをデータファイルに記憶する。前回のビルドターゲットが異なる場合は必ずファイル更新があったものとして扱う。CheckとUpdateと名付ける2ステップで構成する。
ステップ | オプション | 機能 |
---|---|---|
Check | -c [ --check-only ] | ファイル更新を確認する。 |
Update | -u [ --update-only ] | タイムスタンプデータファイルを更新する。 |
これらのオプションは重複指定できる。どちらも与えない場合は重複指定(-c -u)と解釈する。終了コードを示す。
終了コード | 意味 |
---|---|
0 | ファイルが更新された。 |
1 | エラーが発生した。 |
2 | -cオプションでファイルは更新されていない。 |
3 | -uオプションでファイルは更新されていない。 |
バッチファイル、Code::BlocksのToolsメニューおよびプレ/ポストビルドステップは終了コードを判断してファイル更新時のみの処理を行う。
KUdCheckはKAutoVerと組み合わせて使用する。KAutoVerはファイル更新の無いビルドターゲットでも統一管理対象ファイルに書き込まれるファイルバージョン番号を更新して不要なビルドを行うため、事前にKUdCheckでファイル更新をチェックし終了コード0の場合のみKAutoVerを実行させる。終了コード2あるいは3の場合はKAutoVerを実行させないが、コマンドプロンプトのエラー表示を避けるため最後に0にリセットする。if not ERRORLEVEL 2 exit 1がそのリセットコマンドとして機能するが直感的でない。これらコマンドはコマンドシェル構文の論理オペレータ(&&、||)で組み合わされる。
通常はビルドターゲットのプレ/ポストビルドステップに定義してバージョン番号(例えばビルド回数)を自動更新する。-cおよび-uオプションの設定でバージョン番号更新をビルド前で行うかビルド後で行うかを選択できる。ビルトイン変数$(TARGET_NAME)でビルドターゲット名を取得し、グローバル変数$(#codeblocks.bin)で自作ツール実行形式ファイルのディレクトリを取得する。二重の角括弧[[...]]はスクリプト展開(Code::Block Manual 3.3 Script expansion)でビルドターゲットに属する全てのファイルをリストする。
バージョン更新 | ステップ | 実行 |
---|---|---|
ビルド前に行う | プレビルド | cmd /c $(#codeblocks.bin)\KUdCheck -t $(TARGET_NAME) [[ local t=GetProjectManager().GetActiveProject().GetBuildTarget(ReplaceMacros(_T("$(TARGET_NAME)")));for (local i=0;i<t.GetFilesCount();++i) {print(t.GetFile(i).relativeFilename+_T(" "));} ]] && $(#codeblocks.bin)\KAutoVer -s $(TARGET_NAME) -i 0.0.0.0(1) --silent || if not ERRORLEVEL 2 exit 1 |
ポストビルド | - | |
ビルド後に行う | プレビルド | cmd /c $(#codeblocks.bin)\KUdCheck -c -t $(TARGET_NAME) [[ local t=GetProjectManager().GetActiveProject().GetBuildTarget(ReplaceMacros(_T("$(TARGET_NAME)")));for (local i=0;i<t.GetFilesCount();++i) {print(t.GetFile(i).relativeFilename+_T(" "));} ]] && $(#codeblocks.bin)\KAutoVer -s $(TARGET_NAME) --silent || if not ERRORLEVEL 2 exit 1 |
ポストビルド | cmd /c $(#codeblocks.bin)\KUdCheck -u -t $(TARGET_NAME) && $(#codeblocks.bin)\KAutoVer -s $(TARGET_NAME) --no-update-target -i 0.0.0.0(1) --silent || if not ERRORLEVEL 2 exit 1 |
バージョン番号をバージョン番号データファイル(-f)から読み込み、更新指示(-i)、ソフトウェアステータス指定(-s)および日付指定(--date)に基づきバージョン番号を更新する。--no-update-targetオプションが無ければテンプレートファイルディレクトリ(-t)とその階層下ディレクトリにある全テンプレートファイルのプレースホルダー文字列を更新バージョン番号で置換したバージョン番号設定ファイルを作成し、プロジェクトディレクトリ(-d)へ相対パスを維持して保存する。バージョン番号設定ファイルは--no-read-onlyオプションが無い限り変更不可属性を持つ。オプションは実行直後に表示するダイアログで変更可能で、--silentオプションはそのダイアログ表示を抑止する。
終了コード | 意味 |
---|---|
0 | 実行に成功した。 |
1 | エラーが発生した。 |
2 | ダイアログで実行をキャンセルした。 |
バージョン番号データファイルを新しく作成するときにプロジェクト固有のGUID文字列を生成してファイルに保存する。これは固定値でオプションやダイアログで変更できない。アプリケーション固有IDとして利用し主にInno SetupスクリプトのAppId値に用いられる。
ステータス | 定義済み省略形 |
---|---|
Debug | d |
Release | r |
Debug32 | d32 |
Release32 | r32 |
Debug64 | d64 |
Release64 | r64 |
テンプレートファイルに用いるプレースホルダー文字列を一覧する。
プレースホルダー | 置換対象 | 例 |
---|---|---|
#{DATE} | 日 | 16 |
#{MONTH} | 月 | 12 |
#{MONTH_SHORT_NAME} | 月(短い英語名) | Dec |
#{YEAR} | 年 | 2019 |
#{YEAR_2DIGIT} | 年(2桁表記) | 19 |
#{STATUS} | ソフトウェアステータス | Release32 |
#{STATUS_SHORT} | ステータス省略形 | r32 |
#{MAJOR} | メジャーバージョン | 0 |
#{MINOR} | マイナーバージョン | 0 |
#{BUILD} | ビルドナンバー | 5 |
#{REVISION} | リビジョン | 9 |
#{BUILD_COUNT} | ビルド回数 | 72 |
#{GUID} | プロジェクト固有のGUID文字列 | 410eb0f2-2b7f-4b7c-b47f-490603303911 |
Git for Windowsの実行を単純化する。ヘルプ表示(--help)あるいはステータス表示(-s)以外でリポジトリへのコミットを行う。--autoversionオプションでKAutoVerのバージョン番号データファイルを参照してコミットメッセージ、タグ、アーカイブファイル名にバージョン番号を反映できる。オプションは実行直後に表示するダイアログで変更可能で、--silentオプションはそのダイアログ表示を抑止する。
終了コード | 意味 |
---|---|
0 | 実行に成功した。 |
1 | エラーが発生した。 |
2 | ダイアログで実行をキャンセルした。 |
リポジトリを持たないプロジェクトディレクトリ(-d)で実行すると最初に致命的エラー(fatal error)を表示するが、KGitWVerはリポジトリを自動作成するためこのエラーは無視して良い。管理対象ファイルが未更新(working tree clean)でかつ--amendオプションを持たない場合コミットは失敗する。コミット失敗時はタグ(-t)やアーカイブファイル(\–archive)は作成されない。
コミットメッセージ(-c)、タグ(-t)、アーカイブファイル名(--archive)のプレースホルダー文字列はKAutoVerと共通である。
本サイトからダウンロードする自作ツールのアーカイブファイルは各ツールのCode::Blocksプロジェクトファイルを同梱する。ビルドオプションの概要をまとめる。
ダイナミックリンクなのでPATHがC:\msys64\mingw32\binを含む、あるいは実行形式ファイルをC:\msys64\mingw32\binに配置する必要がある。Code::Blocks内なら統合開発環境のカスタマイズ(1)がPATHを設定して問題ない。依存するダイナミックリンクライブラリが変更される可能性があるため、MSYS2をアップデートしたら全てのツールをリビルドする。スタティックリンクとするにはコンパイルオプション-staticを加えかつリンクライブラリを全てスタティック用に変更するが、結果として他のスタティックリンクライブラリを追加する必要が生じる場合がある。