当 repo (googletest) 有多个库时如何处理 CMake ExternalProject?
How to handle CMake ExternalProject when repo (googletest) has multiple libraries?
当项目的 repo 不是我要使用的库的根目录时,我如何在 CMake 中添加外部项目,但实际上包含两个目录,每个目录都是我想在我的库中使用的 repos 的根目录项目?
我正在努力建立一个使用 Google Test 和 Mock 进行测试的框架 CMake 项目,但是当我尝试下载 google 测试 repo (https://github.com/google/googletest)使用 ExternalProject_Add
,它在构建时抱怨找不到项目的源代码。好吧,那是因为 Google 已经将 googletest 和 googlemock 合并到一个项目中,只是现在是两个项目。
repo 的一些文件结构:
googletest-master/
├──[...no CMakeFiles.txt exists here...]
├──googletest/
│ ├──src/
│ └──CMakeFiles.txt
└──googlemock/
├──src/
└──CMakeFiles.txt
当我执行以下操作时...
ExternalProject_Add(
gtest
GIT_REPOSITORY https://github.com/google/googletest.git
TIMEOUT 10
INSTALL_COMMAND ""
LOG_DOWNLOAD ON
LOG_CONFIGURE ON
LOG_BUILD ON
PREFIX "googletest-master"
)
...它将实际的回购下载到 googletest-master/src/gtest
因为我在回购前加上 "googletest-master" 以使其远离我的主要源代码,并且它假设我正在下载一个只有源代码的项目,并且该源代码位于根目录中。
所以我想完成两件事:
- 将 repo 下载到 googletest-master 目录,就像我在那里克隆 repo 或下载 zip GitHub 并解压一样。
- 在我的 CMake 项目中构建并包含 googletest 和 googlemock
我有一个 repository,我在其中使用 CMake 导入 gtest 和 gmock 库,就像您想要的那样,但使用旧的 SVN 源存储库而不是 GIT。
我认为关键是只获取 gmock 的源代码,因为它包含 gtest 源代码,然后导出两个库。
CMakeLists.txt 看起来像这样:
cmake_minimum_required(VERSION 2.8)
include(ExternalProject)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(GMOCK_VERSION "1.7.0")
set(GMOCK_DIR "${CMAKE_CURRENT_BINARY_DIR}/gmock-${GMOCK_VERSION}")
ExternalProject_Add(project_gmock
SVN_REPOSITORY http://googlemock.googlecode.com/svn/tags/release-${GMOCK_VERSION}
PREFIX ${GMOCK_DIR}
CMAKE_ARGS -DCMAKE_C_COMPILER:PATH=${CMAKE_C_COMPILER} -DCMAKE_CXX_COMPILER:PATH=${CMAKE_CXX_COMPILER}
# Disable update step
UPDATE_COMMAND ""
# Disable install step
INSTALL_COMMAND ""
)
ExternalProject_Get_Property(project_gmock source_dir)
ExternalProject_Get_Property(project_gmock binary_dir)
include_directories(${source_dir}/gtest/include)
add_library(gtest STATIC IMPORTED)
set_property(TARGET gtest PROPERTY IMPORTED_LOCATION ${binary_dir}/gtest/libgtest.a)
add_dependencies(gtest project_gmock)
add_library(gtest_main STATIC IMPORTED)
set_property(TARGET gtest_main PROPERTY IMPORTED_LOCATION ${binary_dir}/gtest/libgtest_main.a)
add_dependencies(gtest_main project_gmock)
include_directories(${source_dir}/include)
add_library(gmock STATIC IMPORTED)
set_property(TARGET gmock PROPERTY IMPORTED_LOCATION ${binary_dir}/libgmock.a)
add_dependencies(gmock project_gmock)
add_library(gmock_main STATIC IMPORTED)
set_property(TARGET gmock_main PROPERTY IMPORTED_LOCATION ${binary_dir}/libgmock_main.a)
add_dependencies(gmock_main project_gmock)
include_directories(${cpp_utest_SOURCE_DIR}/src)
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")
#add_executable(utests )
#target_link_libraries(utests gmock_main gmock gtest pthread)
您需要单个 下载步骤,但两个 构建步骤。不同的 ExternalProject_add
命令调用不能 共享 步骤,但您可以将所有这些步骤安排到不同的调用中,并在它们之间具有适当的依赖关系:
# Single download(git clone)
ExternalProject_Add(
googletest-master
DOWNLOAD_DIR "googletest-master/src" # The only dir option which is required
GIT_REPOSITORY https://github.com/google/googletest.git
TIMEOUT 10
LOG_DOWNLOAD ON
# Disable all other steps
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
)
# Build gtest from existing sources
ExternalProject_Add(
gtest
DOWNLOAD_COMMAND "" # No download required
SOURCE_DIR "googletest-master/src/googletest" # Use specific source dir
PREFIX "googletest-master" # But use prefix for compute other dirs
INSTALL_COMMAND ""
LOG_CONFIGURE ON
LOG_BUILD ON
)
# gtest should be build after being downloaded
add_dependencies(gtest googletest-master)
# Build gmock from existing sources
ExternalProject_Add(
gmock
DOWNLOAD_COMMAND "" # No download required
SOURCE_DIR "googletest-master/src/googlemock" # Use specific source dir
PREFIX "googletest-master" # But use prefix for compute other dirs
INSTALL_COMMAND ""
LOG_CONFIGURE ON
LOG_BUILD ON
)
# gmock should be build after being downloaded
add_dependencies(gmock googletest-master)
当项目的 repo 不是我要使用的库的根目录时,我如何在 CMake 中添加外部项目,但实际上包含两个目录,每个目录都是我想在我的库中使用的 repos 的根目录项目?
我正在努力建立一个使用 Google Test 和 Mock 进行测试的框架 CMake 项目,但是当我尝试下载 google 测试 repo (https://github.com/google/googletest)使用 ExternalProject_Add
,它在构建时抱怨找不到项目的源代码。好吧,那是因为 Google 已经将 googletest 和 googlemock 合并到一个项目中,只是现在是两个项目。
repo 的一些文件结构:
googletest-master/
├──[...no CMakeFiles.txt exists here...]
├──googletest/
│ ├──src/
│ └──CMakeFiles.txt
└──googlemock/
├──src/
└──CMakeFiles.txt
当我执行以下操作时...
ExternalProject_Add(
gtest
GIT_REPOSITORY https://github.com/google/googletest.git
TIMEOUT 10
INSTALL_COMMAND ""
LOG_DOWNLOAD ON
LOG_CONFIGURE ON
LOG_BUILD ON
PREFIX "googletest-master"
)
...它将实际的回购下载到 googletest-master/src/gtest
因为我在回购前加上 "googletest-master" 以使其远离我的主要源代码,并且它假设我正在下载一个只有源代码的项目,并且该源代码位于根目录中。
所以我想完成两件事:
- 将 repo 下载到 googletest-master 目录,就像我在那里克隆 repo 或下载 zip GitHub 并解压一样。
- 在我的 CMake 项目中构建并包含 googletest 和 googlemock
我有一个 repository,我在其中使用 CMake 导入 gtest 和 gmock 库,就像您想要的那样,但使用旧的 SVN 源存储库而不是 GIT。
我认为关键是只获取 gmock 的源代码,因为它包含 gtest 源代码,然后导出两个库。
CMakeLists.txt 看起来像这样:
cmake_minimum_required(VERSION 2.8)
include(ExternalProject)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(GMOCK_VERSION "1.7.0")
set(GMOCK_DIR "${CMAKE_CURRENT_BINARY_DIR}/gmock-${GMOCK_VERSION}")
ExternalProject_Add(project_gmock
SVN_REPOSITORY http://googlemock.googlecode.com/svn/tags/release-${GMOCK_VERSION}
PREFIX ${GMOCK_DIR}
CMAKE_ARGS -DCMAKE_C_COMPILER:PATH=${CMAKE_C_COMPILER} -DCMAKE_CXX_COMPILER:PATH=${CMAKE_CXX_COMPILER}
# Disable update step
UPDATE_COMMAND ""
# Disable install step
INSTALL_COMMAND ""
)
ExternalProject_Get_Property(project_gmock source_dir)
ExternalProject_Get_Property(project_gmock binary_dir)
include_directories(${source_dir}/gtest/include)
add_library(gtest STATIC IMPORTED)
set_property(TARGET gtest PROPERTY IMPORTED_LOCATION ${binary_dir}/gtest/libgtest.a)
add_dependencies(gtest project_gmock)
add_library(gtest_main STATIC IMPORTED)
set_property(TARGET gtest_main PROPERTY IMPORTED_LOCATION ${binary_dir}/gtest/libgtest_main.a)
add_dependencies(gtest_main project_gmock)
include_directories(${source_dir}/include)
add_library(gmock STATIC IMPORTED)
set_property(TARGET gmock PROPERTY IMPORTED_LOCATION ${binary_dir}/libgmock.a)
add_dependencies(gmock project_gmock)
add_library(gmock_main STATIC IMPORTED)
set_property(TARGET gmock_main PROPERTY IMPORTED_LOCATION ${binary_dir}/libgmock_main.a)
add_dependencies(gmock_main project_gmock)
include_directories(${cpp_utest_SOURCE_DIR}/src)
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")
#add_executable(utests )
#target_link_libraries(utests gmock_main gmock gtest pthread)
您需要单个 下载步骤,但两个 构建步骤。不同的 ExternalProject_add
命令调用不能 共享 步骤,但您可以将所有这些步骤安排到不同的调用中,并在它们之间具有适当的依赖关系:
# Single download(git clone)
ExternalProject_Add(
googletest-master
DOWNLOAD_DIR "googletest-master/src" # The only dir option which is required
GIT_REPOSITORY https://github.com/google/googletest.git
TIMEOUT 10
LOG_DOWNLOAD ON
# Disable all other steps
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
)
# Build gtest from existing sources
ExternalProject_Add(
gtest
DOWNLOAD_COMMAND "" # No download required
SOURCE_DIR "googletest-master/src/googletest" # Use specific source dir
PREFIX "googletest-master" # But use prefix for compute other dirs
INSTALL_COMMAND ""
LOG_CONFIGURE ON
LOG_BUILD ON
)
# gtest should be build after being downloaded
add_dependencies(gtest googletest-master)
# Build gmock from existing sources
ExternalProject_Add(
gmock
DOWNLOAD_COMMAND "" # No download required
SOURCE_DIR "googletest-master/src/googlemock" # Use specific source dir
PREFIX "googletest-master" # But use prefix for compute other dirs
INSTALL_COMMAND ""
LOG_CONFIGURE ON
LOG_BUILD ON
)
# gmock should be build after being downloaded
add_dependencies(gmock googletest-master)