ये पद का एक उचित उत्तर है:
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
हालाँकि यह काफी हैकिंग लगता है। मैं एक वैकल्पिक समाधान प्रस्तावित करना चाहूंगा - 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"
तब MyProject/dependencies/gtest/CMakeList.txt
आप कुछ ऐसा कर सकते हैं:
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")
मैंने इसे बड़े पैमाने पर अभी तक आज़माया नहीं है लेकिन यह साफ-सुथरा लगता है।
संपादित करें: इस दृष्टिकोण के लिए एक नकारात्मक पहलू है: उपनिर्देशिका install()
आज्ञाओं को चला सकती है जो आप नहीं चाहते हैं। इस पोस्ट में उन्हें अक्षम करने के लिए एक दृष्टिकोण है लेकिन यह छोटी गाड़ी थी और मेरे लिए काम नहीं करती थी।
संपादित करें 2: यदि आप इसका उपयोग करते हैं add_subdirectory("googletest" EXCLUDE_FROM_ALL)
तो इसका मतलब install()
है कि उपनिर्देशिका के कमांड डिफ़ॉल्ट रूप से उपयोग नहीं किए जाते हैं।