[C con Clase] Reducir el tamaño de este makefile

d1cor cordobadie en gmail.com
Jue Feb 20 16:04:06 CET 2014


On Thu, 20 Feb 2014 08:29:32 +0100
User <usuarioanonimomysql en gmail.com> wrote:

> >
> >> Hola,
> >>
> >> Tengo este makefile:
> >>
> >> programa:
> >>         g++ -o programa include/a.h include/b.h include/c.h include/d.h
> >> include/e.h include/f.h include/g.h src/a.cpp src/b.cpp src/c.cpp
> >> src/d.cpp src/e.cpp src/f.cpp src/g.cpp main.cpp
> >>
> >> Como veis, repito todo el tiempo 'include' y 'src', mi pregunta es la
> >> siguiente, ¿se podrían agrupar aquellos ficheros que pertenezcan a una
> >> carpeta de modo que sólo se tenga que escribir una vez el nombre de
> >> dicha carpeta?
> >>

Podés usar variables para almacenar los nombres de los directorios, y luego utilizar funciones de sustitución de listas para reemplazar los nombres de archivos por su equivalente con el path completo.

Por ejemplo, si tenés la siguiente estructura de directorios:
aplicacion/
--- include/
------archivos .h
--- src/
------ archivos .c y Makefile
--- obj/
------ dir donde caen los .o

En el makefile podrías escribir:

La variable IDIR almacena tu directorio include en forma relativa desde donde está el makefile (por defecto, debería estar junto con los fuentes)

La variable ODIR es el directorio donde querés que caigan los .o. Idem, en forma relativa desde la ubicación del makefile.

La función patsubst lee la lista de archivos _DEPS y _OBJ, y arma nuevas listas DEP y OBJ reemplazando los nombres de archivos por los nombres ../include/xxx.h y ../obj/xxx.o respectivamente.

El último bloque toma la lista DEPS generada como dependencia, y compila y guarda los .o en el directorio ODIR que hayas puesto.

De esta forma solo deberías preocuparte de mantener la lista de .h en _DEPS y la lista de .o en _OBJ, el resto se hace solo.

Te paso el ejemplo:

IDIR =../include
CC=gcc
CFLAGS=-I $(IDIR)
ODIR=../obj

_DEPS = cabecera1.h cabecera2.h cabecera3.h
_OBJ = objeto1.o objeto2.o objeto3.o

DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))


$(ODIR)/%.o: %.c $(DEPS)
	$(CC) -c -o $@ $< $(CFLAGS)

aplicacion: $(OBJ)
	$(CC) -o $@ $^ $(CFLAGS)

Espero que te sirva. Saludos a toda la lista!

-- 
Ing. Diego Cordoba (AKA d1cor)
GNU/Linux Instructor & Consultant
LPI Linux Certified Professional
CLA Carrera Linux Argentina
www.carreralinux.com.ar
www.d1cor.com.ar




Más información sobre la lista de distribución Cconclase