2017-07-09 1 views
0

je les suivantes Makefile (réduite à ne pas tenir compte des choses non pertinentes):Makefile construit tout à chaque fois

BUILD_DIR=./build 
OBJS = \ 
    $(BUILD_DIR)/main.o \ 
    $(BUILD_DIR)/common.o \ 
    ... 

roo: $(OBJS) 
    $(CXX) -o [email protected] $(OBJS) $(LFLAGS) 

.PHONY: $(BUILD_DIR) 
$(BUILD_DIR): 
    mkdir -p $(BUILD_DIR)/passes 

$(BUILD_DIR)/%.o: src/%.cpp $(BUILD_DIR) 
    $(CXX) -o [email protected] -c $< $(CFLAGS) 

Cependant, chaque fichier objet est recompilé à chaque fois, même pensé que je suis la règle d'utiliser directement [email protected] dans chaque cible non-bidon.

Je ne pense pas que ce soit un doublon de this parce que j'applique le sous-répertoire dans la règle plutôt que dans la recette, mais je peux me tromper? Comment puis-je faire pour suivre correctement les dépendances dans le répertoire de construction?

Répondre

1

Vous avez déclaré que $(BUILD_DIR)/%.o dépend de $(BUILD_DIR), mais ce répertoire sera touché chaque fois qu'un fichier est ajouté à ce répertoire (par exemple, par cette règle elle-même). En d'autres termes, $(BUILD_DIR) sera toujours être plus récent que sa cible.

Il semble que vous souhaitiez créer le répertoire de construction automatiquement. La meilleure façon de le faire, je pense, est

$(BUILD_DIR)/%.o: src/%.cpp 
    mkdir -p $(BUILD_DIR)/passes 
    $(CXX) -o [email protected] -c $< $(CFLAGS) 
+0

Merci; le corrige parfaitement –

+0

Ou vous pouvez créer 'create-dir:' PHONY-target. Dans cette cible, vous pouvez exécuter 'mkdir -p $ {BUILD_DIR}/passes' et la dépendance' $ {BUILD_DIR} /%. O' sera 'create-dir' - vous pouvez donc la réutiliser si nécessaire. – uzsolt

+0

Il ne sert à rien de faire le test. Vous pourriez aussi bien lancer 'mdir -p'. Ce sera un no-op si le répertoire existe déjà. – MadScientist