En realidad, hay dos tipos diferentes de requisitos previos entendidos por GNU Marca: requisitos previos normales tales como los descritos en la sección anterior , y el orden de sólo requisitos previos. Un requisito previo normal es hacer dos declaraciones : en primer lugar, impone un orden en el que se invocarán las recetas : las recetas para todos los requisitos previos de un objetivo serán completadas antes de ejecutar la receta del objetivo. En segundo lugar, impone una relación de dependencia: si algún requisito previo es más nuevo que el objetivo , el objetivo se considera obsoleto y debe reconstruirse.
Normalmente, esto es exactamente lo que desea: si el requisito previo de un objetivo es actualizado, entonces el objetivo también debe actualizarse.
Ocasionalmente, sin embargo, se tiene una situación en la que desea imponer un orden específico sobre las reglas que se invoca sin forzar el objetivo ser actualizado si se ejecuta una de esas reglas. En ese caso, usted quiere definir requisitos de orden previos. Los requisitos previos de pedido se pueden especificar colocando un símbolo de tubería (|) en la lista de requisitos previos : los requisitos previos a la izquierda del símbolo de tubería son normales; los requisitos previos a la derecha son orden de sólo:
targets: normal-prerequisites | order-only-prerequisites
La sección de requisitos previos normal puede por supuesto estar vacío. Además, puede declarar varias líneas de requisitos previos para el mismo destino: se anexan correctamente (los requisitos previos normales se anexan a la lista de requisitos previos normales; los requisitos previos de pedido son añadidos a la lista de requisitos previos de solo pedido) . Tenga en cuenta que si declara que el mismo archivo es un requisito previo normal y solo de orden , el prerrequisito normal tiene prioridad (ya que tiene un superconjunto estricto del comportamiento de un requisito previo solo de pedido).
Considere un ejemplo en el que sus objetivos se colocarán en un directorio separado , y ese directorio podría no existir antes de ejecutar make
. En esta situación, desea que el directorio se cree antes de que se coloquen los objetivos pero, como las marcas de tiempo en los directorios cambian cada vez que se agrega, elimina o renombra un archivo, sin duda no queremos reconstruir todo los objetivos cada vez que cambia la marca de tiempo del directorio. Una manera de manejar esto es con la orden de sólo requisitos previos: hacer que el directorio de una orden de sólo un requisito previo en todos los los objetivos:
OBJDIR := objdir
OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o)
$(OBJDIR)/%.o : %.c
$(COMPILE.c) $(OUTPUT_OPTION) $<
all: $(OBJS)
$(OBJS): | $(OBJDIR)
$(OBJDIR):
mkdir $(OBJDIR)
Ahora la regla para crear el directorio 'objdir' se ejecute, si es necesario , antes de que se genere '.o', pero no se generará '.o' porque la marca de tiempo del directorio 'objdir' ha cambiado.
Esto realmente no responde la pregunta, así que me sorprende que haya sido aceptado. –
La pregunta que leí allí es "Parece que generalmente se realizarán en orden' b', 'c',' d', 'e', pero ¿puede suceder que el orden sea diferente?". Estoy bastante seguro de que proporcioné un contraejemplo. Tu opinión puede variar, supongo. –
* prerrequisitos de solo pedido * ** están ** compilados en un orden particular. Sin embargo, no estoy seguro de si el póster sabía que había algo más que * requisitos previos * basados en su suposición. – jww