Obteniendo la estructura del código fuente en Makefile

Estoy trabajando en un proyecto de C, y decidí colocar el código fuente y sus objetos en directorios diferentes. El directorio raíz tiene algo así:

SmartC ▶ tree -L 1 . ├── built ├── doc ├── Makefile ├── README.md ├── src ├── tests └── trash 

Por lo tanto, dentro de ambos directorios, src y build, puse otros dos Makefiles para hacer los trabajos de comstackción y enlace.

El directorio src (donde coloco el código fuente) tiene la siguiente estructura:

 src ├── graph.c ├── graph.h ├── list.c ├── list.h ├── main.c ├── Makefile ├── node.c ├── node.h ├── tree.c ├── tree.h └── types ├── complex.c ├── complex.h ├── matrix.c └── matrix.h 

y el construido tiene la misma estructura, pero está destinado a almacenar todos los objetos creados por comstackción.

Mi pregunta es acerca de mi src / Makefile:

 BINDIR = ../built/src CC = gcc CFLAGS = -g -Wall -O3 OBJECTS = \ $(BINDIR)/main.o \ $(BINDIR)/node.o \ $(BINDIR)/list.o \ $(BINDIR)/graph.o \ $(BINDIR)/tree.o \ $(BINDIR)/types/complex.o \ $(BINDIR)/types/matrix.o \ compile: $(OBJECTS) $(BINDIR)/%.o: %.c $(CC) -c $< -o $@ $(CFLAGS) 

Este Makefile crea todos los objetos del código fuente, dentro del directorio src, y los mueve a built / src. Pero, cada vez que creo un nuevo archivo de código fuente (* .c), tengo que poner el nombre de su objeto en este archivo make, para poder comstackrlo. Me gustaría hacer una búsqueda automática, dentro del directorio src, y llenar la variable “OBJETOS” con esta búsqueda.

¿Alguien tiene alguna idea de cómo lograr esto? Quiero decir, ¿búsqueda automática de código fuente dentro de un directorio específico?

Incluso acepto cualquier otra estrategia en lugar de lo que estoy haciendo.

=========== Respuesta ===============

Me dieron la punta (en comentarios) sobre comodines. Así que lo hice. Aquí está la solución que encontré.

src / Makefile

 BINDIR = ../built/src CC = gcc CFLAGS = -g -Wall -O3 OBJECTS := $(patsubst %.c,$(BINDIR)/%.o,$(wildcard *.c */*.c)) compile: $(OBJECTS) $(BINDIR)/%.o: %.c $(CC) -c $< -o $@ $(CFLAGS) 

EDITAR [Resuelto]

Me gusta hacer lo siguiente.

Crear variables para cada directorio del proyecto

 SRCDIR = src OBJDIR = obj LIBDIR = lib DOCDIR = doc HDRDIR = include CFLAGS = -g -Wall -O3 

Obtener solo la estructura interna de SRCDIR recursivamente

 STRUCTURE := $(shell find $(SRCDIR) -type d) 

Obtener todos los archivos dentro de la variable ESTRUCTURA

 CODEFILES := $(addsuffix /*,$(STRUCTURE)) CODEFILES := $(wildcard $(CODEFILES)) 

Filtrar sólo archivos específicos

 # Filter Only Specific Files SRCFILES := $(filter %.c,$(CODEFILES)) HDRFILES := $(filter %.h,$(CODEFILES)) OBJFILES := $(subst $(SRCDIR),$(OBJDIR),$(SRCFILES:%.c=%.o)) # Filter Out Function main for Libraries LIBDEPS := $(filter-out $(OBJDIR)/main.o,$(OBJFILES)) 

Ahora es el momento de crear las Reglas.

 compile: $(OBJFILES) $(OBJDIR)/%.o: $(addprefix $(SRCDIR)/,%.c %.h) $(CC) -c $< -o $@ $(CFLAGS) 

Con este enfoque, puede ver que estoy usando la variable STRUCTURE solo para obtener los archivos dentro del directorio SRCDIR, pero también se puede usar para otros fines, como reflejar el SRCDIR dentro de OBJDIR una vez que STRUCTURE almacena solo las subunidades internas. directorios Es bastante útil después de operaciones de limpieza como:

 clean: -rm -r $(OBJDIR)/* 

NOTA: La regla de comstackción solo funciona bien si para cada * .c existe el archivo * .h correspondiente (con el mismo nombre base, quiero decir).