CppUTest を導入してみる

Table of Contents

  1. CppUTest を導入してみる:CppUTest:
    1. CppUTest のインストール(MSYS2環境)
      1. pacman によるインストール
      2. 本家のソースコードからビルド

CppUTest を導入してみる :CppUTest:

 最近、Google test を導入したばかりなのですが、TDD本 (「James W. Grenning (蛸島昭之監訳). テスト駆動開発による組み込みプログラミン グ.オライリー・ジャパン」)を購入して、その中でCppUTestがツールとして 使われていました。

 本に載っているサンプルコードもビルド環境付きでダウンロード可能だった ので勉強にはいいかな、っていうのと、組み込み系で使えそうなので CppUTest もありですね。

 というわけで先日インストールした GoogleTest に加えて CppUTest の環境 も立ち上げます。

CppUTest のインストール(MSYS2環境)

pacman によるインストール

本家( https://cpputest.github.io/ )ではソースからビルドする手法が示されているのですが、MSYS のパッケージインストーラでインストールできそうだったので深く考えずにインストールしてみます。

$ pacman -S  mingw64/mingw-w64-x86_64-cpputest

とりあえずインストールは成功。c:/msys64/mingw64/lib の下に、 libCppUTest.a, libCppUTestExt.a が作られているので大丈夫。

インクルードファイルも C:\msys64\mingw64\include\CppUTest 以下に展開されています。

本家のソースコードからビルド

 上述の本で使われているサンプルコードは、オライリーの紹介ページからジャンプした以下からダウンロード可能です(2022.6.18時点)。

参考: https://pragprog.com/titles/jgade/test-driven-development-for-embedded-c/

中身をみればわかるのですがソースコードのみでなくビルド環境一式が入手できます。著者はCppUTest開発者の一人らしいのでサンプルコードのビルド環境はCppUTestの開発環境に依存してそうな雰囲気なのが見て取れます。

 なので、本家のソースコードからCppUTestをMSYS2環境でビルドして、使え るようにしてみます。

※諸々の事情で MSYS2 環境で使わないといけないところが正直足かせなので す・・・。

入手先はこちらです。

参考: https://cpputest.github.io/

本家の README.md に

You'll need to do the following to get started:

Building from source (unix-based, cygwin, MacOSX):

git clone git://github.com/cpputest/cpputest.git
cd cpputest_build
autoreconf .. -i
../configure
make
You can use make install if you want to install CppUTest system-wide

と書いてあるのでこの通りにやってみます。

git clone するでも、zip で入手するでもどちらでもいいので適当なディレク トリに展開します。

 展開したディレクトリの下に "cpputest_build" というビルド用のディレク トリがあるのでそこに移動し、autoreconf を実行します。

・・・って、自分の環境にはなかったので autotools を pacman でインストー ルします。

※環境によってはインストールが不要だったり、逆に他のパッケージをインス トールしなければならないかもしれません。でも、都度必要なパッケージを pacman を使ってインストールするだけです。

# pacman -S mingw64/mingw-w64-x86_64-autotools

 改めて autoreconf を実行すると、無事に configure が生成されました。 いつくも warning は出ていますが、obsolete(廃止)にちなんだものっぽい ので気にしないことにします。

 # autoreconf .. -i
configure.ac:11: warning: The macro `AC_LIBTOOL_DLOPEN' is obsolete.
configure.ac:11: You should run autoupdate.
m4/ltoptions.m4:113: AC_LIBTOOL_DLOPEN is expanded from...
configure.ac:11: the top level

(~中略~)

../autoconf-2.71/lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from...
../autoconf-2.71/lib/autoconf/general.m4:1534: AC_ARG_ENABLE is expanded from...
configure.ac:418: the top level

 次に configure の実行。標準出力に以下のようなログが出力され、 Makefileが無事生成されました。

 いくつかのオプションが no になっていて使えないですが初学者の私がすぐ に使うことはないでしょうし、必要になったら使えるようにすればいいだけな のでOKとします。

 # # ../configure
configure: loading site script /etc/config.site
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes

(~中略~)

CppUTest Version 4.0

Current compiler options:
   CC:                                  gcc
   CXX:                                 g++
   CC version:                          11.3.0
   CXX version:
   LD:                                  C:/msys64/mingw64/x86_64-w64-mingw32/bin/ld.exe
   Default CFLAGS:                      -g -O2
   Default CXXFLAGS:                    -g -O2
   CppUTest CFLAGS:                       -Wno-c++11-long-long -Wno-long-long -Wall -Wextra -Wshadow -Wswitch-default -Wswitch-enum -Wconversion -pedantic -Wsign-conversion -Wstrict-prototypes -Wno-disabled-macro-expansion -Wno-padded -Wno-reserved-id-macro -Wno-keyword-macro
   CppUTest CXXFLAGS:                    -nostdinc++  -Wno-missing-exception-spec -include ../include/CppUTest/MemoryLeakDetectorNewMacros.h  -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-c++14-compat -Wno-c++11-long-long -Wno-long-long -Wall -Wextra -Wshadow -Wswitch-default -Wswitch-enum -Wconversion -pedantic -Wsign-conversion -Woverloaded-virtual -Wno-disabled-macro-expansion -Wno-padded -Wno-reserved-id-macro -Wno-keyword-macro -Wno-global-constructors -Wno-exit-time-destructors -Wno-weak-vtables -Wno-old-style-cast
   CppUTest CPPFLAGS:                    -include ../include/CppUTest/MemoryLeakDetectorMallocMacros.h -I ../include
   CppUTest LDFLAGS:
   CppUTest LIB:                           -lpthread

Features configured in CppUTest:
   C++ standard used:                   default
   Memory Leak Detection:               yes
   Compiling extensions:                yes
   Use Long Long (if available):        yes
   Disable CppUTest compile/link flags: yes
   Address sanitizer:                   no

   Using Standard C++ Library:          no
   Using Standard C Library:            yes

   Generating map file:                 no
   Compiling w coverage info:           no

----------------------------------------------------------------

次はmakeの実行。

 無事に、libCppUTest.a、libCppUTestExt.a が生成された他、CppUTestで利 用できるスクリプト類も展開先のディレクトリに格納されています。本家の README.md で紹介されている通りの方法で msys2 環境でもビルドできました。

 # # make
make  all-am
make[1]: ディレクトリ '/c/home/share/cpputest/cpputest-latest/cpputest_build' に入ります
g++ -DHAVE_CONFIG_H -I. -I..   -include ../include/CppUTest/MemoryLeakDetectorMallocMacros.h -I ../include     -nostdinc++  -Wno-missing-exception-spec -include ../include/CppUTest/MemoryLeakDetectorNewMacros.h  -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-c++14-compat -Wno-c++11-long-long -Wno-long-long -Wall -Wextra -Wshadow -Wswitch-default -Wswitch-enum -Wconversion -pedantic -Wsign-conversion -Woverloaded-virtual -Wno-disabled-macro-expansion -Wno-padded -Wno-reserved-id-macro -Wno-keyword-macro -Wno-global-constructors -Wno-exit-time-destructors -Wno-weak-vtables -Wno-old-style-cast   -g -O2 -MT src/CppUTest/lib_libCppUTest_a-CommandLineArguments.o -MD -MP -MF src/CppUTest/.deps/lib_libCppUTest_a-CommandLineArguments.Tpo -c -o src/CppUTest/lib_libCppUTest_a-CommandLineArguments.o `test -f 'src/CppUTest/CommandLineArguments.cpp' || echo '../'`src/CppUTest/CommandLineArguments.cpp

(~中略~)

ar cru lib/libCppUTestExt.a src/CppUTestExt/lib_libCppUTestExt_a-CodeMemoryReportFormatter.o src/CppUTestExt/lib_libCppUTestExt_a-GTest.o src/CppUTestExt/lib_libCppUTestExt_a-IEEE754ExceptionsPlugin.o src/CppUTestExt/lib_libCppUTestExt_a-MemoryReportAllocator.o src/CppUTestExt/lib_libCppUTestExt_a-MemoryReporterPlugin.o src/CppUTestExt/lib_libCppUTestExt_a-MemoryReportFormatter.o src/CppUTestExt/lib_libCppUTestExt_a-MockActualCall.o src/CppUTestExt/lib_libCppUTestExt_a-MockExpectedCall.o src/CppUTestExt/lib_libCppUTestExt_a-MockExpectedCallsList.o src/CppUTestExt/lib_libCppUTestExt_a-MockFailure.o src/CppUTestExt/lib_libCppUTestExt_a-MockNamedValue.o src/CppUTestExt/lib_libCppUTestExt_a-MockSupport.o src/CppUTestExt/lib_libCppUTestExt_a-MockSupportPlugin.o src/CppUTestExt/lib_libCppUTestExt_a-MockSupport_c.o src/CppUTestExt/lib_libCppUTestExt_a-OrderedTest.o
C:\msys64\mingw64\bin\ar.exe: `u' modifier ignored since `D' is the default (see `U')
ranlib lib/libCppUTestExt.a
make[1]: ディレクトリ '/c/home/share/cpputest/cpputest-latest/cpputest_build' から出ます

pacman で並行して CppUTest をインストールしてしまったので今回はビルド までで終了です。

 ちなみにしばらく私はビルドしたこの本家のCppUTestを使うときには、自分 のプロジェクトごとに環境用のシェルスクリプトを作成して毎回 source して 使うようにしようと思っています。面倒っちゃ面倒ですが、どこまで CppUTest を使うか自分でもわからないのでしばらくはこういった運用をして いこうと思います。

※CppUTest を使うときには、環境変数 CPPUTEST_HOME を設定し、パスを通し て使います。使うたびに以下のようなシェルスクリプトを(一度)sourceして 使う、ということになります。

export CPPUTEST_HOME="c:/home/share/cpputest/cpputest-latest"
export PATH=$PATH:${CPPUTEST_HOME}