Viniendo del mundo de C y C ++, la mayoría de los sistemas de compilación tienen un installobjetivo, en particular Makefiles (donde GNU lo recomienda, por ejemplo) o CMake . Este objetivo copia los archivos de tiempo de ejecución (ejecutables, bibliotecas, ...) en el sistema operativo (por ejemplo, en C:\Program Files\Windows).
Esto se siente realmente extraño, ya que para mí no es responsabilidad del sistema de compilación instalar programas (que en realidad es responsabilidad del sistema operativo / administrador de paquetes). También significa que el sistema de compilación o el script de compilación deben conocer la organización de los programas instalados, con variables de entorno, variables de registro, enlaces simbólicos, permisos, etc.
En el mejor de los casos, los sistemas de compilación deben tener un releaseobjetivo que genere un programa instalable (por ejemplo .debo .msi), y luego solicite amablemente al sistema operativo que instale ese programa. También permitiría al usuario desinstalar sin tener que escribir make uninstall.
Entonces, mi pregunta: ¿por qué el sistema de compilación generalmente recomienda tener un installobjetivo?
fuente

make installgeneralmente se instala bajo/usr/local(o incluso/opt), que son directorios no manejados por el "sistema operativo principal / sistema de gestión de paquetes". Sin embargo, no tengo idea de si Windows tiene alguna convención similar.make installno tiene sentido cuando hablamos de compilación cruzadaDESTDIR.Respuestas:
Muchos scripts de compilación o Makefiles tienen un objetivo de instalación porque se crearon antes de que existieran los administradores de paquetes, y porque incluso hoy en día muchos sistemas no tienen administradores de paquetes. Además, hay sistemas en los que en
make installrealidad es la forma preferida de administrar paquetes.fuente
make installse prefiere. Aparte de eso, me refería al administrador de programas cuando dije que los archivos MAKE deberían crear paquetes instalables. ¿Creo que casi todos los sistemas operativos vienen con una forma de administrar los programas instalados? Por ejemplo, Windows no tiene un administrador de paquetes (aparte de la tienda) pero aún tiene una forma de administrar los programas instalados (a través de.msipaquetes, por ejemplo)make install.checkinstallmásmake installde dos razones: "Se puede quitar fácilmente el paquete con un paso." y "Puede instalar el paquete resultante en varias máquinas". - como checkinstall construye un .deb y lo instala, usa el administrador de paquetes ...make installcheckinstallinvocación realmente usarámake instally monitoreará sus acciones para la construcción de paquetes.Es
makefileposible que A no tenga uninstalldestino y, lo que es más importante, puede tener programas que ni siquiera se supone que sean instalables (por ejemplo, porque deberían ejecutarse desde su directorio de compilación o porque pueden ejecutarse instalados en cualquier lugar). Elinstallobjetivo es solo una convención para los usualesmakefile.Sin embargo, muchos programas requieren recursos externos para ejecutarse (por ejemplo: fuentes, bases de datos, archivos de configuración, etc.). Y su ejecutable a menudo formula algunas hipótesis sobre estos recursos. Por ejemplo, su
bashshell generalmente leería algún archivo de inicialización,/etc/bash.bashrcetc. Estos recursos generalmente se encuentran en el sistema de archivos (consulte hier (7) para conocer las convenciones sobre la jerarquía de archivos) y la ruta de archivo predeterminada está integrada en su ejecutable.Intente utilizar cadenas (1) en la mayoría de los ejecutables de su sistema. Descubrirá qué rutas de archivo conoce.
Por cierto, para muchos programas GNU que usan
autoconf, podría ejecutarsemake install DESTDIR=/tmp/destdir/sin ser root. Luego/tmp/destdir/se llena con los archivos que luego deben empaquetarse.FWIW, tiendo a creer que mi programa bismon (licencia GPLv3 +) (descrito en mi informe bismon-chariot-doc.pdf ) no se puede "instalar"; No estoy seguro de poder probar eso, y no puedo imaginar cómo podría hacer que ese programa sea instalable.
fuente
/opto en$HOME. La única forma de evitar diferentes prefijos es usar contenedores, pero esa es, por supuesto, una solución específica de Linux../configure --prefix="/opt/foo" && make && DESTDIR=/tmp/foo make instally poder reubicar el paquete/opt/foosin ningún problema.Hay varias razones que me vienen a la mente.
$HOMEdirectorio. No todos los administradores de paquetes lo admiten.fuente
Una razón no mencionada es que hay muchas veces cuando no está utilizando la versión actual del software o una versión modificada del software. Intentar crear un paquete personalizado no solo es más trabajo, sino que puede entrar en conflicto con los paquetes actualmente creados y distribuidos. En el código fuente abierto, esto sucede mucho, especialmente si se introducen cambios importantes en las versiones futuras que está utilizando.
Supongamos que está utilizando el proyecto de código abierto FOO que se encuentra actualmente en la versión 2.0.1 y está utilizando la versión 1.3.0. No desea usar nada anterior porque la versión 2.0.0 es incompatible con lo que está haciendo actualmente, pero hay una única corrección de errores en 2.0.1 que necesita desesperadamente. Tener la
make installopción le permite instalar el software 1.3.0 modificado sin tener que preocuparse por crear un paquete e instalarlo en su sistema.fuente
Las distribuciones de Linux generalmente separan el mantenimiento del programa del mantenimiento del paquete. Un sistema de compilación que integra la generación de paquetes obligaría a los encargados del mantenimiento del programa a realizar también el mantenimiento de paquetes.
Esta suele ser una mala idea. Las distribuciones tienen mucha infraestructura para verificar la consistencia interna, proporcionar binarios para múltiples plataformas de destino, realizar pequeñas modificaciones para integrarse mejor con el resto del sistema y proporcionar una experiencia consistente para los usuarios que reportan errores.
Para generar paquetes directamente desde un sistema de compilación, deberá integrar o omitir toda esta infraestructura. Integrarlo sería mucho trabajo para un beneficio cuestionable, y evitarlo daría una peor experiencia al usuario.
Este es uno de los problemas "principales de la cadena alimentaria" que son típicos en los sistemas multipartidistas. Si tiene múltiples sistemas complejos, debe existir una jerarquía clara de qué sistema es responsable de coordinar todos los demás.
En el caso de la gestión de instalación de software, el administrador de paquetes es este componente, y ejecutará el sistema de compilación del paquete, luego tomará la salida a través de una interfaz conveniente ("archivos en un directorio después de un paso de instalación"), generará un paquete y preparará para subir a un repositorio.
El administrador de paquetes se encuentra en el medio entre el sistema de compilación y el repositorio aquí, y está en la mejor posición para integrarse bien con ambos.
Usted puede haber notado que hay sólo unos pocos de los JavaScript paquetes disponibles a través
npmtambién disponible a través deapt- esto se debe principalmente a las personas de JavaScript decidieron quenpmy el repositorio asociado iba a ser la parte superior de la cadena alimentaria, lo que hacía casi imposible envíe estos paquetes como paquetes Debian.Con mi sombrero de desarrollador de Debian encendido: si libera software de código abierto, deje el paquete a los encargados de la distribución. Le ahorra a usted y a nosotros mucho trabajo.
fuente
Bueno, los desarrolladores de aplicaciones son los que saben a dónde debe ir cada archivo. Podrían dejar eso en la documentación y hacer que los encargados del paquete lo lean y creen un script para cada paquete. Quizás los encargados del paquete interpreten mal la documentación y tengan que depurar el script hasta que funcione. Esto es ineficiente. Es mejor que el desarrollador de la aplicación escriba un script para instalar correctamente la aplicación que ha escrito.
Podría escribir una secuencia de comandos de instalación con un nombre arbitrario o tal vez hacerla parte del procedimiento de otra secuencia de comandos. Sin embargo, al tener un comando de instalación estándar
make install(una convención anterior a los administradores de paquetes), es muy fácil crear paquetes. Si observa la plantilla PKGBUILD para hacer paquetes de Archlinux , puede ver que la función que realmente empaqueta simplemente hace amake DESTDIR="$pkgdir/" install. Esto probablemente funciona para la mayoría de los paquetes y probablemente más con una pequeña modificación. Gracias a quemake(y las herramientas automáticas) son estándar, el empaquetado es realmente fácil.fuente