2010-05-17 5 views
1

Need a makefile dependency rule that can handle missing files donne quelques conseils sur la façon de gérer les fichiers source supprimés pour générer des fichiers .o. J'utilise gcc/g ++, donc l'ajout de l'option -MP lors de la génération de dépendances fonctionne très bien pour moi, jusqu'à ce que j'arrive à la phase de liaison avec mon fichier .a ...Makefile option/règle pour gérer les fichiers source manquants/supprimés

Qu'en est-il de la mise à jour des archives/bibliothèques lorsque les sources d'entrée allez-vous en? Cela fonctionne bien pour moi, mais y a-t-il un moyen plus propre (c'est-à-dire quelque chose d'aussi simple que l'option g ++ -MP)?

#BUILD_DIR is my target directory (includes Debug/Release and target arch) 
#SRC_OUTS are my .o files  

LIBATLS_HAS = $(shell nm ${BUILD_DIR}/libatls.a | grep ${BUILD_DIR} | sed -e 's/.*(//' -e 's/).*://') 
LIBATLS_REMOVE = $(filter-out $(notdir ${SRC_OUTS}), ${LIBATLS_HAS}) 

${BUILD_DIR}/libatls.a: ${BUILD_DIR}/libatls.a(${SRC_OUTS}) 
ifneq ($(strip ${LIBATLS_REMOVE}),) 
    $(AR) -d [email protected] ${LIBATLS_REMOVE} 
endif 

Mise à jour à ce qui suit après les premiers retours:

LIBATLS_HAS := $(shell $(AR) t ${BUILD_DIR}/libatls.a) 
LIBATLS_REMOVE := $(filter-out $(notdir ${SRC_OUTS}), $(filter %.o,${LIBATLS_HAS})) 

.PHONY: clean_archive 
clean_archive: 
    $(AR) -d $(BUILD_DIR)/libatls.a $(LIBATLS_REMOVE) 

.PHONY: $(LIBATLS_REMOVE) 
$(LIBATLS_REMOVE): clean_archive 

${BUILD_DIR}/libatls.a: % : %(${SRC_OUTS}) ${LIBATLS_REMOVE} 

Répondre

0

Il y a plusieurs façons de le faire. Celui qui est assez propre est:

LIBATLS_HAS:=$(shell $(AR) t $(BUILD_DIR)/libatls.a) 
LIBATLS_REMOVE:= $(filter-out $(SRC_OUTS),$(LIBATLS_HAS)) 
REMOVE_LIST = $(addprefix remove_,$(LIBATLS_REMOVE)) 

.PHONY: $(REMOVE_LIST) 
$(REMOVE_LIST): remove_% 
    $(AR) -d $(BUILD_DIR)/libatls.a $* 

$(BUILD_DIR)/libatls.a: % : %($(SRC_OUTS)) $(REMOVE_LIST) 

Ceci est un peu inefficace en ce qu'il exécute une commande séparée $(AR) pour chaque membre à supprimer. Je doute que ce sera un problème, mais si c'est le cas, vous pouvez le contourner avec une cible bidon:

# Note that this will run once at most. 
.PHONY: clean_archive 
clean_archive: 
    $(AR) -d $(BUILD_DIR)/libatls.a $(LIBATLS_REMOVE) 

.PHONY: $(REMOVE_LIST) 
$(REMOVE_LIST): clean_archive 
+0

Merci pour vos commentaires. J'espère toujours d'une manière plus directe. :) Il semble que ce serait un problème commun. J'aime "$ (AR) t" sur le nm | grep | sed. Je dois filtrer la table des matières de l'archive (filtre% .o ci-dessous). La deuxième version devrait utiliser LIBATLS_REMOVE, correct? Mise à jour ci-dessus avec la version combinée. – b3nj1

+0

@ b3nj1: Je ne pense pas qu'il existe un moyen plus direct qui n'implique pas de piratage dangereux. On peut faire une liste de souhaits de fonctionnalités que Make pourrait avoir, mais un Make qui pourrait gérer ce problème très proprement serait un langage à usage général. – Beta

Questions connexes