[Linux] herramienta de construcción automatizada make/makefile


prefacio

Este artículo explica la herramienta de compilación automatizada en Linux: make/makefile


以下是本篇文章正文内容

1. ¿Qué es make/makefile?

  • 1.hacer es una instrucción
  • 2.makefile es un archivo en el directorio actual

2. Dependencias y métodos dependientes

2.1 Crear archivos en makefile

El código anterior explica qué dependencias y métodos dependientes son

1 mycode:mycode.c
2     gcc -o mycode mycode.c   

Primero cree y abra el archivo MAKE e ingrese el código anterior.

  • El mycode de la primera línea de código está en el lado izquierdo de los dos puntos, y mycode.c está en el lado derecho de los dos puntos.Esta línea se llama dependencia .
    mycode depende de mycode.c.
  • Al comienzo de la segunda línea de código, una tecla Tabulador debe estar vacía, lo cual es un requisito gramatical. La dependencia a la que pertenece se denomina método dependiente .

El comando make generará automáticamente el programa ejecutable de destino correspondiente de acuerdo con las dependencias y los métodos dependientes.

Para explicar mejor las dependencias y los métodos dependientes, el siguiente código es solo ilustrativo y no se recomienda escribirlo así:

  1 mycode:mycode.o
  2     gcc -o mycode mycode.o                                                      
  3 mycode.o:m mycode   
  4     gcc -o mycode.o -c mycode.s
  5 mycode.s:mycode.i
  6     gcc -o mycode.s -S mycode.i
  7 mycode.i:mycode.c
  8     gcc -o mycode.i -E mycode.c

Vemos que hay múltiples dependencias y métodos dependientes aquí.
Entre ellos, cuando salimos del archivo MAKE y ejecutamos directamente el comando make, la situación es la siguiente: ¡ inserte la descripción de la imagen aquí
Este es el orden opuesto de las dependencias y métodos dependientes que definimos!
inserte la descripción de la imagen aquí

De hecho, cuando el comando make escanea el archivo MAKE, primero encontrará el primer programa de destino ejecutable, es decir, mycode.Sin embargo, no hay dependencia de mycode en el directorio actual: mycode.o, por lo que make continuará escaneando hacia abajo. , encuentre la dependencia de mycode.o: mycode.s, no hay mycode.s en el directorio actual, haga que continúe escaneando hacia abajo y encuentre la dependencia de mycode.s: mycode.i, el directorio actual no tiene mycode .i, luego continúe para encontrar las dependencias de mycode.i: mycode.c. En este momento, si se encuentra mycode.c, se ejecutará el método dependiente correspondiente a esta dependencia, es decir, el código de la línea 8. A partir de ahí, ejecute paso a paso de abajo hacia arriba hasta que se genere el primer archivo objeto ejecutable.
Entonces, simplemente ingrese el comando make y la primera dependencia se encontrará de manera predeterminada.

Por lo tanto, está bien que interrumpamos el orden de varias dependencias y métodos dependientes en el archivo MAKE, siempre que el comando make pueda encontrarlo.

2.2 Eliminar archivos en makefile

Después de generar el programa ejecutable, si quiero eliminar todos los archivos en este proceso, puedo agregar una dependencia y un método de dependencia al archivo MAKE para eliminar el archivo.

 clean:
   	 rm -f mycode mycode.i mycode.s mycode.o

Después de ejecutar el comando make clean, los archivos anteriores se eliminarán.
inserte la descripción de la imagen aquí
Se puede ver que cuando completemos la ejecución, los archivos mycode.i, mycode.s y mycode.o se eliminarán.
Aquí hay una pregunta: ¿por qué necesita ingresar make clean en lugar de clean directamente?
Porque el comando make busca la primera dependencia por defecto

La segunda pregunta: cuando ingreso make por primera vez para generar un montón de archivos de destino, y luego ingreso make nuevamente, no lo ejecutará por mí: dijo que mycode es el último, ¿cuál es el motivo
inserte la descripción de la imagen aquí
?

