Orden de procesamiento de componentes en makefile


En un makefile, la línea de dependencias 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 makefile.

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

Author: Shailesh Tainwala, 2012-02-06

4 answers

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

abc: x y z

El orden es x y z.

abc: x y z
y : z

El orden sería x z y.

Pero idealmente, deberías diseñar tus Makefiles para que no dependan del orden en el que se especifican los prerrequisitos. Es decir, si y debe ejecutarse después de z, debe ser una dependencia y : z.

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

 29
Author: Eldar Abusalimov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-21 16:26:29

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

La única regla dura es que se deben cumplir todos los requisitos previos antes de ejecutar la receta de destino.

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

 31
Author: Mat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-06 12:34:33

La descripción POSIX de make incluye un razonamiento que dice:

Las utilidades make en la mayoría de las implementaciones históricas procesan los prerrequisitos de un destino en orden de izquierda a derecha, y el formato makefile lo requiere. Soporta el lenguaje estándar usado en muchos makefiles que producen yacc programas; 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ó cualquier orden arbitrario, el lex.o podría no estar hecho con el y.tab.h correcto. Aunque puede haber mejores maneras de expresar esta relación, es ampliamente utilizado históricamente. Las implementaciones que desean actualizar los prerrequisitos en paralelo deben requerir una extensión explícita a make o el formato makefile 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 la razón en realidad dice.)

Por lo tanto, el comportamiento observado que los requisitos previos se procesan de izquierda a derecha tiene validación aquí, aunque solo está en la sección Rationale, no en la descripción principal. The Rationale also mentions issues with parallel make etc.

 15
Author: Jonathan Leffler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-26 23:36:13

De https://stackoverflow.com/a/22638294/636849 , puede agregar el símbolo de tubería:

abc: | x y z

Del manual make: Los prerrequisitos de solo orden se pueden especificar colocando un símbolo de tubería ( | ) en la lista de prerrequisitos: los prerrequisitos a la izquierda del símbolo de tubería son normales; los prerrequisitos a la derecha son solo de orden:

Objetivos: requisitos previos normales / requisitos previos de solo pedido

 -2
Author: Lucas Cimon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-15 22:00:29