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.