Comando 2.3 stat para ver tres tipos de tiempo del archivo (ACM)

Usamos

micódigo de estadísticas

comando, después de verificar mycode, habrá tres tipos de tiempo

inserte la descripción de la imagen aquí
Hora de acceso (hora de acceso) Modificar hora (cambiar hora) Cambiar hora: (cambiar hora)

¿Cómo distinguir entre Modificar y Cambiar hora aquí?
todavía recuerdo

archivo = contenido del archivo + atributos del archivo

Modificar hora es actualizar a la última hora después de que se modifique el contenido del archivo.
La hora de cambio se actualiza a la hora más reciente después de que se modifican los atributos del archivo.

El acceso es el tiempo de acceso. Generalmente, siempre que abramos un archivo, el tiempo de acceso del archivo se actualizará a la última hora.

Entonces, ¿por qué hacer varias veces, no permite la ejecución?

Con el fin de mejorar la eficiencia de compilación. Solo se puede ejecutar el archivo de origen antes de que se pueda ejecutar. En términos generales, la fecha de última modificación del archivo de origen es más antigua que el programa ejecutable. Si cambiamos el archivo fuente y había un programa ejecutable en el historial, ¡entonces la última modificación del archivo fuente debe ser más reciente que el programa ejecutable!
Solo necesita comparar la hora de última modificación del archivo fuente y la hora de última modificación del programa ejecutable:
(1) .exe es más antiguo que el archivo .c y debe volver a compilarse
(2) .exe es más nuevo que .c archivo y no necesita ser recompilado

De hecho, cuando compilamos este código en Linux, cada vez que accedemos al archivo .c, ¡encontraremos que Access no cambia cada vez!

Motivo: porque cada vez que cambia el valor de Acceso, debe actualizarlo en el disco. El acceso frecuente a los periféricos solo reducirá la eficiencia de toda la máquina. Para mejorar la eficiencia, los diseñadores de Linux pueden usar Modificar o Cambiar cada pocos veces Cambiado, el acceso se actualizará.

Sin embargo, ¿qué pasa si solo quiero hacer que se ejecute cada vez?

2.4 Archivo de pseudo objeto (.PHONY)

Aquí hay un archivo de pseudo-objetivo de la siguiente manera, que permite ejecutar make todo el tiempo.

inserte la descripción de la imagen aquí
Se puede ver que cuando agregamos el archivo de destino ejecutable después de .PHONY:, cada vez que ejecutamos make, se ejecutará y no se ejecutará porque el archivo .exe es más nuevo que el archivo .c.

Pero en la práctica, se sugiere que el código del pseudoobjeto: modifique clean con .PHONY, para que siempre se pueda ejecutar clean.
Debido a que algunos compiladores usan el método de compilación incremental para el código agregado, el problema del archivo fuente aún puede existir y debemos forzar la limpieza, lo que requiere que se ejecute la limpieza cada vez.

3. Algunos símbolos especiales en Makefile

3.1 $@ y $^

inserte la descripción de la imagen aquí

A veces no queremos escribir muchas cosas en el método dependiente, por lo que el símbolo "$@" puede reemplazar todo antes de los dos puntos en la relación de dependencia, es decir, puede reemplazar el mycode en el caso anterior, " $ ^ " puede reemplazar la relación de dependencia, Todo después de los dos puntos, eso es mycode.o

inserte la descripción de la imagen aquí

Entonces se puede hacer así.

3.2 @ símbolos especiales

A veces no queremos ejecutar el comando make, seguido de una gran lista de dependencias. Podemos usar el símbolo @ para agregar al método dependiente, de modo que después de cada ejecución del comando make, el método dependiente ya no aparecerá.

inserte la descripción de la imagen aquí

Resumir

Hoy expliqué las herramientas de compilación automatizadas para Linux.

Supongo que te gusta

Origin blog.csdn.net/w2915w/article/details/131523255
Recomendado
Clasificación