tutorial make makefile gnu-make

tutorial - makefile structure



GNU make: mĂșltiples objetivos en una sola regla (2)

Posible duplicado:
Regla de GNU Makefile que genera unos pocos objetivos desde un único archivo fuente

Si tengo una regla Makefile como esta:

a b c: echo "Creating a b c" touch a b c output: a b c cat a b c > output

y corro make -j9 salida

make ve las 3 dependencias (a, b, c), busca cómo producirlas: (la regla "abc" anterior), pero ¿qué sucede después? ¿No debería darse cuenta de que la regla "abc" solo necesita ejecutarse una vez para crear los 3 objetivos?

Esto es lo que realmente hace:

[pavel@orianna test]$ make -j9 output -n echo "Creating a b c" touch a b c echo "Creating a b c" touch a b c echo "Creating a b c" touch a b c cat a b c > output [pavel@orianna test]$

La misma receta se ejecuta 3 veces , una para cada dependencia para reglamentar "salida".

¿Alguien sabe por qué se comporta de esta manera?


Tu abc: rule dice Hacer que esto sea cómo construir cualquiera de estos objetivos, no cómo construirlos todos . Make no es lo suficientemente inteligente como para analizar los comandos y deducir que ejecutar la regla una vez construirá los tres. Make sabe (de la regla de output ) que debe reconstruir a , c , así que eso es lo que hace. Ejecuta la primera regla una vez para a , una para b y una para c .

Si quiere reconstruirlos individualmente, haga esto:

a b c: echo "Creating $@" touch $@

Si quieres reconstruirlos todos a la vez, haz algo como esto:

.PHONY: things things: echo "Creating a b c" touch a b c output: things cat a b c > output

o mejor aún:

THINGS = a b c .PHONY: things things: echo "Creating $(THINGS)" touch $(THINGS) output: things cat $(THINGS) > output


abc son tres metas / objetivos diferentes sin requisitos previos. Yo, e decir que construirá el objetivo cada vez que se le pida.

a b c: echo "Creating a b c" touch a b c

Le está pidiendo a make que genere un resultado con nombre de destino que tenga abc como requisitos previos. De modo que los objetivos abc se construyen de forma secuencial y finalmente se genera la salida.

Ahora en tu caso, todos los objetivos se crean invariablemente cuando se llama a uno de ellos. Por lo tanto, para evitar construcciones redundantes, deberá agregar requisitos previos a los destinos a, b, c. Construya el objetivo ''a'' solo si ''a'' no existe. Del mismo modo para ''b'' y ''c''

a b c: $@ echo "Creating a b c" touch a b c

Sin embargo, esto no es aconsejable. Lo ideal es que los objetivos de Makefile sean muy específicos.