Makefile 在CMake中的多个项目之间共享ExternalProject

Makefile 在CMake中的多个项目之间共享ExternalProject,makefile,build,cmake,googletest,external-project,Makefile,Build,Cmake,Googletest,External Project,我想在不同的CMake项目之间共享一个ExternalProject。设想如下所示的结构: prj1 |- CMakeLists.txt |- ... prj2 |- CMakeLists.txt |- ... lib |- ext |- gtest |- CMakeLists.txt |- googletest |_ actual_google_test_files 我试图获得的是告诉CMakeLists.txt使用lib/ext/gtest中的gtest和Externa

我想在不同的CMake项目之间共享一个ExternalProject。设想如下所示的结构:

prj1
|- CMakeLists.txt
|- ...
prj2
|- CMakeLists.txt
|- ...
lib
|- ext
 |- gtest
  |- CMakeLists.txt
   |- googletest
    |_ actual_google_test_files
我试图获得的是告诉
CMakeLists.txt
使用
lib/ext/gtest
中的gtest和ExternalProject,而不是每次为每个项目重新构建gtest


理想情况下,gtest只需在其文件夹中构建一次,项目就可以使用它。我曾尝试使用ExternalProject,如此处所述()并在项目中包含
lib/ext/gtest/CMakeLists.txt
,但gtest会为每个用户重新编译。

tldr:您应该尝试将google_测试集成为“子项目”,而不是预构建的,并使用“元”CMakeLists.txt

请阅读

CMakeLists.txt.in:

cmake_minimum_required(VERSION 2.8.2)
project(googletest-download NONE)
include(ExternalProject)
ExternalProject_Add(googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG master
SOURCE_DIR "${CMAKE_BINARY_DIR}/googletest-src"
BINARY_DIR "${CMAKE_BINARY_DIR}/googletest-build"
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
TEST_COMMAND ""
)
CMakeLists.txt:

# Download and unpack googletest at configure time
configure_file(CMakeLists.txt.in googletest-download/CMakeLists.txt)
execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googletest-download" )
execute_process(COMMAND "${CMAKE_COMMAND}" --build .
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googletest-download" )

# Prevent GoogleTest from overriding our compiler/linker options
# when building with Visual Studio
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)

# Add googletest directly to our build. This adds
# the following targets: gtest, gtest_main, gmock
# and gmock_main
add_subdirectory("${CMAKE_BINARY_DIR}/googletest-src"
             "${CMAKE_BINARY_DIR}/googletest-build")


add_subdirectory(prj1)
add_subdirectory(prj2)

但是,这不是要为每个使用它的项目分别编译gtest吗?实际上,您有一个选择,1)创建一个元cmake,这样您就只有一个“元项目”,因此prj1和prj2之间的所有内容都是共享的,2)构建gtest,[可选安装它],使用find_package()/cmake_PREFIX_路径来查找它。3) 在每个prj中集成gtest如果它们是独立的项目,那么您可以有不同版本/标志/等等的gtest顺便说一句。。。注意:有些库没有安装规则或导出目标来重用构建目录,例如abseil cpp注2:如果您使用CI(travis、appveyor、gitlab)和prj在单独的repo中,您将需要对每一个库进行gtest…并且您应该能够使用
CC=“ccache gcc”CXX=“ccache g++”cmake…
/!\还没有测试