Viniendo del mundo de C y C ++, la mayoría de los sistemas de compilación tienen un install
objetivo, 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 release
objetivo que genere un programa instalable (por ejemplo .deb
o .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 install
objetivo?
fuente
make install
generalmente 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 install
no 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 install
realidad es la forma preferida de administrar paquetes.fuente
make install
se 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.msi
paquetes, por ejemplo)make install
.checkinstall
másmake install
de 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 install
checkinstall
invocación realmente usarámake install
y monitoreará sus acciones para la construcción de paquetes.Es
makefile
posible que A no tenga uninstall
destino 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). Elinstall
objetivo 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
bash
shell generalmente leería algún archivo de inicialización,/etc/bash.bashrc
etc. 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
/opt
o 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 install
y poder reubicar el paquete/opt/foo
sin ningún problema.Hay varias razones que me vienen a la mente.
$HOME
directorio. 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 install
opció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
npm
también disponible a través deapt
- esto se debe principalmente a las personas de JavaScript decidieron quenpm
y 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