CMake项目经常碰到,在之前,我们都是使用的CMake自带的命令,先生成
Makefile
文件,然后使用cpptesttrace.exe
跟着make
命令生成BDF文件。但是这样生成的BDF文件里不仅包含项目中的文件,还包含CMake自动生成的文件,有时还会出现文件重复的问题(一般因为项目编译时,文件被拷贝到build文件夹下)。从2020.1版本开始,C/C++test开始对CMake项目有了针对性的支持,本篇文章简单介绍一下CMake项目该如何进行测试。
使用条件 #
C/C++test2020.1版本以上。
具体使用 #
具体使用只有导入项目方式跟其他项目有些区别,导入项目有两种方式:
- 生成json文件方式
- 修改
CMakeLists.txt
文件方式
前者使用简单,仅适用于静态分析,因为生成的json文件中没有包含link信息,而这是所单元测试需要的。后者相对要麻烦,但是支持单元测试。
生成json文件方式 #
这种方式使用的是CMake自带的功能,主要方式是修改CMAKE_EXPORT_COMPILE_COMMANDS选项。两种方式:
- 在CMakeLists.txt文件中将CMAKE_EXPORT_COMPILE_COMMANDS选项设置为ON;
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
- 生成构建脚本时,将其添加到cmake的命令行调用中。
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 <path_to_src>
修改CMakeLists.txt
文件方式 #
- 修改主CMakeLists.txt文件,将
<INSTALL_DIR>/integration/cmake/cpptest-project.cmake
include进来(大部分情况下,其实不需要修改这个cpptest-project.cmake
文件); - 根据情况加上
cpptest_add_executable()
,具体下面说明; - 运行CMake的时候设置
CPPTEST_PROJECT=ON
,实际命令可能是cmake -DCPPTEST_PROJECT=ON ..
; - 使用import projects的方式,将项目导入到workspace中,命令行就使用
-import
参数替代-bdf
参数,这里导入项目的文件地址一般就是项目文件夹,如果找不到,可以在项目下搜索.parasoft
文件; - 后面就是基本的静态分析和单元测试的步骤了。
cpptest_add_executable()
的详细说明 #其实这个部分,我们不仅仅是要添加
cpptest_add_executable()
,如果有需要,我们还需要添加target_include_directories()
和target_link_libraries()
,否则可能缺少链接信息等。
添加的原则是遇到add_executable()
添加cpptest_add_executable()
,遇到target_include_directories()
添加target_include_directories()
,遇到target_link_libraries()
添加target_link_libraries()
。一般情况下,这些都在各个模块的CMakeLists.txt
文件中出现。cpptest_add_executable部分 #
按照用户手册中提到的,cpptest_add_executable部分组成如下:
cpptest_add_executable( <target_name> [CPPTEST_COMPILER_ID <compiler_id>] [CPPTEST_PROJECT_NAME <test_project_name>] [CPPTEST_PROJECT_LOC <test_project_location>] [CPPTEST_PROJECT_FOLDERS <name1=location1> <name2=location2> ...] [EXCLUDE_FROM_ALL] SOURCES <src1.cpp> <src2.cpp> ... | TARGETS <target1> <target2> ... )
这里详细说明一下几个必需要设置的参数:
<target_name>
:这个必需要设置,内容随意,我个人喜欢在原项目名后加_cpptest,但是这个参数会关系到其他地方的设置。另外如果是一个大项目下面包含的多个模块,那么各个模块的<target_name>
需要设置成不同的;SOURCES
:这个与TARGETS
是二选一,后面跟需要跟踪编译信息的文件,有的时候,我们能够从CMakeLists.txt
文件中找到相关的变量,而不需要将涉及的源文件一一列出来;TARGETS
:我个人更喜欢使用TARGETS
,比如CMakeLists.txt
文件中有project(xxx)
,那么我们就可以设置TARGETS xxx
;
target_link_libraries/target_link_libraries部分 #
这部分的设置参照原本的target_link_libraries就行,但是其中的
<target_name>
需要跟上面的对应起来。
比如,原本的是target_link_libraries(main mod1 mod2 mod3)
那么我们就需要再添加
target_link_libraries(main_cpptest mod1 mod2 mod3)