Sto cercando di scrivere un Makefile con i miei file sorgente e oggetto separati e non riesco a trovare il modo corretto per farlo. Ho due metodi che funzionano ma spero che qualcuno possa indicare il modo "corretto" per farlo.Metodo corretto per i bersagli con caratteri jolly in GNU Make
Il mio progetto è separato in una cartella src
e obj
con il Makefile allo stesso livello di questi.
Il primo metodo utilizza la funzione jolly per trovare i file di origine in src
quindi utilizza la sostituzione del testo per determinare i file oggetto corrispondenti.
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)
Questo sembra funzionare, però, ogni volta che faccio funzionare make prog
si ricompila tutti i file oggetto. La variabile OBJ
deve avere lo src/
davanti a tutti gli oggetti oppure ottengo la "regola per non rendere la mira". Per quanto riguarda i lati positivi, posso facilmente utilizzare la funzione patsubst nel target prog
per specificare i file oggetto.
Il secondo metodo è simile ma utilizza vpaths e il testo di sostituzione sul OBJ
variabile:
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)
Questo elimina la ricompilazione del file oggetto, ma mi richiede di aggiungere un'altra variabile POJB
per il prog
di destinazione (da quando ho non posso fare alcun pivot su solo i file oggetto senza un basedir).
Entrambi i metodi funzionano e ognuno ha i suoi vantaggi rispetto all'altro, ma quale è l'approccio "corretto" e se nessuno dei due, qual è il modo corretto per realizzare questo tipo di edificio?
'SRC = $ (. Jolly src/**/* cpp)' per il codice sorgente seduto nella sottodirectory 'src' – checksum