2012-01-20 10 views
8

Me gustaría usar un único archivo Makefile para generar objetivos en cientos de subdirectorios. Cada subdirectorio es una marca de fecha/hora como esta: 20120119_153957, que coincide con el siguiente patrón ????????_??????. No hay otros subdirectorios que coincidan con este patrón.¿Cómo generar una lista de objetivos de creación automáticamente mediante el englobamiento de subdirectorios?

Un objetivo que me gustaría generar se llama ????????_??????/graph.pdf. Tengo un script llamado make_graph que hará que el gráfico tenga el nombre del subdirectorio. Pero no estoy seguro de cómo escribir un Makefile que englobe automáticamente todos los subdirectores y genere estos objetivos mediante programación.

Por ejemplo, el código SUBDIRS:=????????_?????? parece englobar correctamente todos los subdirectorios. Puedo comprobar con esta regla:

.PHONY: print 
print: 
     echo $(SUBDIRS) 

Sin embargo, esta variable de asignación

TARGETS:=$(SUBDIRS:%=%/graph.pdf) 

no parece hacer lo que espero y asigno montones y montones de objetivos. En cambio, la siguiente regla solo imprime un objetivo.

.PHONY: print 
print: 
     echo $(TARGETS) 

Es muy confuso que SUBDIRS deberían tener los subdirectorios correctos pero TARGET sólo tiene un archivo.

+0

¿Es un duplicado de [Cómo utilizar el comodín con make?] (Http://stackoverflow.com/questions/8937430/how-to-use-wildcard-with-make) –

+0

Sí, esta es la pregunta completa. Accidentalmente publiqué una pregunta parcial con el título "¿Cómo se usa el comodín con make?". Traté de cerrar o eliminar esa otra pregunta y dirigir a las personas a esta. Suspiro. –

+0

Ya he respondido a esa pregunta. :( –

Respuesta

14

En su ejemplo, el shell realiza la correspondencia global.

GNU Make ha incorporado en wildcard function, que se puede utilizar de la siguiente manera:

SUBDIRS := $(wildcard ????????_??????) 

Ahora puede utilizar esta variable para construir una lista de objetivos:

.PHONY : all 
all : $(SUBDIRS:%=%/graph.pdf) 

%/graph.pdf : # list prerequisites here. 
    # recipe to make '[email protected]' in directory '$(@D)' from '$^'. 

Ver también: pattern rules, automatic variables.

+0

Eso funcionó muy bien. ¡Gracias! –

+0

@ NathanFarrington, de nada! –

Cuestiones relacionadas