c++ cmake install googletest cpack

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 .