web-dev-qa-db-ja.com

外部(gitから)cmakeプロジェクトを複製してローカルプロジェクトに統合する方法

Googleテストを使用しようとしたときに問題が発生しました。

プロジェクトにgtestを追加するための_ExternalProject_Add_の使用方法に関するマニュアルはたくさんありますが、これらのほとんどはgtestでZipアーカイブをダウンロードしてビルドする方法に基づいています。

私たちが知っているように、gtestはgithubでホストされ、cmakeベースのプロジェクトです。だから私はネイティブのcmake方法を見つけたいのですが。

これがヘッダーのみのプロジェクトである場合は、次のように記述します。

_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)
_

ただし、これにはビルド手順が必要です。

これはどのように実装する必要がありますか?

  1. _BUILD_COMMAND_を_ExternaProject_Add_に追加し、生成されたライブラリとリンクすることによって?
  2. または、gtestのcmakelistsをプロジェクトに含めると、次のようになります。

add_subdirectory (${CMAKE_SOURCE_DIR}\ext\src\gtest\googletest\CMakeLists.txt)

プロジェクトをロードした瞬間にフォルダーが存在しないため、これは正しい方法ではありません。

  1. 他の方法は?

正しい/優先する方法は何ですか?

14
amigo421

私は最初のアプローチで行きます。デフォルトでは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)

これがあるとしても、これが正しい方法であるかどうかはわかりません。 2番目のアプローチを実装する場合は、最初にexecute_processを使用してコードをダウンロードする必要があります。

20
David Marquant