Я использую CMake для проекта и googletest для моих тестовых случаев.
Оглядываясь в Интернете, кажется, что обычной практикой является просто скопировать источник googletest в подпапку вашего репозитория и включить его в «add_subdirectory (googletest)». Я это сделал.
Сейчас я использую CPack для генерации пакетов Debian для моего проекта. К сожалению, пакеты, сгенерированные CPack, устанавливают googletest вместе с моим проектом. Это, конечно, не то, что я хочу.
Заглянув в каталог googletest, я нашел там несколько команд INSTALL cmake, поэтому понятно, почему это происходит. Вопрос сейчас — как мне этого избежать? Мне не нравится вносить изменения в файлы CMakeLists.txt из googletest, потому что я не забуду повторно применить свои модификации к обновлению. Есть ли другой способ отключить эти установки в CPack?
Если вам не нужны тесты в выпуске вашего проекта (который вы хотите поставить с CPack), включите googletest
подкаталог условно, и установите условное значение false при упаковке:
...
if(NOT DISABLE_TESTS)
add_subdirectory(googletest)
endif()
упаковка с
cmake -DDISABLE_TESTS=ON <source-dir>
cpack
В качестве альтернативы, если вы хотите тестировать, но не хотите устанавливать тестовую инфраструктуру, вы можете отключить install
команда через определение макроса или функции с тем же именем:
# Replace install() to do-nothing macro.
macro(install)
endmacro()
# Include subproject (or any other CMake code) with "disabled" install().
add_subdirectory(googletest)
# Restore original install() behavior.
macro(install)
_install(${ARGN})
endmacro()
Этот подход также был предложен в CMake рассылка.
Таким образом, есть упомянутая опция макроса @Csyvarev, которая была первоначально предложена Вот:
# overwrite install() command with a dummy macro that is a nop
macro (install)
endmacro ()
# configure build system for external libraries
add_subdirectory(external)
# replace install macro by one which simply invokes the CMake
install() function with the given arguments
macro (install)
_install(${ARGV})
endmacro(install)
Заметка ${ARGV}
а также ${ARGN}
такие же, но документы в настоящее время предлагают использовать ${ARGN}
, Также факт, что макрос перезаписывает prepends _
Исходное имя макроса не задокументировано, но это все же поведение. См код Вот.
тем не мение, Я никогда не получал вышеуказанный код для правильной работы. Оно делает действительно странные вещи и часто звонки install()
дважды.
Альтернатива — также недокументированная — это использовать EXCLUDE_FROM_ALL
:
add_subdirectory(external EXCLUDE_FROM_ALL)
Согласно некоторым комментариям я нашел где-то это отключает install()
для этого подкаталога. Я думаю, что это на самом деле установлено EXCLUDE_FROM_ALL
по умолчанию для всех install()
команды, которые также, вероятно, делают то, что вы хотите. Я действительно не проверял это, хотя стоит попробовать.
Немного запоздалый ответ, но я потратил слишком много времени, чтобы понять это.
В конкретном случае googletests, указав это в вашем верхнем уровне CMakeLists.txt делает свое дело.
option(INSTALL_GMOCK "Install Googletest's GMock?" OFF)
option(INSTALL_GTEST "Install Googletest's GTest?" OFF)
add_subdirectory(googletest)
Я прочитал (я думаю) список рассылки CMake, который делает установку условной на INSTALL_<package name>
внутри вашего пакета есть своего рода стандарт де-факто (и я, безусловно, буду следовать ему и впредь!). Но я не могу найти эту ссылку сейчас.