パソコンでプログラミングしよう ウィンドウズC++プログラミング環境の構築
1.6.3.6(15)
統合開発環境のカスタマイズ(1)

統合開発環境のカスタマイズ手順を説明する。

本サイトは32ビット/64ビット開発をターゲットとするため、二つのPOSIXサブシステムをウィンドウズ環境から利用する。特にwxWidgetsライブラリ利用のウィンドウズデスクトップアプリケーション開発において、Code::Blocks標準添付のwxWidgets projectウィザードは本サイトwxWidgetsセットアップにそのままでは対応できず大幅な修正を必要とする。しかしそのウィザードスクリプトは良く書かれているとは言い難く全面的に書き換える結果となった。新たなウィザードはwxWidgets project (K1)として標準添付ウィザードと区別し、本サイトのウィンドウズデスクトップアプリケーションのフレームワークとする。

外部情報

セットアップ手順

  1. グローバル変数の定義
  2. デバッガの定義
  3. コンパイラの定義
  4. PATHの改変
  5. wxWidgetsプロジェクトウィザード(K1)の導入
  6. wxWidgetsプロジェクトウィザード(K1)のカスタマイズ

グローバル変数の定義

[Settings|Global variables]で[Global Variable Editor]ダイアログを開き[Current Set]をdefaultのままとする。[Current variable|New]を押し新たなグローバル変数mingw32を作成し、以下の表に従い[Built-in fields]の各メンバ変数を定義する。同様にグローバル変数mingw64を作成し、各メンバ変数を定義する。

