CPack: исключить команды INSTALL из подкаталога (каталог googletest)

Я использую CMake для проекта и googletest для моих тестовых случаев.
Оглядываясь в Интернете, кажется, что обычной практикой является просто скопировать источник googletest в подпапку вашего репозитория и включить его в «add_subdirectory (googletest)». Я это сделал.

Сейчас я использую CPack для генерации пакетов Debian для моего проекта. К сожалению, пакеты, сгенерированные CPack, устанавливают googletest вместе с моим проектом. Это, конечно, не то, что я хочу.

Заглянув в каталог googletest, я нашел там несколько команд INSTALL cmake, поэтому понятно, почему это происходит. Вопрос сейчас — как мне этого избежать? Мне не нравится вносить изменения в файлы CMakeLists.txt из googletest, потому что я не забуду повторно применить свои модификации к обновлению. Есть ли другой способ отключить эти установки в CPack?

5

Решение

Если вам не нужны тесты в выпуске вашего проекта (который вы хотите поставить с 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 рассылка.

7

Другие решения

Таким образом, есть упомянутая опция макроса @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() команды, которые также, вероятно, делают то, что вы хотите. Я действительно не проверял это, хотя стоит попробовать.

7

Немного запоздалый ответ, но я потратил слишком много времени, чтобы понять это.

В конкретном случае 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> внутри вашего пакета есть своего рода стандарт де-факто (и я, безусловно, буду следовать ему и впредь!). Но я не могу найти эту ссылку сейчас.

0