
Acabo de escribir mi primer Makefile y no entiendo por qué GNUmake vuelve a compilar todo cada vez que llamo make
. Aquí lo tienes:
# Makefile
CC = c++
ROOTFLAGS = $(shell root-config --cflags)
MGDOFLAGS = $(shell mgdo-config --cflags)
CLHEPFLAGS = $(shell clhep-config --include)
ALLFLAGS = $(ROOTFLAGS) $(MGDOFLAGS) $(CLHEPFLAGS)
ROOTLIBS = $(shell root-config --glibs) -lSpectrum
MGDOLIBS = $(shell mgdo-config --libs)
CLHEPLIBS = $(shell clhep-config --libs)
ALLLIBS = $(ROOTLIBS) $(MGDOLIBS) $(CLHEPLIBS)
EXEC = tier1browser selectEvents currentPlot
all : $(EXEC)
selectEvents : selectEvents.cc
mkdir -p bin && \
$(CC) $(ALLFLAGS) -o bin/$@ $< $(ALLLIBS)
currentPlot : currentPlot.cc
mkdir -p bin && \
$(CC) $(ROOTFLAGS) -o bin/$@ $< $(ROOTLIBS) -fopenmp -Ofast
tier1browser : tier1Browser.cxx tier1BrowserDict.cxx
mkdir -p bin && \
$(CC)-4.9 $(ALLFLAGS) -I. -o bin/$@ $< lib/tier1BrowserDict.cxx $(ALLLIBS)
tier1BrowserDict.cxx : tier1Browser.h tier1BrowserLinkDef.h
mkdir -p lib && \
cd lib && \
rootcling -f $@ $(MGDOFLAGS) $(CLHEPFLAGS) -c ../tier1Browser.h ../tier1BrowserLinkDef.h; \
cd ..
.PHONY : all clean
clean :
rm -rf bin/* lib/*
¿Qué ocurre? La jerarquía de carpetas final:
bin/currentPlot
bin/selectEvents
bin/tier1browser
lib/tier1BrowserDict.cxx
lib/tier1BrowserDict_rdict.pcm
Makefile
currentPlot.cc
selectEvents.cc
tier1Browser.cxx
tier1Browser.h
tier1BrowserLinkDef.h
¿Algún otro consejo para un novato para hacerlo más eficiente y elegante?
Respuesta1
Le preguntas a Makefile sobre una dependencia del directorio actual
currentPlot : currentPlot.cc
make espera un nombre de archivo currentPlot
en el directorio actual y usted está compilando en bin
el directorio ( -o bin/$@
).