web-dev-qa-db-fra.com

GNU Créer un modèle pour générer la sortie dans un répertoire différent de celui de src

J'essaie de créer un Makefile qui place mes fichiers .o dans un répertoire différent de celui de mes fichiers source. J'essaie d'utiliser une règle de modèle pour éviter de créer des règles identiques pour chaque fichier source et objet.

Ma structure de projet ressemble à quelque chose comme:

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

Mon Makefile ressemble à quelque chose comme:

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 $@

Cela ne fonctionne pas car il recherche mes fichiers source à Debug/src/*.cpp.

J'ai essayé ce qui suit:

# 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 $@

# 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 $@
27
mrb

Après avoir relu la documentation sur les règles de modèle statiques , j’ai dérivé la règle de modèle suivante qui semble fonctionner.

$(OBJ_DEBUG): $(OBJDIR_DEBUG)/%.o: %.cpp
    $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c $< -o $@

Je ne suis pas sûr que ce soit la meilleure approche et je suis ouvert aux suggestions.

26
mrb

Au lieu de créer des objets dans un autre répertoire, vous pouvez essayer de construire des objets à partir de sources situées dans un autre répertoire: placez votre fichier makefile dans le répertoire où se trouvent les objets et indiquez à make de rechercher des sources ailleurs à l'aide de VPATH. Cela fonctionne mieux si tous les fichiers objet sont supposés se retrouver dans le même répertoire.

3
Bulletmagnet

Le fichier Make "duplique" l'arborescence source dans un répertoire de construction séparé en exécutant GCC sur chaque source - https://stackoverflow.com/a/41924169/4224163

0
Alexey Semenyuk