tutorial make makefile gnu-make

tutorial - makefile structure



Orden de procesamiento de componentes en makefile (4)

En un makefile, la línea de dependencia es de la forma -

abc: x y z

Los tres componentes (x, y, z) son objetivos en líneas de dependencia más abajo en el archivo make.

Si se invoca make abc , ¿en qué orden se ejecutarán los tres objetivos x, y, z?


De forma predeterminada, el orden de ejecución es el mismo que el especificado en la lista de requisitos previos, a menos que haya dependencias definidas entre estos requisitos previos.

abc: x y z

El orden es xyz .

abc: x y z y : z

El orden sería xzy .

Pero idealmente, debe diseñar sus Makefiles para que no dependan del orden en que se especifican los requisitos previos. Es decir, si y debe ejecutarse después de z , debe haber una dependencia y : z .

Y tenga en cuenta que GNU Make puede ejecutar algunas recetas en paralelo, vea la respuesta de Mat .


Desde https://.com/a/22638294/636849 , puede agregar el símbolo de canalización:

abc: | x y z

Desde el manual: los requisitos de solo pedido se pueden especificar al colocar un símbolo de canalización (|) en la lista de requisitos previos: cualquier requisito previo a la izquierda del símbolo de canalización es normal; Todos los requisitos previos a la derecha son solo de orden:

objetivos: requisitos previos normales | prerrequisitos de solo orden


La descripción POSIX de make incluye una justificación que dice:

Las utilidades make en la mayoría de las implementaciones históricas procesan los requisitos previos de un destino en el orden de izquierda a derecha, y el formato makefile lo requiere. Es compatible con el idioma estándar utilizado en muchos makefiles que producen programas yacc ; por ejemplo:

foo: y.tab.o lex.o main.o $(CC) $(CFLAGS) -o $@ t.tab.o lex.o main.o

En este ejemplo, si make eligió un orden arbitrario, el lex.o podría no hacerse con la y.tab.h correcta. Si bien puede haber mejores formas de expresar esta relación, se usa ampliamente en la historia. Las implementaciones que deseen actualizar los requisitos previos en paralelo deben requerir una extensión explícita para make o el formato de archivo make para lograrlo, como se describió anteriormente.

( Creo que el t.tab.o en la línea $(CC) es un error tipográfico para y.tab.o , pero eso es lo que realmente dice la razón ) .

Por lo tanto, el comportamiento observado de que los requisitos previos se procesan de izquierda a derecha tiene validación aquí, aunque solo se encuentra en la sección de Justificación, no en la descripción principal. La justificación también menciona problemas con marcas paralelas, etc.


Realmente no debería depender del orden en el que se ejecutan; todo lo demás es igual, las tres recetas para esos requisitos previos podrían ejecutarse en paralelo.

La única regla difícil es que todos los requisitos previos deben cumplirse antes de ejecutar la receta de destino.

Si no hay dependencias entre x , y y z , y no hay ejecución paralela, GNU make parece ejecutarlas en el orden en que las especificó, pero esto no está garantizado en los documentos.