如何将外部(来自 git)cmake 项目克隆并集成到本地项目中
How to clone and integrate external (from git) cmake project into local one
我在尝试使用 Google 测试时遇到问题。
有很多关于如何使用 ExternalProject_Add
将 gtest 添加到项目中的手册,但是其中大部分描述了一种基于使用 gtest 下载 zip 压缩包并构建它的方法。
我们知道 gtest 是 github-hosted 和 cmake-based 项目。所以想找原生的cmake方式。
如果这是一个 header-only 项目,我会这样写:
cmake_minimum_required(VERSION 2.8.8)
include(ExternalProject)
find_package(Git REQUIRED)
ExternalProject_Add(
gtest
PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/ext
GIT_REPOSITORY https://github.com/google/googletest.git
TIMEOUT 10
UPDATE_COMMAND ${GIT_EXECUTABLE} pull
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
LOG_DOWNLOAD ON
)
ExternalProject_Get_Property(gtest source_dir)
set(GTEST_INCLUDE_DIR ${source_dir}/googletest/include CACHE INTERNAL "Path to include folder for GTest")
set(GTEST_ROOT_DIR ${source_dir}/googletest CACHE INTERNAL "Path to source folder for GTest")
include_directories(${INCLUDE_DIRECTORIES} ${GTEST_INCLUDE_DIR} ${GTEST_ROOT_DIR})
message(${GTEST_INCLUDE_DIR})
并从我的 cmake 项目中添加此脚本,例如:
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake.modules/")
include(AddGTest)
....
add_dependencies(${PROJECT_NAME} gtest)
但是这需要一个构建步骤。
应该如何实施?
- 通过将
BUILD_COMMAND
添加到 ExternaProject_Add
并与生成的库链接?
- 或者通过将 gtest 的 cmakelists 包含到我的项目中,像这样:
add_subdirectory (${CMAKE_SOURCE_DIR}\ext\src\gtest\googletest\CMakeLists.txt)
这是不正确的方法,因为在项目加载时文件夹不存在。
- 还有其他方法吗?
什么是correct/prefer方式?
我会选择第一种方法。您不需要指定构建命令,因为默认情况下使用 cmake。这可能看起来像:
cmake_minimum_required(VERSION 3.0)
project(GTestProject)
include(ExternalProject)
set(EXTERNAL_INSTALL_LOCATION ${CMAKE_BINARY_DIR}/external)
ExternalProject_Add(googletest
GIT_REPOSITORY https://github.com/google/googletest
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION}
)
include_directories(${EXTERNAL_INSTALL_LOCATION}/include)
link_directories(${EXTERNAL_INSTALL_LOCATION}/lib)
add_executable(FirstTest main.cpp)
add_dependencies(FirstTest googletest)
target_link_libraries(FirstTest gtest gtest_main pthread)
我不知道这是否是 correct/preferred 方式,如果有的话。如果您想实施第二种方法,您必须先使用 execute_process 下载代码。
我在尝试使用 Google 测试时遇到问题。
有很多关于如何使用 ExternalProject_Add
将 gtest 添加到项目中的手册,但是其中大部分描述了一种基于使用 gtest 下载 zip 压缩包并构建它的方法。
我们知道 gtest 是 github-hosted 和 cmake-based 项目。所以想找原生的cmake方式。
如果这是一个 header-only 项目,我会这样写:
cmake_minimum_required(VERSION 2.8.8)
include(ExternalProject)
find_package(Git REQUIRED)
ExternalProject_Add(
gtest
PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/ext
GIT_REPOSITORY https://github.com/google/googletest.git
TIMEOUT 10
UPDATE_COMMAND ${GIT_EXECUTABLE} pull
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
LOG_DOWNLOAD ON
)
ExternalProject_Get_Property(gtest source_dir)
set(GTEST_INCLUDE_DIR ${source_dir}/googletest/include CACHE INTERNAL "Path to include folder for GTest")
set(GTEST_ROOT_DIR ${source_dir}/googletest CACHE INTERNAL "Path to source folder for GTest")
include_directories(${INCLUDE_DIRECTORIES} ${GTEST_INCLUDE_DIR} ${GTEST_ROOT_DIR})
message(${GTEST_INCLUDE_DIR})
并从我的 cmake 项目中添加此脚本,例如:
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake.modules/")
include(AddGTest)
....
add_dependencies(${PROJECT_NAME} gtest)
但是这需要一个构建步骤。
应该如何实施?
- 通过将
BUILD_COMMAND
添加到ExternaProject_Add
并与生成的库链接? - 或者通过将 gtest 的 cmakelists 包含到我的项目中,像这样:
add_subdirectory (${CMAKE_SOURCE_DIR}\ext\src\gtest\googletest\CMakeLists.txt)
这是不正确的方法,因为在项目加载时文件夹不存在。
- 还有其他方法吗?
什么是correct/prefer方式?
我会选择第一种方法。您不需要指定构建命令,因为默认情况下使用 cmake。这可能看起来像:
cmake_minimum_required(VERSION 3.0)
project(GTestProject)
include(ExternalProject)
set(EXTERNAL_INSTALL_LOCATION ${CMAKE_BINARY_DIR}/external)
ExternalProject_Add(googletest
GIT_REPOSITORY https://github.com/google/googletest
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION}
)
include_directories(${EXTERNAL_INSTALL_LOCATION}/include)
link_directories(${EXTERNAL_INSTALL_LOCATION}/lib)
add_executable(FirstTest main.cpp)
add_dependencies(FirstTest googletest)
target_link_libraries(FirstTest gtest gtest_main pthread)
我不知道这是否是 correct/preferred 方式,如果有的话。如果您想实施第二种方法,您必须先使用 execute_process 下载代码。