Могу ли я запретить GoogleTest-build изменять глобальную переменную CMAKE_CXX_FLAGS? - PullRequest
0 голосов
/ 10 июля 2020

Мой проект C ++ построен с использованием CMake и включает тесты с использованием GoogleTest . Чтобы уберечь меня от проблем совместимости между разными проектами и установленной / скомпилированной версией GoogleTest , я однажды решил, что GoogleTest всегда будет локальным в моих каталогах проектов.

Я добился этого, загрузив и построив GoogleTest как часть моего собственного тестового проекта, который включает / links gtest. Это выглядит так в соответствующем 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_CURRENT_BINARY_DIR}/googletest-download"
)
execute_process(COMMAND "${CMAKE_COMMAND}" --build .
    WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/googletest-download"
)

Для того, чтобы это работало, есть внешний проект, определенный в 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_CURRENT_BINARY_DIR}/googletest-src"
    BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/googletest-build"
    CONFIGURE_COMMAND ""
    BUILD_COMMAND ""
    INSTALL_COMMAND ""
    TEST_COMMAND ""
)

Пока все хорошо !

У меня это работало довольно долго, но у меня возникли некоторые проблемы, так как я начал использовать функции C ++ 17 в своем последнем проекте. Это проблема, потому что мой тестовый проект отказывается компилироваться, когда он включает код, который использует C ++ 17 .

Причина в том, что запущен GoogleTest Сборка CMake изменяет переменную CMAKE_CXX_FLAGS в глобальном масштабе. Фактически, это отменяет мое определение режима компилятора:

CXX_FLAGS =  -Wall -pedantic -std=c++17   -std=gnu++11

... где это должно выглядеть так:

CXX_FLAGS =  -Wall -pedantic -std=c++17

Есть ли способ сохранить GoogleTest сценарий сборки от изменения этой глобальной переменной? А может восстановили?

1 Ответ

0 голосов
/ 10 июля 2020

Проект Google Test указывает для своих целей (gtest и gtest_main), что они должны быть скомпилированы с как минимум функциями C ++ 11. Это делается с помощью команды target_compile_features ( googletest / cmake / internal_utils.cmake # L193 ):

target_compile_features(${name} PUBLIC cxx_std_11)

Итак, всякий раз, когда вы связываетесь с целевыми объектами gtest или gtest_main, CMake проверяет, предоставлен ли уже C ++ 11 вызывающей стороной, и, если нет, добавляет соответствующий флаг компилятора (-std=gnu++11 для g cc).

Кажется, вы добавили -std=c++17 непосредственно в CMAKE_CXX_FLAGS переменная. Это плохой способ для указания стандарта: CMake никогда не проверяет CMAKE_CXX_FLAGS для определения, какие функции компилятора в настоящее время включены.

Правильная настройка c ++ 17 подразумевает любой параметр CMAKE_CXX_STANDARD переменная:

set(CMAKE_CXX_STANDARD 17)

или вызов target_compile_features для ваших целей:

target_compile_features(my_exe PUBLIC cxx_std_17)

Подробнее о настройке стандарта C / C ++ в CMake см. в этом вопросе: Как мне активировать C ++ 11 в CMake?

...