2010-12-01 8 views
16

Supongamos que estoy trabajando en un makefile y tengo la siguiente declaración de variables en la parte superior:¿Cómo usar una lista de variables como un objetivo en un Makefile?

FILES = file1.cpp file2.cpp file3.cpp 

Ahora supongamos que quiero compilar cada uno de los que tienen un comando especial sin especificar cada objetivo como esto:

file1.o : file1.cpp 
    custom_command file1.cpp 
file2.o : file2.cpp 
    custom_command file2.cpp 
file3.o : file3.cpp 
    custom_command file3.cpp 

¿Hay una mejor manera de hacerlo utilizando la variable $(FILES) que declare anteriormente?

Algo así como:

$(FILES:.cpp=.o) : $(FILES) 
    custom_command $(FILES) 

... Sólo tiene que hacer esto para cada archivo en la variable $(FILES).

Respuesta

29

Sí. Hay lo que se conoce como reglas de patrones. Un ejemplo es el más fácil de entender:

%.o: %.cpp 
     $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o [email protected] 

(recuerde que requieren Makefile pestañas). Esta regla describe cómo hacer un archivo de objeto desde un archivo cpp.

Si no desea que una regla tan amplia, se puede utilizar lo que se llama patrones estáticos:

objects = file1.o file2.o file3.o 

all: $(objects) 

$(objects): %.o: %.cpp 
     $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o [email protected] 

Aquí está la sección sobre static pattern rules y pattern rules en el manual de GNU Make.

6

Usted puede hacer eso, de acuerdo con lo siguiente:

SRCS=a.c b.c 
OBJS=$(SRCS:.c=.o) 

$(OBJS): $(SRCS) 
     cc -c -o a.o a.c 
     cc -c -o b.o b.c 

pero hay que recordar que las dependencias son completa - se supone que a.o depende de b.c, así que probablemente no es el caso.

Lo que estás probablemente después de una sola regla sobre cómo convertir un tipo de archivo a otro:

SRCS=a.c b.c 
OBJS=$(SRCS:.c=.o) 

all: $(OBJS) 

.c.o: 
     gcc -c -o [email protected] $< 

.c.o es una regla que establece lo manda a ejecutar para convertir un archivo en un .c.o archivo. En el comando real, [email protected] se reemplaza con el objetivo específico y $< se reemplaza con el nombre del primer requisito previo.

hay muchas otras variables automáticas se pueden utilizar, mirar hacia arriba con info make o buscar un buen libro sobre make si usted no tiene las cosas info disponible.

+0

Ya, eso es más o menos lo que estoy tratando de hacer. –

+0

Otra forma de especificar dependencias exactamente es usar [expansión secundaria] (https://www.gnu.org/software/make/manual/html_node/Secondary-Expansion.html) de los requisitos previos (función específica de GNU Make). – ruvim

1
SRCS = a.c b.c 
OBJS = $(SRCS:.c=.o) 

.c.o: 
     ${CC} ${CFLAGS} -c -o [email protected] $< 

Aunque $< no es muy portátil (IIRC, bsdmake tiene el significado de $^ y $< exactamente intercambiado a lo gmake usos), esta es la receta predeterminada para .c.o que sería, en efecto, ya sea en la implementación.

Cuestiones relacionadas