¿Hacer dependencias manualmente siempre es semánticamente equivalente a especificar dependencias?
Considere un Makefile que se ve así:
A: B C
# Hacer cosas para construir A
B:
# Hacer cosas para construir B
C:
# Hacer cosas para construir C
¿Esto siempre es semánticamente equivalente al siguiente Makefile, para todos los valores de A, B y C?
A:
make B C
# Hacer cosas para construir A
B:
# Hacer cosas para construir B
C:
# Hacer cosas para construir C
davy.ai
No, estos dos Makefiles no son equivalentes semánticamente para todos los valores de A, B y C.
En el primer Makefile, el objetivo A depende de los objetivos B y C. Esto significa que B y C deben construirse primero antes de que A pueda construirse. La receta para construir A viene después de las dependencias, y se construye A.
En el segundo Makefile, el objetivo A no tiene ninguna dependencia, pero su receta utiliza el comando “make” para construir de forma recursiva los objetivos B y C. Una vez que B y C han sido construidos, se puede ejecutar la receta para construir A.
La diferencia entre estos dos Makefiles radica en cómo manejan las dependencias. En el primer Makefile, las dependencias están explícitamente enumeradas, y el orden en que se construyen está determinado por su orden en la lista de dependencias. En el segundo Makefile, las dependencias se manejan de forma recursiva invocando “make” para construirlas.
Si A siempre se construye primero, entonces los dos Makefiles producirán el mismo resultado. Sin embargo, si A puede construirse después de que B y C se hayan construido de forma independiente, entonces el primer Makefile manejará correctamente las dependencias, mientras que el segundo Makefile siempre construirá B y C cada vez que se construya A, incluso si ya se han construido.