2012-12-25 12 views
17

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?

risposta

19

Il tuo primo esempio è quasi arrivati:

SRC = $(wildcard src/*.cpp) 
OBJ = $(patsubst src/%.cpp, obj/%.o, $(SRC)) 

prog: $(OBJ) 
    $(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) $(OBJ) -o prog 

obj/%.o: src/%.cpp 
    $(CC) $(CFLAGS) -c $< -o [email protected] 
+1

'SRC = $ (. Jolly src/**/* cpp)' per il codice sorgente seduto nella sottodirectory 'src' – checksum