¿Qué hace 'make install'?

52

Al pasar de Windows a Linux, no puedo entender el proceso de instalación de software en Linux. En Windows, cuando ejecutamos un archivo de instalación, le pregunta dónde desea instalar el programa, probablemente solo en la carpeta de archivos de programa. Más tarde, edita el registro. Esto se llama instalación en Windows. ¿Qué significa exactamente 'instalar software' en Linux exactamente?

Supongamos que descargué el código fuente, lo configuré y luego construí el binario usando make. Ahora es solo un programa binario, no utilizable todavía. ¿Cómo se va a 'instalar'? Por make install? ¿Y qué hace este comando exactamente?

KawaiKx
fuente
1
Mi respuesta a stackoverflow.com/questions/528399/… ofrece una breve descripción de los tipos habituales de cosas que se realizan por make installpasos desde el punto de vista de los programadores.
dmckee

Respuestas:

44

Make es un programa de flujo de trabajo de propósito general, generalmente usado para compilación. Pero se puede usar para cualquier cosa.

Cuando hace algo como "make all", el programa make ejecuta una regla llamada "all" desde un archivo en el directorio actual llamado "Makefile". Esta regla generalmente llama al compilador a compilar algún código fuente en binarios.

Cuando hace "make install", el programa make toma los binarios del paso anterior y los copia en algunas ubicaciones apropiadas para que se pueda acceder a ellos. A diferencia de Windows, la instalación solo requiere copiar algunas bibliotecas y archivos ejecutables y no existe un requisito de registro como tal. En resumen, "make install" solo copia archivos compilados en ubicaciones apropiadas.

Sharjeel
fuente
44
Técnicamente, el registro no es un requisito : lo que todos los instaladores agregan es solo una función conveniente, muy parecida a la base de datos del administrador de paquetes en Linux, para las personas que les gusta poder desinstalar software.
Grawity
2
@grawity En realidad, en Windows se requiere editar el registro por muchas razones, como la integración. En Linux, la integración de softwares entre sí generalmente implica copiar archivos o agregar líneas a los archivos de configuración mediante algo así como un script posterior a la instalación.
Camilo Martin
@sharjeel Sería útil decir cómo puedo encontrar la regla nombrada allen Makefiley cómo se ve el marcador final de esa sección, para poder ver dónde se alldetiene el procesamiento de reglas .
Pro Backup
36

make installhace lo que el Makefileautor quiere que haga. Por lo general, en este punto, es demasiado tarde para cambiar el directorio de instalación, como a menudo se sabe antes , durante la compilación, por lo que los archivos de ayuda y los archivos de configuración pueden referenciarse con las rutas correctas.

Muchos proyectos utilizan las herramientas automáticas GNU para tratar de mejorar su portabilidad entre las diferencias de hardware y sistema operativo. (Las diferentes variantes de Unix usan encabezados ligeramente diferentes para las declaraciones de funciones que están ligeramente fuera de la ruta habitual, excepto que la mayoría de los programas necesitan uno u otro de los declarados en diferentes ubicaciones)

Cuando un proyecto usa Autotools, el mantra normal para instalarlo es:

./configure
make
make install

El ./configuregeneral le permite utilizar una opción de línea de comandos como --prefix /opt/apacheo algo similar para especificar una ruta diferente. /usr/local/Es un defecto común prefix. Es mucho más fácil para el software creado localmente vivir en un solo lugar y el software proporcionado por la distribución para vivir en los "directorios principales": /usr/ /bin/y así sucesivamente. (Los empaquetadores son muy cuidadosos de no tocar nunca los archivos /usr/local/; saben que es exclusivamente para administradores de sistemas).

De todos modos, ./configure --prefix /path/to/new/prefixestablecerá una variable en la Makefileque está disponible al compilar el programa, modificando las páginas del manual para que apunten a las ubicaciones correctas para los archivos, modificando los archivos de configuración, etc. Así makeconstruirá el software específicamente para la ubicación de instalación que desee y make installlo instalará en esa ubicación.

La mayoría de los programas pueden ejecutarse incluso sin el make installpaso final , solo ./program_nameque a menudo los iniciará. Esto definitivamente es algo por proyecto: algunos, como postfix, qmailetc., están formados por muchas piezas móviles diferentes y dependen de que todos trabajen juntos. Otros, como lso supodrían ser lo suficientemente autónomos como para ejecutarse bien desde el directorio en el que se crearon. (Esto a menudo no es útil, pero a veces es muy útil).

Sin embargo, no todos los proyectos usan Autotools: son enormes , complicados y miserables de mantener. Los Makefiles escritos a mano son mucho más simples de escribir, y personalmente creo que distribuir un simple Makefilecon las variables de configuración disponibles es mucho más fácil tanto para los desarrolladores como para los usuarios. (Aunque el ./configure ; make ; make installmantra es realmente fácil para los usuarios cuando funciona).

sarnold
fuente
19

make installno hace nada menos que ejecutar la installfunción / sección en suMakefile

Sascha
fuente
Bien, simplemente le gusta make clean, básicamente solo ejecuta los códigos en la sección.
Wulfric Lee
8

Lo más importante que se debe mencionar con respecto a la instalación de software en Linux es que es mucho más confiable y fácil de instalar desde su distribución (¡este es su propósito!). Úselo solo make installsi no hay otra forma (considere también programas alternativos).

El error común de los usuarios de Windows es descargar programas de diferentes lugares e intentar instalarlos, olvidando revisar sus paquetes de distribución, que pueden instalarse con un solo clic o comando (en el administrador de paquetes).

Recuerde también que una de las principales razones de la ausencia de infecciones de virus en Linux es que el software está (o debería estar) instalado desde una ubicación central (confiable) en lugar de los muchos sitios aleatorios.

Como nota adicional, mientras que las distribuciones como Ubuntu siempre contienen paquetes obsoletos, también hay distribuciones como Arch Linux que siempre están actualizadas (aunque no ofrecen literalmente todos los programas lanzados para Linux, como Debian / Ubuntu).

En cuanto a lo que sucedería exactamente cuando use el administrador de paquetes, bueno, verificaría las dependencias, descargaría los paquetes, descomprimiría, colocaría todos los archivos en sus directorios apropiados, de acuerdo con las pautas de FHS y de distribución, y algunas otras rutinas que probablemente podría descubrir desde la página del manual del administrador de paquetes.

corvinus
fuente