2016-01-19 2 views
0

Во-первых, мне нужно заявить, что я обошел Stack Overflow и пришли ответы о том, как использовать ExternalProject для создания Google Test в рамках проекта, например here.Постройте и используйте GTest глобально в проекте

Теперь давайте говорить, что у меня есть в моем проекте есть что-то вроде этого

+-- CMakeLists.txt (the big CMake File for the entire project) 
+-- tests 
| +-- CMakeLists.txt (contain of all the small project in the tests) 
| +-- Test1 
|  +-- CMakeLists.txt (test file for Test1 program) 
|  +-- test_1.cpp 
|  +-- test_1.h 
| +-- Test2 
|  +-- CMakeLists.txt (test file for Test2 program) 
|  +-- test_2.cpp 
|  +-- test_2.h 
| +-- Test3 
|  +-- CMakeLists.txt (test file for Test3 program) 
|  +-- test_3.cpp 
|  +-- test_3.h 

Теперь, есть в любом случае, что я могу настроить и создать тест Google с помощью ExternalProject в большом CMakeLists.txt файл (в корневой папке) , а затем используйте эту библиотеку для создания каждого отдельного теста в соответствующей папке. На данный момент я могу только загрузить-встроенную ссылку на весь новый набор библиотек GTest в каждой из подкатегорий Test1, Test2, Test3, что очень неэффективно. Есть ли альтернативный способ обойти это?

ответ

1

Непонятно, не видя ваши фактические файлы CMakeLists.txt, что происходит в вашем случае. Тем не менее, ExternalProject не дает вам цели CMake напрямую ссылаться, вам нужно сделать больше ручной работы, чтобы получить что-то, что вы можете добавить в список связанных библиотек ваших целей, которые должны использовать GTest. Поэтому, в зависимости от того, как вы вручную определили эти вещи, возможно, именно поэтому вам нужно создать GTest в каждом подкаталоге TestX.

В другом вопросе SO, с которым вы связались, my answer there и связанная с ним статья упоминает, как загрузить и построить GTest как часть этапа CMake, а не во время сборки. Это дает вам цели CMake, которые вы можете напрямую связать, не определяя их вручную. Если вы будете следовать этому методу для загрузки и сборки GTest в вашем файле CMakeLists.txt верхнего уровня, то цели gtest и gtest main будут видны для всех подкаталогов. Кроме того, вам не нужно будет определять имя библиотеки для каждой платформы и т. Д., Так как цель CMake уже обрабатывает это для вас. Таким образом, в ваших различных подкаталогах Test1, Test2 и Test3 все, что вам нужно сделать, это добавить gtest или gtest_main в список библиотек, к которым привязана каждая тестовая программа.

+0

Очень красивое решение, которое я должен признать! –

1

Мой подход заключается в создании каталога на том же уровне ваших тестовых проектов:

+-- CMakeLists.txt (the big CMake File for the entire project) 
+-- tests 
| +-- CMakeLists.txt (contain of all the small project in the tests) 
| +-- gtest 
|  +-- CMakeLists.txt (use ExternalProject_Add to import GTest) 
| +-- Test1 
|  +-- CMakeLists.txt (test file for Test1 program) 
|  +-- test_1.cpp 
|  +-- test_1.h 
| +-- Test2 
|  ... 

В CMakeLists.txt для gtest Я определяю GTEST цель и экспортировать переменные для включения дир и путь библиотеки для другие проекты для использования.

Это работает для меня, и я получаю gtest только один раз, поэтому все тестовые проекты могут связываться с ним. Но я постараюсь сделать снимок подхода Крейга Скотта по созданию gtest во время создания Makefile вместо времени сборки.

CMakeLists.txt файл в папке gtest выглядит следующим образом:

cmake_minimum_required(VERSION 2.8.11) 

include(ExternalProject) 

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 GLOBAL) 
set_target_properties(gtest PROPERTIES IMPORTED_LOCATION ${binary_dir}/gtest/libgtest.a) 
set_target_properties(gtest PROPERTIES INCLUDE_DIRECTORIES ${source_dir}/gtest/include) 
add_dependencies(gtest project_gmock) 
get_property(GTEST_INCLUDE_DIR TARGET gtest PROPERTY INCLUDE_DIRECTORIES) 
set(GTEST_INCLUDE_DIR "${GTEST_INCLUDE_DIR}" PARENT_SCOPE) 

add_library(gtest_main STATIC IMPORTED GLOBAL) 
set_target_properties(gtest_main PROPERTIES IMPORTED_LOCATION ${binary_dir}/gtest/libgtest_main.a) 
add_dependencies(gtest_main project_gmock) 

include_directories(${source_dir}/include) 
add_library(gmock STATIC IMPORTED GLOBAL) 
set_target_properties(gmock PROPERTIES IMPORTED_LOCATION ${binary_dir}/libgmock.a) 
set_target_properties(gmock PROPERTIES INCLUDE_DIRECTORIES ${source_dir}/include) 
add_dependencies(gmock project_gmock) 
get_property(GMOCK_INCLUDE_DIR TARGET gmock PROPERTY INCLUDE_DIRECTORIES) 
set(GMOCK_INCLUDE_DIR "${GMOCK_INCLUDE_DIR}" PARENT_SCOPE) 

add_library(gmock_main STATIC IMPORTED GLOBAL) 
set_target_properties(gmock_main PROPERTIES IMPORTED_LOCATION ${binary_dir}/libgmock_main.a) 
add_dependencies(gmock_main project_gmock) 
Смежные вопросы