This post có một câu trả lời hợp lý:
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)
# The gtest/gmock 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"
"${gmock_SOURCE_DIR}/include")
endif()
# Now simply link your own targets against gtest, gmock,
# etc. as appropriate
Tuy nhiên nó không có vẻ khá hacky. Tôi muốn đề xuất một giải pháp thay thế - sử dụng các mô-đun con Git.
cd MyProject/dependencies/gtest
git submodule add https://github.com/google/googletest.git
cd googletest
git checkout release-1.8.0
cd ../../..
git add *
git commit -m "Add googletest"
Sau đó, trong MyProject/dependencies/gtest/CMakeList.txt
bạn có thể làm một cái gì đó như:
cmake_minimum_required(VERSION 3.3)
if(TARGET gtest) # To avoid diamond dependencies; may not be necessary depending on you project.
return()
endif()
add_subdirectory("googletest")
Tôi đã không cố gắng này rộng rãi chưa nhưng có vẻ như rõ ràng hơn.
Chỉnh sửa: Có một nhược điểm đối với phương pháp này: Thư mục con có thể chạy các lệnh install()
mà bạn không muốn. This post has an approach to disable them nhưng nó đã được lỗi và không làm việc cho tôi.
Chỉnh sửa 2: Nếu bạn sử dụng add_subdirectory("googletest" EXCLUDE_FROM_ALL)
, có vẻ như các lệnh install()
trong thư mục phụ không được sử dụng theo mặc định.
Cảm ơn câu trả lời của bạn. Những gì bạn đề nghị là tương tự như những gì tôi đã có trước đây. Tôi hy vọng sẽ tìm cách sử dụng các mục tiêu được xuất ra vì nó có vẻ như giao diện đẹp hơn việc chỉ định đường dẫn lib theo cách thủ công ... – mirkokiefer
@mirkok Theo một số cách, tôi đồng ý rằng đó là giao diện đẹp hơn. Có * là * một vài tùy chọn khác. Ví dụ, bạn có thể chỉ bao gồm nguồn của Project A trong thư mục con của Project B và kéo nó qua 'add_subdirectory'. Hoặc bạn có thể sử dụng 'ExternalProject_Add' và thực hiện một số thủ thuật khiến CMake chạy hai lần; lần đầu tiên xây dựng dự án bên ngoài, lần thứ hai chọn thành công tệp nhập "project_a-targets.cmake". – Fraser
Tôi muốn tránh phải bao gồm nguồn của các dự án bên ngoài trong cây nguồn của tôi. Nó sẽ là tuyệt vời nếu 'ExternalProject_Add' chỉ cư xử như' add_subdirectory' và phơi bày tất cả các mục tiêu. Giải pháp mà bạn mô tả ở trên có lẽ vẫn là giải pháp sạch nhất. – mirkokiefer