2012-11-25 11 views
25

Sto provando a creare un Makefile che colloca i miei file .o in una directory diversa da quella dei miei file di origine. Sto cercando di utilizzare una regola di pattern in modo da non dover creare regole identiche per ogni file di oggetto & di origine.GNU Crea pattern per generare output in directory diverse da src

mia struttura del progetto sembra qualcosa di simile:

project/ 
+ Makefile 
+ src/ 
    + main.cpp 
    + video.cpp 
+ Debug/ 
    + src/  [contents built via Makefile:] 
    + main.o 
    + video.o 

mio Makefile sembra qualcosa di simile:

OBJDIR_DEBUG = Debug 
OBJ_DEBUG = $(OBJDIR_DEBUG)/src/main.o $(OBJDIR_DEBUG)/src/video.o 

all: $(OBJ_DEBUG) 

$(OBJ_DEBUG): %.o: %.cpp 
    $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c $< -o [email protected] 

Questo non funziona, perché sembra per i miei file di origine a Debug/src/*.cpp.

Ho provato la seguente:

# Broken: make: *** No rule to make target `Debug/src/main.cpp', needed by `Debug/src/main.o'. Stop. 
# As a test, works if I change "%.cpp" to "Debug/src/main.cpp", though it obv. builds the wrong thing 

# Strip OBJDIR_DEBUG from the start of source files 
$(OBJ_DEBUG): %.o: $(patsubst $(OBJDIR_DEBUG)/%,%,%.cpp) 
    $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c $< -o [email protected] 

# Broken: 
# Makefile:70: target `src/main.o' doesn't match the target pattern 
# Makefile:70: target `src/video.o' doesn't match the target pattern 

# Add OBJDIR_DEBUG in target rule 
OBJ = src/main.o src/video.o 

$(OBJ): $(OBJDIR_DEBUG)/%.o: %.cpp 
    $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c $< -o [email protected] 

risposta

23

dopo aver riletto il documentation on static pattern rules, ho derivato la seguente regola modello che sembra funzionare.

$(OBJ_DEBUG): $(OBJDIR_DEBUG)/%.o: %.cpp 
    $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c $< -o [email protected] 

Non sono sicuro che questo sia l'approccio migliore e sono aperto a suggerimenti.

+3

Questo è l'approccio migliore. – Beta

+1

Cosa succede se ci sono sottodirectory all'interno di OBJDIR_DEBUG? La mia ipotesi è che la compilazione fallirà perché la directory di output non esiste. – aardvarkk

3

Invece di creare oggetti in un'altra directory, puoi provare a creare oggetti da fonti in un'altra directory: inserisci il tuo makefile nella directory in cui si trovano gli oggetti e scrivi make per cercare altrove usando VPATH. Funziona meglio se tutti i file oggetto devono finire nella stessa directory.

Problemi correlati