Establezca el prefijo de instalación automáticamente en la ruta personalizada si no se especifica explícitamente en la línea de comandos


Para algunas pruebas internas, me gustaría que el prefijo install fuera por defecto un subdirectorio del directorio de compilación, a menos que el usuario lo anule explícitamente. Sé que el usuario puede especificar un prefijo de instalación por:

$ cmake -DCMAKE_INSTALL_PREFIX=/foo/bar ..

Pero si el usuario hace no especificar esto, debe por defecto, por ejemplo, ${PWD}/installed.

La variable CMAKE_INSTALL_PREFIX ya está establecida en /usr/local, por lo que no puedo comprobar si está desactivada/vacía antes de configurarla.

Mi solución actual es agregar un interruptor personalizado que el usuario tiene que invocar para especificar que la variable CMAKE_INSTALL_PREFIX se respeta:

option(ENABLE_INSTALL_PREFIX "Install build targets to system (path given by '-DCMAKE_INSTALL_PREFIX' or '${CMAKE_INSTALL_PREFIX}' if not specified)." OFF)
if ( ENABLE_INSTALL_PREFIX )
    set (CMAKE_INSTALL_PREFIX installed CACHE PATH "Installation root")
else()
    set (CMAKE_INSTALL_PREFIX installed CACHE PATH "Installation root" FORCE)
endif()

Mis preguntas son:

(a) ¿Hay algún problema con lo anterior, más allá de la molestia de que la bandera adicional deba pasarse a CMake para que CMAKE_INSTALL_PREFIX tenga un efecto?

(b) ¿Existe una forma mejor, más limpia, más robusta, más idiomática y/o menos molesta de lograr lo anterior?

Gracias.

Author: Jeet, 2013-04-18

2 answers

CMake establece la variable booleana CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT si CMAKE_INSTALL_PREFIX no se ha especificado explícitamente y se inicializa a su configuración predeterminada. Puede anularlo de la siguiente manera:

if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
    set (CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/installed" CACHE PATH "default install path" FORCE )
endif()
 48
Author: sakra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-18 17:45:20

Hace unos años, yo quería intentar lo mismo. Lamentablemente nunca pude encontrar una solución plenamente satisfactoria. En su lugar, elegí usar una expresión regular para verificar si CMAKE_INSTALL_PREFIX coincide con el valor predeterminado.

Por ejemplo, en Windows utilizo lo siguiente para crear el directorio install en el directorio de compilación:

if ( CMAKE_INSTALL_PREFIX MATCHES "^C:/Program Files" )
    # Override to an "Install" directory in the current build-dir
    message( STATUS "    Install-prefix was at default -> forcing it to the build-dir" )
    message( STATUS "        'set( CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/install )'" )
    set( CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/install )
endif ( CMAKE_INSTALL_PREFIX MATCHES "^C:/Program Files" )

El mayor problema con esta construcción es que puede especificar manualmente que CMake debe instalarse en C:\Program Files. Como distribuyo mi herramienta con un instalador NSIS, esto no es un problema (para me).

Quizás podrías probar algo similar en Unix.

 2
Author: André,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-18 07:05:13