メンバ mingw32 mingw64
base C:\msys64\mingw32 C:\msys64\mingw64
include $(#mingw32)\include $(#mingw64)\include
lib $(#mingw32)\lib $(#mingw64)\lib
obj $(#mingw32)\obj $(#mingw64)\obj
bin $(#mingw32)\bin $(#mingw64)\bin
覚え書き
baseの定義は必須だが、他はデフォルト設定と同じなので省略しても良い。objメンバに対応するディレクトリは本サイト運用で存在せず利用も予定しない。

デバッガの定義

[Settings|Debugger]で[Debugger settings]ダイアログを開き左側ツリービューの[GDB/CDB debugger]ノードを選択する。[...|Create Config]を押してGDB (32bit)とGDB (64bit)という二つの新しいコンフィグを作成する。当初よりあるDefaultコンフィグを含め以下のように設定する。なお[...|Executable path]入力テキストボックスはキー入力の度にファイル存在を背景色でフィードバックするが、グローバル変数をキー入力するとその度に[Global Variable Editor]ダイアログが開くという面倒な事態を招く。従って[...|Executable path]へは以下設定をコピーアンドペーストする。

設定 Default GDB (32bit) GDB (64bit)
Executable path $(#mingw32.bin)\gdb.exe $(#mingw32.bin)\gdb.exe $(#mingw64.bin)\gdb.exe
Arguments
Debugger Type GDB GDB GDB
覚え書き
Defaultコンフィグは不要だが削除できないので念のためGDB (32bit)と同じ設定にしている。

コンパイラの定義

[Settings|Compiler]で[Global compiler settings]ダイアログの[Global compielr settings]ページを開く。[...|Selected compiler]でGNU GCC Compilerを選択し[...|Selected compiler|Copy]を押してGNU GCC Compiler (32bit)という新しいコンパイラを定義する。[...|Selected compiler|Set as default]を押してこれを新たなデフォルトコンパイラにする。[...|Toolchain executables]を以下の表に従い設定する。同様の手順でGNU GCC Compiler (64bit)を定義設定するが、[...|Selected compiler|Set as default]は押さずデフォルトコンパイラとしない。

設定 GNU GCC Compiler (32bit) GNU GCC Compiler (64bit)
Compiler's installation directory $(#mingw32) $(#mingw64)
Program Files C compiler i686-w64-mingw32-gcc.exe x86_64-w64-mingw32-gcc.exe
C++ compiler i686-w64-mingw32-g++.exe x86_64-w64-mingw32-g++.exe
Linker for dynamic libs i686-w64-mingw32-g++.exe x86_64-w64-mingw32-g++.exe
Linker for static libs ar.exe ar.exe
Debugger GDB/CDB debugger : GDB (32bit) GDB/CDB debugger : GDB (64bit)
Resource compiler windres.exe windres.exe
Make program mingw32-make.exe mingw32-make.exe
覚え書き
デバッガDefaultコンフィグも含め、デフォルトを32ビットとする必然性はなく64ビットでも問題ない。後に導入するwxWidgetsプロジェクトウィザードの生成プロジェクトはプロジェクトコンパイラ(実際のコンパイラはターゲット毎に設定されプロジェクトコンパイラが用いられる事は無い)を32ビットとするが、これも同様である。本サイトはこれら全てを32ビットに統一するが特別の理由は無い。
コンパイラ実行ファイルは別名が同ディレクトリに多く存在しどれを使用するかは趣味の問題となろう。例えばgcc.exeとg++.exeはそれぞれのサブシステムディレクトリに存在し、これらを用いればより統一感のある設定になる。

ワークスペースは依然とインストール時のデフォルトコンパイラを用い通知領域に[Environment Error]をポップアップするが、Code::Blocks再起動で解決する。

PATHの改変

二つのPOSIXサブシステムに起因する不具合を回避するためコマンドサーチパスを変更する。

[Settings|Environment]で[Environment settings]ダイアログの[Environment variables]ページを開く。[...|Select/Create/Clone/Remove envvar - set|Create]を押してmingw32_mingw64という環境変数セットを作成する。[...|Add]を押して以下の環境変数を定義する。[Confirmation]ダイアログは[はい]で応える。

Key Value
PATH $(#mingw32.bin);$(#mingw64.bin);%PATH%

[...|Select/Create/Clone/Remove envvar - set]がmingw32_mingw64を選択している状態でダイアログを閉じ、アプリケーショングローバルな環境変数セットとする。

wxWidgetsプロジェクトウィザードの導入(K1)

Code::Blocks標準添付のwxWidgets projectウィザードを置き換える本サイト作成のウィザードwxWidgets project (K1)を導入する。

  • 本サイトのセットアップ、特に32ビット/64ビット開発に対応する。
  • ランタイムライブラリは静的リンクをデフォルトとする。

以下のzipファイルをダウンロードする。

解凍し生成されるwxwidgets_k1ディレクトリを以下に移動する。

  • C:\Users\user\AppData\Roaming\CodeBlocks\share\codeblocks\templates\wizard

[File|New|Project]で[New from template]ダイアログの[Projects]ページを開く。[...|Category]が<All categories>である事を確認し、一覧されるウィザードの任意アイコン(例えばwxWidgets project)を右クリックしてコンテキストメニュー[Edit global registration script]を実行し、[Information]ダイアログには[OK]で応える。エディタに開かれたconfig.scriptを編集して、wxwidgets_k1ディレクトリをproject wizardとbuild target wizardの二箇所に追加する。なおこの機会に一生使いそうもないウィザードをコメントアウトしているが、そのままでも一向に構わない。

/*
* This file is part of the Code::Blocks IDE and licensed under the GNU General Public License, version 3
* http://www.gnu.org/licenses/gpl-3.0.html
*
* $Revision: 10722 $
* $Id: config.script 10722 2016-01-28 14:39:15Z mortenmacfly $
* $HeadURL: svn+ssh://killerbot@svn.code.sf.net/p/codeblocks/code/branches/release-17.xx/src/plugins/scriptedwizard/resources/config.script $
*/
//
// Main wizards configuration script.
// Here, we register all the available wizards.
//
function RegisterWizards()
{
//
// project wizards
//
RegisterWizard(wizProject, _T("empty"), _T("Empty project"), _T("Console"));
//RegisterWizard(wizProject, _T("fortran/app"), _T("Fortran application"), _T("Fortran"));
//RegisterWizard(wizProject, _T("fortran/lib"), _T("Fortran library"), _T("Fortran"));
//RegisterWizard(wizProject, _T("fortran/dll"), _T("Fortran DLL"), _T("Fortran"));
RegisterWizard(wizProject, _T("console"), _T("Console application"), _T("Console"));
//RegisterWizard(wizProject, _T("d"), _T("D application"), _T("D language"));
if (PLATFORM == PLATFORM_MSW)
{
//RegisterWizard(wizProject, _T("directx"), _T("Direct/X project"), _T("2D/3D Graphics"));
RegisterWizard(wizProject, _T("dll"), _T("Dynamic Link Library"), _T("Console"));
//RegisterWizard(wizProject, _T("sys"), _T("Kernel Mode Driver"), _T("Native"));
}
//RegisterWizard(wizProject, _T("fltk"), _T("FLTK project"), _T("GUI"));
//RegisterWizard(wizProject, _T("glfw"), _T("GLFW project"), _T("2D/3D Graphics"));
//RegisterWizard(wizProject, _T("glut"), _T("GLUT project"), _T("2D/3D Graphics"));
//RegisterWizard(wizProject, _T("gtk"), _T("GTK+ project"), _T("GUI"));
//RegisterWizard(wizProject, _T("irrlicht"), _T("Irrlicht project"), _T("2D/3D Graphics"));
//RegisterWizard(wizProject, _T("java"), _T("Java application"), _T("Java"));
//RegisterWizard(wizProject, _T("lf"), _T("Lightfeather project"), _T("2D/3D Graphics"));
//RegisterWizard(wizProject, _T("matlab_csf"), _T("Matlab project"), _T("Console"));
//RegisterWizard(wizProject, _T("opencv"), _T("OpenCV project"), _T("Console"));
//RegisterWizard(wizProject, _T("opengl"), _T("OpenGL project"), _T("2D/3D Graphics"));
//RegisterWizard(wizProject, _T("ogre"), _T("Ogre project"), _T("2D/3D Graphics"));
RegisterWizard(wizProject, _T("plugins"), _T("Code::Blocks plugin"), _T("Code::Blocks"));
//RegisterWizard(wizProject, _T("qt4"), _T("QT4 project"), _T("GUI"));
//RegisterWizard(wizProject, _T("qt4dll"), _T("QT4 (shared) project"), _T("GUI"));
//RegisterWizard(wizProject, _T("qt5"), _T("QT5 project"), _T("GUI"));
//RegisterWizard(wizProject, _T("sdl"), _T("SDL project"), _T("2D/3D Graphics"));
//RegisterWizard(wizProject, _T("sdl2"), _T("SDL2 project"), _T("2D/3D Graphics"));
//RegisterWizard(wizProject, _T("sfml"), _T("SFML project"), _T("2D/3D Graphics"));
//if (PLATFORM == PLATFORM_MSW)
// RegisterWizard(wizProject, _T("smartwin"), _T("SmartWin project"), _T("GUI"));
RegisterWizard(wizProject, _T("staticlib"), _T("Static library"), _T("Console"));
//if (PLATFORM == PLATFORM_MSW)
// RegisterWizard(wizProject, _T("stlport"), _T("STL port application"), _T("Console"));
RegisterWizard(wizProject, _T("sharedlib"), _T("Shared library"), _T("Console"));
if (PLATFORM == PLATFORM_MSW)
RegisterWizard(wizProject, _T("win32gui"), _T("Win32 GUI project"), _T("GUI"));
RegisterWizard(wizProject, _T("wxwidgets"), _T("wxWidgets project"), _T("GUI"));
RegisterWizard(wizProject, _T("wxwidgets_k1"), _T("wxWidgets project (K1)"),_T("GUI"));
//
// build target wizards
//
RegisterWizard(wizTarget, _T("console"), _T("Console"), _T("Console"));
RegisterWizard(wizTarget, _T("staticlib"), _T("Static library"), _T("Console"));
if (PLATFORM == PLATFORM_MSW)
RegisterWizard(wizTarget, _T("dll"), _T("Dynamic Link Library"), _T("Console"));
RegisterWizard(wizTarget, _T("wxwidgets"), _T("wxWidgets"), _T("GUI"));
RegisterWizard(wizTarget, _T("wxwidgets_k1"), _T("wxWidgets (K1)"), _T("GUI"));
//RegisterWizard(wizProject, _T("arduino"), _T("Arduino Project"), _T("Embedded Systems"));
//RegisterWizard(wizProject, _T("arm"), _T("ARM Project"), _T("Embedded Systems"));
//RegisterWizard(wizProject, _T("avr"), _T("AVR Project"), _T("Embedded Systems"));
//RegisterWizard(wizProject, _T("msp430"), _T("MSP430 Project"), _T("Embedded Systems"));
//RegisterWizard(wizProject, _T("tricore"), _T("TriCore Project"), _T("Embedded Systems"));
//RegisterWizard(wizProject, _T("ppc"), _T("PowerPC Project"), _T("Embedded Systems"));
//RegisterWizard(wizProject, _T("mcs51"), _T("MCS51 Project"), _T("Embedded Systems"));
//
// file wizards
//
RegisterWizard(wizFiles, _T("empty_file"), _T("Empty file"), _T("C/C++"));
RegisterWizard(wizFiles, _T("c_file"), _T("C/C++ source"), _T("C/C++"));
RegisterWizard(wizFiles, _T("d_source"), _T("D source"), _T("D language"));
RegisterWizard(wizFiles, _T("h_file"), _T("C/C++ header"), _T("C/C++"));
RegisterWizard(wizFiles, _T("fortran/file"), _T("Fortran source"), _T("Fortran"));
RegisterWizard(wizFiles, _T("java/file"), _T("Java source"), _T("Java"));
}
function RegisterWizard(type, folder, title, category)
{
// syntax:
// AddWizard(type, title, category, script, template_png, wizard_png, xrc)
Wizard.AddWizard(type,
title,
category,
folder + _T("/wizard.script"),
folder + _T("/logo.png"),
folder + _T("/wizard.png"),
folder + _T("/wizard.xrc"));
}

Code::Blocksを再起動し[File|New|Project]で[New from template]ダイアログの[Projects]ページを開き、wxWidgets project (K1)ウィザードが追加されていることを確認する。

覚え書き
オリジナルのconfig.scriptはC:\Program Files (x86)\CodeBlocks\share\CodeBlocks\templates\wizard、修正されたconfig.scriptはC:\Users\user\AppData\Roaming\CodeBlocks\share\codeblocks\templates\wizardに保存され、バックアップは必要ない。

wxWidgetsプロジェクトウィザード(K1)のカスタマイズ

[File|New|Project]で[New from template]ダイアログの[Projects]ページを開き、wxWidgets project (K1)ウィザードアイコンを右クリックしてコンテキストメニュー[Edit this script]でそのスクリプトをエディタに開く。以下の行を探し出しあなたの名前に修正する。

...
g_ProjAuthor=_T("Takeshi Kodama");
...

wxWidgetsディレクトリ設定を確認し必要ならスクリプトを修正する。