20 de Julio, 2014

El Makefile perfecto

Igual el título es un poco efectista, pero dado que me ha costado un poco dar con el Makefile para mis proyectos C++ con SFML, lo pongo por aquí por si le es útil a alguien más.

BIN=main
CXX=g++
# debug
CXXFLAGS=-fPIC -I. -c -Wall -ggdb -DDEBUG
LDFLAGS=
# release
#CXXFLAGS=-fPIC -O2 -I. -c -Wall
#LDFLAGS=-s
LIBS=-lsfml-system -lsfml-graphics -lsfml-window
 
SOURCES=$(wildcard *.cc)
OBJECTS=$(SOURCES:.cc=.o)
 
all: $(SOURCES) $(BIN)
 
clean:
    rm -f $(BIN) *.o *.orig Makefile.deps
 
Makefile.deps:
    $(CXX) $(CXXFLAGS) -MM $(SOURCES) > Makefile.deps
 
$(BIN): $(OBJECTS)
    $(CXX) $(LDFLAGS) $(OBJECTS) $(LIBS) -o $@
 
.cc.o:
    $(CXX) $(CXXFLAGS) $< -o $@
 
include Makefile.deps

Asumo GNU Make, aunque la verdad es que no sé si funcionaría con otras implementaciones.

Lo más destacable es que busca las dependencias automáticamente (usando el flag -MM del compilador), de forma que cuando modificamos un fichero solo recompilamos los objetos que se ven afectados. Además asume que todos los ficheros .cc del directortio forman parte del proyecto y que los includes locales están en el mismo directorio (es un proyecto prequeño).

La verdad es que probé CMake, que es lo que usa SFML para configurar y compilar; pero entre que no tengo necesidad real de configurar (por ahora no distribuyo fuentes) y al final CMake genera Makefiles, decidí investigar un poco más lo que ya sabía en lugar de dedicar tiempo a una herramienta nueva que por ahora no necesito.

Al final lo que más tiempo me llevó fue dar con el orden en el que hay que enlazar las librerías, por tema de dependencias entre ellas, y todo porque no leí correctamente la entrada en el FAQ :(.

Anotación por Juan J. Martínez, clasificada en: programming, cpp, sfml.

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Algunas anotaciones relacionadas: