c++ - CPack: excluir los comandos INSTALL del subdirectorio(directorio googletest)
cmake (3)
Estoy usando CMake para un proyecto y googletest para mis casos de prueba. Al mirar en Internet, parece ser una práctica común copiar la fuente de googletest en una subcarpeta de su repositorio e incluirla con "add_subdirectory (googletest)". Yo lo hice.
Ahora estoy usando CPack para generar paquetes de Debian para mi proyecto. Desafortunadamente, los paquetes generados por CPack instalan googletest junto con mi proyecto. Por supuesto, esto no es lo que quiero.
Mirando en el directorio de googletest, encontré algunos comandos INSTALL cmake allí, por lo que está claro por qué sucede. La pregunta ahora es: ¿cómo puedo evitarlo? No me gusta modificar los archivos CMakeLists.txt de googletest, porque tendría que recordar volver a aplicar mis modificaciones en una actualización. ¿Hay otra forma de deshabilitar estas instalaciones en CPack?
Entonces, existe la opción macro @Tsyvarev mencionada que se sugirió originalmente here :
# 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)
Nota
${ARGV}
y
${ARGN}
son lo mismo, pero los documentos actualmente sugieren usar
${ARGN}
.
Además, el hecho de que la sobrescritura de macros preceda
_
al nombre de macro original no está documentado, pero sigue siendo el comportamiento.
Mira el código
here
.
Sin embargo
, nunca obtuve el código anterior para que funcione correctamente.
Hace cosas
realmente
extrañas y a menudo llama a
install()
dos veces.
Una alternativa, también indocumentada, es utilizar
EXCLUDE_FROM_ALL
:
add_subdirectory(external EXCLUDE_FROM_ALL)
Según algún comentario que encontré en algún lugar, esto deshabilita
install()
para ese subdirectorio.
Creo que lo que realmente hace es establecer
EXCLUDE_FROM_ALL
de forma predeterminada para todos los comandos
install()
que probablemente también
EXCLUDE_FROM_ALL
lo que quieras.
Realmente no lo he probado, aunque vale la pena intentarlo.
Respuesta un poco tardía, pero pasé demasiado tiempo resolviendo esto.
En el caso específico de googletests, especificar esto en su nivel superior CMakeLists.txt hace el truco.
option(INSTALL_GMOCK "Install Googletest''s GMock?" OFF)
option(INSTALL_GTEST "Install Googletest''s GTest?" OFF)
add_subdirectory(googletest)
Leí (creo) en la lista de correo de CMake que hacer que la instalación sea condicional en
INSTALL_<package name>
dentro de su paquete es una especie de estándar de facto (¡y ciertamente lo seguiré de ahora en adelante!).
Pero no puedo encontrar ese enlace ahora.
Si no necesita pruebas en el lanzamiento de su proyecto (que desea entregar con CPack), incluya el subdirectorio
googletest
condicionalmente y establezca condicional en falso cuando empaquete:
...
if(NOT DISABLE_TESTS)
add_subdirectory(googletest)
endif()
embalaje con
cmake -DDISABLE_TESTS=ON <source-dir>
cpack
Alternativamente, si desea pruebas, pero no desea instalar la infraestructura de prueba, puede deshabilitar el comando de
install
mediante la definición de macro o función con el mismo nombre:
# 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()
Este enfoque también se ha sugerido en el envío de CMake .