Richtige Methode für Wildcard-Ziele in GNU Make
Ich versuche, ein Makefile mit getrennten Quell- und Objektdateien zu schreiben, und es scheint mir nicht möglich zu sein, den richtigen Weg zu finden, um dies zu erreichen. Ich habe zwei Methoden, die funktionieren, aber ich hoffe, dass jemand den "richtigen" Weg weisen kann, dies zu tun.
Mein Projekt ist in einesrc
undobj
Ordner mit dem Makefile auf der gleichen Ebene wie diese.
Die erste Methode verwendet die Platzhalterfunktion, um die Quelldateien in zu findensrc
verwendet dann die Textersetzung, um die entsprechenden Objektdateien zu bestimmen.
SRC = $(wildcard src/*.cpp)
OBJ = $(SRC:.cpp=.o)
prog: $(OBJ)
$(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) -o prog $(patsubst src/,obj/,$(OBJ))
%.o: %.cpp
$(CC) $(CFLAGS) -c SRC = $(wildcard src/*.cpp)
OBJ = $(SRC:.cpp=.o)
prog: $(OBJ)
$(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) -o prog $(patsubst src/,obj/,$(OBJ))
%.o: %.cpp
$(CC) $(CFLAGS) -c $< -o $(COMPILE)/$(@F)
lt; -o $(COMPILE)/$(@F)
Dies scheint jedoch jedes Mal zu funktionieren, wenn ich rennemake prog
Es kompiliert alle Objektdateien neu. DasOBJ
Variable muss die habensrc/
vor allen objekten sonst bekomme ich die "no rule to make target". Positiv zu vermerken ist, dass ich den patsubst in der leicht benutzen kannprog
Ziel, um die Objektdateien anzugeben.
Die zweite Methode ist ähnlich, verwendet jedoch vpaths und das Ersetzen von Text auf derOBJ
Variable:
vpath = %.cpp src
vpath = %.o obj
SRC = $(wildcard src/*.cpp)
OBJ = $(subst src/,,$(SRC:.cpp=.o))
POBJ = $(patsubst src/,obj/$(SRC:.cpp=.o))
prog: $(OBJ)
$(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) -o prog $(POBJ)
%.o: %.cpp
$(CC) $(CFLAGS) -c vpath = %.cpp src
vpath = %.o obj
SRC = $(wildcard src/*.cpp)
OBJ = $(subst src/,,$(SRC:.cpp=.o))
POBJ = $(patsubst src/,obj/$(SRC:.cpp=.o))
prog: $(OBJ)
$(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) -o prog $(POBJ)
%.o: %.cpp
$(CC) $(CFLAGS) -c $< -o $(COMPILE)/$(@F)
lt; -o $(COMPILE)/$(@F)
Dadurch entfällt das erneute Kompilieren von Objektdateien, ich muss jedoch eine weitere Variable hinzufügenPOJB
für dieprog
target (da ich ohne basedir kein patsubst nur für die objektdateien machen kann).
Beide Methoden funktionieren und jede hat ihre Vorteile gegenüber der anderen, aber welche ist die "richtige" Herangehensweise und wenn keine, wie lässt sich diese Art von Gebäude am besten erreichen?