Ejecute un objetivo de creación para varias reglas

Tengo una lista de bibliotecas donde cada una tiene 2 archivos (.so, .dll). ¿Cómo debo crear una regla de creación que ejecute la receta solo una vez si faltan ambos archivos o si falta uno de ellos?

LIBS = alib blib
LIBS_SO = $(patsubst %, %.so, $(LIBS))
LIBS_DLL = $(patsubst %, %.dll, $(LIBS))

Si hago este objetivo

$(LIBS_SO) $(LIBS_DSS):
    cp .....

copia solo una vez para todas las posibilidades.

Si hago esto:

all : $(LIBS_SO) $(LIBS_DSS):
$(LIBS_SO) $(LIBS_DSS):
     cp .....

Copio en todos los casos los archivos que faltan. quiero copiar el alib directorio si ambos o uno de los archivos alib.dll / alib.so Está perdido; lo mismo con blib.

preguntado el 01 de julio de 12 a las 15:07

Esto realmente no está claro. ¿Qué es lo que estás copiando? ¿Y cuál es el problema? -

2 Respuestas

Tienes un error tipográfico consistente LIBS_DSS donde (presuntamente) quisiste decir LIBS_DLL.

Su primera 'regla' es una abreviatura de:

alib.so:
    cp ...
blib.so:
    cp ...
alib.dll:
    cp ...
blib.dll:
    cp ...

Entonces, cuando se le pide que construya, make construye el primer objetivo en el archivo, que es alib.so. Por eso lo hace una vez.

La segunda versión, cuando se corrige para eliminar los dos puntos adicionales y el error tipográfico, debería funcionar:

all: $(LIBS_SO) $(LIBS_DLL)

$(LIBS_SO) $(LIBS_DLL):
     cp .....

La regla predeterminada es all; para hacer all, make asegura que cada uno de los archivos alib.so, blib.so, alib.dll y blib.dll existe y está actualizado. Debería ejecutar los comandos una vez por cada objetivo faltante.

Es posible que tenga problemas si ejecuta un paralelo make; make -j4 o algo similar. Podría lanzar cuatro comandos de copia casi simultáneamente para hacer cada uno de los objetivos. Pero en una compilación no paralela, garantizará alib.so está actualizado (y si no lo está, hará la copia). Si esa copia también copia alib.dll, entonces no se volverá a copiar cuando se asegure alib.dll está actualizado.

Respondido 01 Jul 12, 15:07

No nos has dado mucha información, pero creo que esto hará lo que quieras:

all : $(LIBS_SO) $(LIBS_DLL):
%.so %.dll:
    cp $* directory ...

Si ambos alib.so y alib.dll faltan, Make ejecutará esta regla solo una vez.

EDIT: Gracias a Jonathan Leffler por detectar el error tipográfico.

Respondido 01 Jul 12, 16:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.