
Habe gerade mein erstes Makefile geschrieben und kann nicht verstehen, warum GNUmake bei jedem Aufruf alles neu kompiliert make
. Hier ist es:
# 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/*
Was ist falsch? Die endgültige Ordnerhierarchie:
bin/currentPlot
bin/selectEvents
bin/tier1browser
lib/tier1BrowserDict.cxx
lib/tier1BrowserDict_rdict.pcm
Makefile
currentPlot.cc
selectEvents.cc
tier1Browser.cxx
tier1Browser.h
tier1BrowserLinkDef.h
Gibt es für Neulinge noch weitere Tipps, wie man es effizienter und eleganter machen kann?
Antwort1
Sie fragen Makefile nach einer Abhängigkeit vom aktuellen Verzeichnis
currentPlot : currentPlot.cc
make erwartet einen Dateinamen currentPlot
im aktuellen Verzeichnis und Sie erstellen in bin
dir ( -o bin/$@
).