Machen Sie das Neukompilieren unveränderter Dateien

Machen Sie das Neukompilieren unveränderter Dateien

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 bindir ( -o bin/$@).

verwandte Informationen