CppUTestのスクリプトの使い方

# 目的
* CppUtestのスクリプトの使い方をまとめる。
* 理由
  * CppUTestのスクリプトは便利そうだけれどドキュメントがなくて一見しただけでは使い方がほとんどわからない。
  * 前調べたのに、しばらくほったらかしているとすぐに使い方を忘れるのでメモを兼ねてまとめてしまう。

# バージョン
* Ubuntu 14.04
* cpputest_3.4-3

# よく使うもの
* 最初に
    * NewProject
* 次にプロジェクトのディレクトリルートで実行
    * NewPackageDirs
* 必要に応じて(C)
    * NewCFunction \${functionName} \${packageName}
    * NewCInterface \${interfaceName} \${packageName}（フェイク有）
    * NewCIoDriver \${iodriverName} \${packageName}
    * NewCmiModule \${cmiModuleName} \${packageName}
    * NewCModule \${moduleName} \${packageName}
* 必要に応じて(C++)
    * NewClass \${className} \${packageName}
    * NewInterface \${interfaceName} \${packageName}（モック有）

# サブディレクトリ
* CppUnitTemplates：テンプレートディレクトリ。用途はよくわからない。
* UnityTemplates：テンプレートディレクトリ。Unity（CppUTestじゃないテストハーネスの1つ）を使うときに使う？
* VS2010Templates：テンプレートディレクトリ。VisualStudio2010を使用する際のプロパティシートらしい。詳細は[WalkThrough_VS21010.docx](https://github.com/cpputest/cpputest/blob/master/docs/WalkThrough_VS21010.docx)参照。
* convertToUnity：CppUTestからUnityに変換するrubyスクリプト群
* templates：デフォルトのテンプレートディレクトリ

# スクリプト（使うやつ）
## NewProject.sh プロジェクトの生成
* NewProject.sh \${PROJECT_NAME}
* ${PROJECT_NAME}で指定した名前でプロジェクトが生成される。
* ${PROJECT_NAME}に「-」が使用されている場合は、`.project`ファイル以外で使用されるときに、「_」に置換して使用される。
* テンプレート：templates/ProjectTemplate
* `.cproject`, `.project`, `Makefile`および、`include`,`src`,`tests`ディレクトリが生成される。

## NewPackageDirs.sh パッケージ用のディレクトリの生成
* NewPackageDirs.sh ${package}
* 下記のディレクトリ（空）を生成する。
    * src/${package}
    * include/${package}
    * tests/${package}

## NewCFunction.sh 関数？を追加する。
* NewCFunction.sh \${functionName} \${packageName}
* \${functionname}.c,.h, \${functionname}Test.cppが生成される。
* 関数？を生成
    * include/package1/Function1.h
    * src/package1/Function1.c
    * tests/package1/Function1Test.cpp

## NewCInterface.sh インタフェースとフェイクを生成
* NewCInterface.sh \${interfaceName} \${packageName}
* インタフェースとフェイクを生成。
    * include/package1/Interface1.h
    * tests/package1/FakeInterface1.c
    * tests/package1/FakeInterface1.h
    * tests/package1/FakeInterface1Test.cpp

## NewCIoDriver.sh IOドライバを生成
* NewCIoDriver.sh \${iodriverName} \${packageName}
* IOドライバを生成
    * include/package1/Iodriver1.h
    * src/package1/Iodriver1.c
    * tests/package1/Iodriver1Test.cpp
* NewCFunctionに比べるとCreate, Destroyのインタフェースがはじめから追加されている、IO.hがインクルードされている、テストでMock_IOを使用しているなどの違いがある。

## NewCmiModule.sh Cmiモジュール？の生成
* NewCmiModule.sh \${cmiModuleName} \${packageName}
* CmiModuleの生成
    * include/package1/Cmimodule1.h
    * src/package1/Cmimodule1.c
    * tests/package1/Cmimodule1Test.cpp
* 最初のCはC言語を表すかもしれないので、miモジュールかもしれない。cmiもしくはmiが何を示すかはよくわからない。
* 内容としてはtypedef structで型定義してCreate時にメモリを確保してポインタを返すようになっている。
    * 型の詳細は.cファイルで定義されているため使用する側からはオブジェクト？の詳細は隠蔽されている。

## NewCModule.sh モジュールの生成
* NewCModule.sh \${moduleName} \${packageName}
* モジュールの生成
    * include/package1/Module1.h
    * src/package1/Module1.c
    * tests/package1/Module1Test.cpp
* Create,Destroyのインタフェースが有り、NewCIoDriverに近い。IO.h, Mock_IOは使用していない。

## NewClass.sh クラス(C++)の生成
* NewClass.sh \${className} \${packageName}
* クラス(C++)の生成
    * include/package2/Class1.h
    * src/package2/Class1.cpp
    * tests/package2/Class1Test.cpp

## NewInterface.sh インタフェース（C++）の生成
* NewInterface.sh \${interfaceName} \${packageName}
* インタフェース(C++)の生成
    * include/package2/Interface1.h
    * src/package2/Interface1.cpp
    * tests/package2/MockInterface1.h
    * tests/package2/MockInterface1Test.cpp

# スクリプト（あまり使わない？やつ）
## GenerateSrcFiles.sh テンプレートからのソース生成スクリプト
* GenerateSrcFiles.sh \${templateRootName} \${srcSuffix} \${mock} \${className} \${packageName}
* 各種スクリプトから参照されている。直接使うことはあまりない？
* テンプレートディレクトリ
    * \${CPP_SOURCE_TEMPLATES}で指定していない場合は\${CPPUTEST_HOME}/scripts/templatesが使用される。
* 参照しているスクリプト
    * NewCFunction.sh
    * NewCBaseModule.sh
    * NewCIoDriver.sh
    * NewCInterface.sh
    * NewInterface.sh
    * NewCmiModule.sh
    * NewCModule.sh
* ${templateRootName} テンプレートファイルを指定する。

## InstallScripts.sh インストールスクリプト
* 名前の通りCppUTestをインストールする際のインストールスクリプト
* 実態は元の場所のままでシンボリックリンクがインストール先に生成される。
* インストール対象
    * 普通にユーザーが使うのはこれらのスクリプトだけだと思われる。(ちなみにNewCModuleと同一内容のNewCBaseModuleは外れている)
    * NewCIoDriver
    * NewClass
    * NewInterface
    * NewCModule
    * NewCmiModule
    * NewProject
    * NewLibrary
    * NewPackageDirs
    * NewCInterface
    * NewCFunction
    * NewHelp"
* ${EXE_DIR}の指定がない場合は`/usr/local/bin`にインストールされる。

## NewCBaseModule.sh （明記されていないがおそらくdeprecated）
* NewCModule.shと全く同じ。インストール対象からは外されている。
* 説明省略。

## NewHelp.sh 用途不明
* 意味がわからない。
* 見た感じインストールスクリプトと同じようなことを実施しているように見える。実行しないほうが良い気がする。

## NewLibrary.sh ライブラリの生成？
* NewLibrary.sh \${LIBRARY}
* ${LIBRARY}で指定した名前でライブラリを生成。
    * ./${LIBRARY}/以下に生成される。
* のはずだが、${CPPUTEST_HOME/scripts/templates/ProjectTemplate/Project}ディレクトリが存在しないため機能しない・・・。
* 内部的にはNewProjectと近いことを実行しようとしているように見える。

## RefactorRenameIncludeFile.sh 名前の変更？
* RefactorRenameIncludeFile.sh \${from_name} \${to_name}
* src, tests, include, mock以下についてincludeファイルのリネームを行う。
* ${to_name}が既に存在しているときはエラーになる。
* SVNが意識されていて、svn mvが実行される（ぉ）。

## ReleaseCppUTest.sh CppUTestのリリース用スクリプト
* ユーザーは使わなくて良い。

## checkForCppUTestEnvVariable.sh 環境変数CPPUTEST_HOMEの確認用関数「定義」
* checkForCppUTestEnvVariable() が「定義されている」が、シェルスクリプトを実行するだけでは関数が実行されない。
* 独自でビルドスクリプトを作るときに環境変数が定義されていない場合はビルドを止めるなどの使い方をするのだと思う。
* ちなみに`GenerateSrcFiles.sh`の中でほぼ同様の関数を「定義して」使っている。（使えよ！）

## filterGcov.sh カバレッジ関係？
* filterGcov.sh \${INPUT_FILE} \${ERROR_FILE} \${OUTPUT_FILE} \${TEST_RESULT}
* `gcov`を扱う便利スクリプト。
    * ${OUTPUT_FILE}.htmlの名前でレポートが出力されるのだと思う。
    * `gcov`使ったこと無くてよくわかりません、ごめんなさい。

## reformat.sh AStyleでの整形？
* reformat.sh \${TARGET_DIR}
* たぶんAStyle(Artistic Style)を使用した整形スクリプト
* おそらくディレクトリ以下の`.h`, `.c`, `.cpp`を対象に下記のオプションで整形をかける。
    * `ASTYLE_OPTIONS="--convert-tabs --indent=spaces=4 --indent-classes --indent-switches --indent-preprocessor --style=ansi"`
    * フォーマットの指定はできなさそう。

## squeeze.sh 重複した空白を消すsedスクリプト？
* 下記の内容のみのsedスクリプト（？）
* よくわからないけどたぶん重複した空白を1つのスペースに置き換えるのだと思う。

```
#!/bin/sed -f
s/[ 	][ 	]*/ /g
```

## travis_ci_build.sh Travisの実行スクリプト？
* ${BUILDTOOL}の内容によってautotoolsとcmakeに対応
* Travis使ったことがないのでよくわかりません。
    * `../configure`, `cmake .. options`のような使い方をしているので、ビルドディレクトリの中から実行することを想定されている？