9.6 ビルドシステム設定手順
本章では、QTEを用いたテストを実行するために必要となる、ビルドシステムへの設定追加、ビルド手順、および関連する注意事項について解説します。
9.6.1 QTE用ビルド設定
QTEの機能を利用するには、ユーザーが使用する既存のビルド設定(例: Makefile, CMakeLists.txt)に、QTE所定のビルドオプションやライブラリのリンク処理を組み込む必要があります。
9.6.1.1 ビルド設定テンプレートファイル
ビルド設定を簡素化するため、QTEでは専用のテンプレートファイルを準備しています。これらのファイルは"prepare"コマンド実行時にビルドディレクトリ (*1) へ出力されます。(*2)
- Makefile用: qte.make
- CMake用: qte.cmake
これらのファイルを各ビルド設定ファイルにインクルードすることで、QTEの利用に必要なビルド設定を容易化することができます。
- *1: ビルドディレクトリの詳細に関しては、「9.3.3.1 プロファイルディレクトリの構成」をご参照ください。
- *2: オプション"qte-api-libfile-path"が設定されていない場合、これらのテンプレートファイルは生成されません。オプション"qte-api-libfile-path"の詳細に関しては、「9.4.9 ビルド設定(build.json)」をご参照ください。
9.6.1.2 ビルド設定の容易化(マクロ機能)
テンプレートファイルをインクルードすることにより、コンパイルオプションやリンクフラグなどの追加を容易にするためのマクロが利用可能となります。
以下は、QTEが準備するマクロとその機能の一覧です。
Table: QTEで追加が必要なMakefileオプション一覧
| マクロ | 機能概要 |
|---|---|
| QTE_SRC_FLAGS | カバレッジ計測に必要なビルドオプションを自動で追加するマクロです。本マクロを記述すると、以下のように動作します。 • GCCカバレッジモード使用時: GCCのカバレッジ機能を有効にするための"-coverage"オプションが指定されます。さらに、最適化をOFFにするための"-O0"オプションが指定されます。 • 機能安全カバレッジモード使用時: オプション"execution-mode"が"1"または"3"の場合: "-I"オプションが指定され、カバレッジ計測に必要なインクルードディレクトリパスが自動的に指定されます。さらに、最適化をOFFにするための"-O0"オプションが指定されます。 オプション"execution-mode"が"99"の場合: このマクロを記述しても何も指定されません。 |
| QTE_API | 本マクロをテスト対象実行バイナリのリンク箇所に記述することで、QTEでテスト実行に必要なライブラリが自動追加されます。 |
| QTE_LINK_FLAGS | 本マクロをテスト対象実行バイナリのリンク箇所に追加することで、カバレッジ計測に必要なリンクオプションが自動追加されます。 • GCCカバレッジ動作時: GCCのカバレッジ機能を有効にするための"-coverage"オプションが指定されます。 • 機能安全カバレッジ動作時: このマクロを記述しても何も指定されません。 |
*1: Google Test出力値をレポート出力するためのオプション "QTE_GTEST_FLAGS"は、 QTE R1.2.0以前では設定が必要でしたが、QTE R1.3.0以降では省略可能に変更されました。
9.6.1.3 設定例
9.6.1.3.1 Makeの場合
1. 既存ビルド設定のバックアップ
ユーザが作成したMake設定に修正を加える前に、既存のビルド設定ファイル(Makefile)をバックアップします。
コマンド実行例
$ cp Makefile Makefile.bak
2. マクロ機能を利用したビルド設定の追加
マクロ機能を利用して、QTE用のコンパイルオプション、リンクオプションを追加します。
ビルド設定ファイル(Makefile)に下記の修正を行います。
- ビルド設定テンプレートファイルをインクルードします。
- テスト対象ソースのコンパイル箇所 ( *.oを生成する箇所 ) に "QTE_SRC_FLAGS"マクロを追加します。
- 実行バイナリ生成ルールの依存ファイルに"QTE_API"マクロを追加します。
- 実行バイナリ生成リンク箇所に"QTE_LINK_FLAGS"マクロを追加します。
ビルド設定の追加例
Makefileの設定例を以下に示します。
# For QTE Setting include ../qte.make CXX := g++-9 TARGET := DEMO_GAIO_GCC_COV CXXFLAGS := -std=c++14 LDLIBS := /lib/x86_64-linux-gnu/libpthread.so.0 GTEST_DIR := ../../googletest-release-1.8.0/googletest GTEST_INC_PATH := -I$(GTEST_DIR) -isystem $(GTEST_DIR)/include GTEST_HEADERS := $(GTEST_DIR)/include/gtest/*.h \ $(GTEST_DIR)/include/gtest/internal/*.h GTEST_SRCS_ := $(GTEST_DIR)/src/*.cc $(GTEST_DIR)/src/*.h $(GTEST_HEADERS) debug: CXXFLAGS += -O0 debug: $(TARGET) release: CXXFLAGS += -O3 release: $(TARGET) # Make Google Test Libraries gtest-all.o : $(GTEST_SRCS_) $(CXX) -std=c++14 $(GTEST_INC_PATH) -pthread -c $(GTEST_DIR)/src/gtest-all.cc gtest.a : gtest-all.o $(AR) $(ARFLAGS) $@ $^ gtest_main.o : $(GTEST_SRCS_) $(CXX) -std=c++14 $(GTEST_INC_PATH) -c $(GTEST_DIR)/src/gtest_main.cc gtest_main.a : gtest-all.o gtest_main.o $(AR) $(ARFLAGS) $@ $^ # Make Test Driver myGoogleTest.o : myGoogleTest.cpp $(CXX) -std=c++14 $(GTEST_INC_PATH) -pthread -c -o $@ $^ # Make Coverage Target myApp.o : myApp.cpp $(CXX) $(CXXFLAGS) $(QTE_SRC_FLAGS) -c -o $@ $^ # Make Test Target $(TARGET): myApp.o myGoogleTest.o gtest.a gtest_main.a $(QTE_API) $(CXX) -std=c++14 $(QTE_LINK_FLAGS) -o $@ $^ $(LDLIBS) clean: rm -f $(TARGET) rm -f ./*.a rm -f ./*.o
*1 : コンパイラにGCC9.4を使用した場合
foreachの様なMakefile関数を使用している場合の注意点
SOURCES = $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.cpp))
上記のような形式でディレクトリ配下のソースをまとめて指定しており、1ソースごとのコンパイルルールを指定していない場合、以下のようにCXXFLAGSにQTE用のオプションを加えてください。
テスト対象ソースのコンパイルルールがない場合:
CXXFLAGS+=$(QTE_SRC_FLAGS)
9.6.1.3.2 CMakeの場合
1. 既存ビルド設定のバックアップ
ユーザが作成したCMake設定に修正を加える前に、既存のビルド設定ファイル(CMakeList.txt)をバックアップします。
コマンド実行例
$ cp CMakeList.txt CMakeList.txt.bak
2. マクロ機能を利用したビルド設定の追加
マクロ機能を利用して、QTE用のコンパイルオプション、リンクオプションを追加します。
ビルド設定ファイル(CMakeList.txt)に下記の修正を行います。
- ビルド設定テンプレートファイルをインクルードします。
- テスト対象ソースのコンパイル箇所 ( *.oを生成する箇所 ) に "QTE_SRC_FLAGS"マクロを追加します。
- VSCode連携機能*1を使用時のみ、相対パスでソースをコンパイルするオプション(-fmacro-prefix-map)を追加します。
- 実行バイナリ生成ルールの依存ファイルに"QTE_API"マクロを追加します。
*1: 「VSCode連携機能」の詳細については、「10. 機能詳細(VSCode連携機能)」を参照してください。
ビルド設定の追加例
CMakeList.txtの設定例を以下に示します。
# Project properties cmake_minimum_required(VERSION 3.5) project(DEMO_GAIO_GCC_COV) set(CMAKE_VERBOSE_MAKEFILE ON) # Include qte.cmake file include(../../qte.cmake) # Include path settings include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../googletest-release-1.8.0/googletest/include") include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../googletest-release-1.8.0/googletest") #include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../..") include_directories("${CMAKE_CURRENT_SOURCE_DIR}/src") # Build Gtest lib add_library(gtest STATIC ${CMAKE_CURRENT_SOURCE_DIR}/../../googletest-release-1.8.0/googletest/src/gtest-all.cc) set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/../../googletest-release-1.8.0/googletest/src/gtest-all.cc PROPERTIES COMPILE_FLAGS "-pthread") add_library(gtest_main STATIC ${CMAKE_CURRENT_SOURCE_DIR}/../../googletest-release-1.8.0/googletest/src/gtest_main.cc) # Build Test target executable add_library(my_app STATIC ${CMAKE_CURRENT_SOURCE_DIR}/myApp.cpp) target_compile_options(my_app PUBLIC ${QTE_SRC_FLAGS}) target_compile_options(my_app PUBLIC -fmacro-prefix-map=${CMAKE_CURRENT_SOURCE_DIR}=.) # Target executable build add_executable(DEMO_GAIO_GCC_COV ${CMAKE_CURRENT_SOURCE_DIR}/myGoogleTest.cpp) target_link_libraries(DEMO_GAIO_GCC_COV gtest gtest_main my_app ${QTE_API} /lib/x86_64-linux-gnu/libpthread.so.0)
9.7 テスト実行前の準備
本章では、QTEの"build"コマンドを利用してテスト実行オブジェクトをビルドする場合に必要な準備について説明します。
9.7.1 ソースファイルの配置
テスト対象ソース一式、Google Test ドライバーソースをワークスペース直下の "source"ディレクトリに配置します。ワークスペース外に配置したソースファイル(*)についても、テスト対象とすることができます。 このディレクトリに格納したテスト対象ソース一式、Google Testドライバーソースは、"source"ディレクトリからの相対パスにより、ビルド可能である必要があります。
* ワークスペース外にソースファイル配置するためのオプション"external-source-dir"については、「9.4.6 ワークスペース設定(workspace.json)」を参照してください。
9.7.2 ビルドを実行するディレクトリ
9.7.2.1 機能安全カバレッジモード使用時
機能安全カバレッジモードでは、"prepare"コマンド実行時に、QTEプロファイルディレクトリ直下の"source"ディレクトリにカバレッジ計測コード一式を生成します。そのため、QTEプロファイルディレクトリ直下の"source"ディレクトリ内で、ビルドを実施する必要があります。
9.7.2.2 GCCカバレッジモード使用時
GCCカバレッジモードでは、ワークスペース直下の "source"ディレクトリ内でビルドを実施します。ただし、オプション"external-source-dir"を使用して、他のディレクトリを指定している場合には、指定したディレクトリ内で、ビルドを実施します。
9.7.3 testbinbuild.shの編集
"build"コマンド実行時にtestbinbuild.shが実行されます。下記にtestbinbuild.shの例を示します。
9.7.3.1 Makeの場合
#!/bin/bash #------------------------------------------------------------------------------ # # File Name : testbinbuild.sh # Summary : This script is called by the 'qte-cov build' command. # Usage : # By writing processes in this script file, you can execute user-specific # processes during the execution of the qte-cov command. For more details # on how to write in this file, please refer to the user manual. #------------------------------------------------------------------------------ # Do not change the following six lines. EXECUTION_MODE=$1 WORKSPACE=$2 PROJECT=$3 PROFILE=$4 EXTERNAL_SOURCE_DIR=$5 BUILD_DIR=$6 cd $BUILD_DIR/GA/src <-- ビルドディレクトリへ移動 make all -f Makefile_qte <-- ビルド実行
9.7.3.2 CMakeの場合
#!/bin/bash
#------------------------------------------------------------------------------
#
# File Name : testbinbuild.sh
# Summary : This script is called by the 'qte-cov build' command.
# Usage :
# By writing processes in this script file, you can execute user-specific
# processes during the execution of the qte-cov command. For more details
# on how to write in this file, please refer to the user manual.
#------------------------------------------------------------------------------
# Do not change the following six lines.
EXECUTION_MODE=$1
WORKSPACE=$2
PROJECT=$3
PROFILE=$4
EXTERNAL_SOURCE_DIR=$5
BUILD_DIR=$6
rm -rf ${BUILD_DIR}/GA/src/build <-- クリーン
mkdir ${BUILD_DIR}/GA/src/build <-- ビルドディレクトリ作成
cd ${BUILD_DIR}/GA/src/build <-- ビルドディレクトリへ移動
cmake .. <-- ビルドシステムの生成
cmake --build . <-- ビルド実行
9.7.4 コンパイラ最適化オプションの注意点
機能安全カバレッジモードで、カバレッジ計測用コードを自動挿入したソースコードをビルドする際には、コンパイラの最適化オプションはOFFにしてください。最適化を適用してビルドを行った場合には、以下のような事象が発生することがあります。
- カバレッジ計測に必要な自動挿入コードがオブジェクト化されず、正しい計測結果が得られない
- inline指定をした関数が、関数としてオブジェクト化されず、他のビルドモジュールから参照した場合にリンクエラーが発生する
ビルド設定の容易化のマクロ「QTE_SRC_FLAGS」を使用している場合は、自動的にコンパイラの最適化オプションをOFFにするコンパイルオプションが追加されます。詳細は、「9.6.1.2 ビルド設定の容易化(マクロ機能)」を参照してください。
(c)2020-2025 GAIO TECHNOLOGY All rights reserved
