使用cmake的ExternalProject_Add相關(guān)命令,實現(xiàn)源碼獲取、編譯、集成到本地項目中的動態(tài)集成,不需要先安裝gtest,而是直接將gtest編譯到當(dāng)前目錄中,從而解決了項目部署時gtest的依賴問題。
做法參考:
https://github.com/google/googletest/blob/master/googletest/README.md
Googletest的repo上有較為詳細(xì)的介紹,這里簡單梳理下如何加入到自己的項目中。
先列出我的項目目錄結(jié)構(gòu):
.
├── test
│ ├── CMakeLists.txt
│ ├── CMakeLists.txt.in
│ └── unittest
│ ├── CMakeLists.txt
│ └── test.cpp
└── thirdparty
└── gtest
└── googletest-release-1.8.0.zip
- test項目目錄下,copy下邊的內(nèi)容,并另存為CMakeLists.txt.in
cmake_minimum_required(VERSION 3.1.0)
project(googletest-download NONE)
include(ExternalProject)
ExternalProject_Add(googletest
URL ${CMAKE_SOURCE_DIR}/thirdparty/gtest/googletest-release-1.8.0.zip
# URL https://github.com/google/googletest/archive/release-1.8.0.zip
URL_MD5 adfafc8512ab65fd3cf7955ef0100ff5
SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/googletest-src"
BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/googletest-build"
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
TEST_COMMAND ""
)
這里說明下,下載的目錄可以是網(wǎng)絡(luò)鏈接,也可以是本地的一個文件地址,這里為了減少網(wǎng)絡(luò)下載的負(fù)擔(dān)(實際上是為了防止被墻),使用本地的文件。
Googletest推薦是直接從git上clone,沒必要,repo很大的,不如直接下載指定release的源碼。
- test項目目錄下,copy下邊的內(nèi)容,另存為CMakeLists.txt
cmake_minimum_required(VERSION 3.1.0)
project(test)
configure_file(CMakeLists.txt.in googletest-download/CMakeLists.txt)
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
RESULT_VARIABLE result
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download )
if(result)
message(FATAL_ERROR "CMake step for googletest failed: ${result}")
endif()
execute_process(COMMAND ${CMAKE_COMMAND} --build .
RESULT_VARIABLE result
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download )
if(result)
message(FATAL_ERROR "Build step for googletest failed: ${result}")
endif()
# Prevent overriding the parent project's compiler/linker
# settings on Windows
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
# Add googletest directly to our build. This defines
# the gtest and gtest_main targets.
add_subdirectory(${CMAKE_CURRENT_BINARY_DIR}/googletest-src
${CMAKE_CURRENT_BINARY_DIR}/googletest-build
EXCLUDE_FROM_ALL)
# The gtest/gtest_main targets carry header search path
# dependencies automatically when using CMake 2.8.11 or
# later. Otherwise we have to add them here ourselves.
if (CMAKE_VERSION VERSION_LESS 2.8.11)
include_directories("${gtest_SOURCE_DIR}/include")
endif()
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/unittest)
- 在unittest目錄下,copy下邊的內(nèi)容,另存為CMakeLists.txt
cmake_minimum_required(VERSION 3.1.0)
project(unittest)
# Now simply link against gtest or gtest_main as needed.
add_executable(utest test.cpp)
target_link_libraries(utest gtest_main)
enable_testing()
- 在unittest目錄下,copy 下邊的內(nèi)容,另存為test.cpp
#include "gtest/gtest.h"
TEST(TestSuiteName, TestName) {
EXPECT_EQ(1, 1);
}
至此,配置完成,可以在unittest目錄下依賴gtest實現(xiàn)自己的測試用例了。
如何編譯呢?
mkdir build && cd build
cmake ..
make