
GNU hace es una utilidad de desarrollo que determina qué partes de una base de código específica deben recompilarse y puede emitir comandos de Linux para realizar estas acciones.
Esta herramienta de automatización de compilación se puede utilizar con cualquier lenguaje de programación donde la compilación se pueda realizar desde el shell mediante la emisión de comandos, lo cual es útil para do, C++y muchos otros lenguajes compilados.
Archivo Make en Linux
usar GNU hacenecesitamos un conjunto de reglas para definir la relación entre diferentes archivos en el programa y los comandos para actualizar cada archivo. Estos se escriben en un archivo especial llamado «Generar archivos‘ o ‘Generar archivos‘.
este ‘hacerEl comando ‘ utiliza la base de datos del archivo MAKE y la hora de la última modificación del archivo para determinar qué archivos deben volver a compilarse.
Contenido del archivo Make
En términos generales, Generar archivos Contiene cinco elementos: reglas claras, reglas implícitas, definición de variable, instruccióny Comentario.
- reglas claras Especifica cómo crear o rehacer uno o más archivos (llamados
targets) y cuándo hacerlo. - reglas implícitas Especifica cómo crear o recrear un archivo según su nombre, y describe cómo se relaciona el archivo de destino con otro archivo con un nombre similar.
- definición de variable es una línea que especifica el valor de cadena de una variable que se reemplazará más adelante en el archivo MAKE.
- instrucción Es una instrucción para que make realice algunas operaciones especiales al leer el archivo make.
- Comentario empezar con uno
'#'símbolo. Cualquier línea que comience con'#'ignorado hacer.
Estructura del archivo Make
información dicha hacer La forma de recompilar un sistema proviene de la lectura del archivo MAKE.
un sencillo Generar archivos Consta de reglas con la siguiente sintaxis:
target ... : prerequisites ... recipe ... ...
- uno Objetivo es un archivo de salida generado por un programa, también puede ser un objetivo falso (descrito a continuación). Los ejemplos incluyen ejecutables, archivos objeto u objetivos falsos como
clean,install,testoall. - uno Requisitos previos (también conocido como dependencia) es el archivo utilizado como entrada para crear el archivo de destino.
- uno receta Es lo que hace make para crear archivos de destino según los requisitos previos. Es necesario colocar un carácter de tabulación antes de cada línea de receta a menos que especifique
.RECIPEPREFIXVariables para definir diferentes caracteres como prefijos.
EjemploMakefile:
final: main.o end.o inter.o start.o gcc -o final main.o end.o inter.o start.o main.o: main.c global.h gcc -c main.c end.o: end.c local.h global.h gcc -c end.c inter.o: inter.c global.h gcc -c inter.c start.o: start.c global.h gcc -c start.c clean: rm -f main.o end.o inter.o start.o final
En este ejemplo utilizamos cuatro do El archivo fuente final y dos archivos de encabezado utilizados para crear el archivo ejecutable. cada ‘.o' La documentación es a la vez un objetivo y un requisito previo Generar archivos. Tenga en cuenta el último objetivo nombrado clean – Esta es una acción y no un archivo real.
Dado que generalmente no necesitamos limpieza durante la compilación, no está escrita como un requisito previo para ninguna otra regla. Un objetivo que no hace referencia a un archivo sino que simplemente opera se llama objetivo falso. Por lo general, no tienen requisitos previos como los archivos objeto normales.
Cómo maneja GNU Make los Makefiles
Por defecto, hacer Comenzando con el primer objetivo en el archivo MAKE, llamado objetivo predeterminado. En nuestro ejemplo, final es el primer objetivo. Dado que sus requisitos previos incluyen archivos de destino, estos archivos deben actualizarse antes de su creación. final. Cada requisito previo se maneja según sus propias reglas.
La recompilación se produce si los archivos fuente o de encabezado se han modificado, o si el archivo objeto no existe en absoluto. Después de recompilar los archivos objeto necesarios, make decide si volver a vincularlos final. Esto puede suceder si Final no existe o si algún archivo de destino es más reciente.
Por ejemplo, si cambiamos inter.c y ejecute make, que recompilará ese archivo fuente para actualizarlo inter.o luego enlace final.
Usando variables en Makefile
En nuestro ejemplo, tenemos que enumerar todos los archivos de destino dos veces en la regla. final:
final: main.o end.o inter.o start.o gcc -o final main.o end.o inter.o start.o
Para evitar esta duplicación, podemos introducir variable Almacenar lista de archivos. El uso de variables también hace que el archivo MAKE sea más fácil de mantener.
Aquí hay una versión mejorada:
CC = gcc CFLAGS = -Wall -Wextra -O2 OBJ = main.o end.o inter.o start.o TARGET = final $(TARGET): $(OBJ) $(CC) -o $(TARGET) $(OBJ) main.o: main.c global.h $(CC) $(CFLAGS) -c main.c end.o: end.c local.h global.h $(CC) $(CFLAGS) -c end.c inter.o: inter.c global.h $(CC) $(CFLAGS) -c inter.c start.o: start.c global.h $(CC) $(CFLAGS) -c start.c clean: rm -f $(OBJ) $(TARGET)
Tenga en cuenta cómo definimos CC Para el compilador y Banderas CF Se utiliza para indicadores de compilación, que facilitan cambiar las opciones del compilador o incluso cambiar el compilador para un proyecto completo.
Reglas para limpiar directorios de origen
Como se muestra en el ejemplo, podemos definir reglas para limpiar el directorio de origen eliminando archivos innecesarios después de la compilación. Pero supongamos que tenemos un archivo llamado clean – Cómo distinguir documento y Objetivo? donde esta esto Falso Entra el gol.
uno objetivo falso En realidad, no es el nombre del archivo; es solo el nombre de la receta que se ejecuta cuando se solicita explícitamente. Razón principal para usar objetivo falso Esto es para evitar conflictos de archivos con el mismo nombre y mejorar el rendimiento.
Aquí un detalle importante: la receta. clean No se ejecutará de forma predeterminada cuando se ejecute make. En su lugar, debes llamarlo explícitamente usando make clean.
declarar correctamente un objetivo falso,usar .PHONY instruir:
.PHONY: clean all install clean: rm -f $(OBJ) $(TARGET) all: $(TARGET)
Mejores prácticas modernas de Makefile
Aquí hay algunas prácticas contemporáneas a considerar:
usar reglas de patrón Reducir la duplicación:
%.o: %.c $(CC) $(CFLAGS) -c $< -o $@
Agregar valor predeterminado 'todo' Objetivo:
.PHONY: all all: $(TARGET)
incluir Generación de dependencia Para seguimiento automático de encabezados:
DEPS = $(OBJ:.o=.d) -include $(DEPS)
agregar más objetivo falso Para operaciones comunes:
.PHONY: install test run
Utilice variables automáticas como $@ (Objetivo), $> (primer prerrequisito), y $^ (Todos los requisitos previos) hace que las reglas sean más generales.
en conclusión
Ahora intente crear un archivo MAKE para su propia base de código. GNU hace Sigue siendo una herramienta de construcción poderosa y ampliamente utilizada, especialmente para do y C++ proyecto.
entender Generar archivos le ayudará con innumerables proyectos de código abierto y le proporcionará un control detallado sobre el proceso de construcción. ¡No dudes en comentar tus preguntas o experiencias!









