2010-04-24 6 views

Respuesta

41
SRCS = $(wildcard *.c) 

PROGS = $(patsubst %.c,%,$(SRCS)) 

all: $(PROGS) 

%: %.c 

     $(CC) $(CFLAGS) -o [email protected] $< 
+6

Con el recordatorio de que el espaciado final es en realidad una pestaña. –

+0

@Martin brillante! Pero no entiendo por qué no llama a PROGS y SRCS en la línea principal. –

+0

@ user4050, lo siento, me perdí tu pregunta. El destino 'all' predeterminado construye' $ (PROGS) ', y la línea principal dice cómo construir archivos sin una extensión, que es lo que' $ (PROGS) 'son, de los archivos'% .c', que es lo que ' $ (SRCS) 'son. –

7

No creo que ni siquiera necesita un makefile - las reglas hacen implícitos por defecto debería hacerlo:

$ ls 
src0.c src1.c src2.c src3.c 
$ make `basename -s .c *` 
cc  src0.c -o src0 
cc  src1.c -o src1 
cc  src2.c -o src2 
cc  src3.c -o src3 

Editado para hacer la línea de comandos un poco más simple.

4
SRCS = $(wildcard *.c) 

PROGS = $(patsubst %.c,%,$(SRCS)) 

all: $(PROGS) 

%: %.c 
     $(CC) $(CFLAGS) -o [email protected] $< 
clean: 
     rm -f $(PROGS) 

Mejorando la respuesta de Martin Broadhurst agregando el objetivo "limpio". "make clean" limpiará todo el ejecutable.

+0

Deberías usar '.PHONY' para un objetivo como' clean'. Ver http://stackoverflow.com/questions/2145590/what-is-the-purpose-of-phony-in-a-makefile por la razón. –

+0

@MartinBroadhurst También deberías usar un '.PHONY' para el objetivo' all'. – iBug

Cuestiones relacionadas