Comment à force de faire toujours la reconstruction d'un fichier
J'ai une version.c fichier dans mon projet qui contient de la révision en cours du projet et quelques autres trucs qui est passé comme une définition (-D option de compilation) de makefile.
Je sais qu'à force de faire de compiler la version.c toujours indépendamment de la date de modification, je peux touch version.c
.
Est-il un makefile seul moyen d'y parvenir? Si j'écris .PHONY : version.o
le fichier objet n'est pas se construire à tous.
EDIT:
Voici mon makefile:
export CC = gcc
export MODULES = $(sort \
sys \
cim \
version \
)
export FILES = $(sort \
main.c \
cim.c \
version.c \
)
VPATH = $(MODULES)
OBJS = $(FILES:.c=.o)
INCLUDES = $(addprefix -I,$(MODULES))
all:$(OBJS)
$(CC) $(INCLUDES) $(OBJS) -o main.exe
clean:
rm -rf *.o *.exe
cim.o: cim.c
main.o: main.c cim.o
version.o: version.c
.PHONY: version.o
.c.o :
$(CC) $(CFLAGS) $(INCLUDES) -c $<
- Est l'absence de
:
après.PHONY
un copier/coller de l'erreur dans votre post? Pourriez-vous montrer un peu de votre Makefile? Aussi: stackoverflow.com/questions/816370/... - c'était une faute de frappe
- S'il vous plaît montrer au moins une partie de votre Makefile. Le
.PHONY
"truc" fonctionne. - Les objectifs de "tous" et "propre", sont autorisées, fausses cibles. Je reste à être convaincu que la " version.o' peut légitimement être classé comme un faux cible. Après tout, c'est un vrai fichier.
- mais c'est ce que je reçois dans le résultat: gcc-Icim -Isys -Iversion -c cim/cim.c gcc-Icim -Isys -Iversion -c-sys/main.c gcc-Icim -Isys -Iversion cim.o principal.o version.o-o main.exe gcc.exe: version.o: Aucun fichier ou répertoire de make[1]: *** [all] Erreur 1
Vous devez vous connecter pour publier un commentaire.
Le classique de la façon de le faire est:
(et on pourrait ajouter
.PHONY: .FORCE
). Le fichier".FORCE est supposé ne pas exister, de sorte qu'il est toujours "créé", doncversion.o
est toujours pas à jour de w.r.t, doncversion.o
est toujours compilé.Je ne suis pas sûr que faire
version.o
dans un faux fichier est correct; c'est en fait un fichier réel, pas un faux un.Pas un makefile façon, mais plus facile que de toucher:
Si vous voulez faire cela en utilisant la FORCE du mécanisme de la bonne solution ressemble à ceci:
En déclarant explicitement
FORCE
être faux nous nous assurons que tout fonctionne bien, même si.SECONDARY:
est utilisé (.SECONDARY:
va provoquerFORCE
être considéré comme un fichier intermédiaire, et n'est pas reconstruit les fichiers intermédiaires, sauf s'ils ont des préalables plus récentes que la cible ultime, etFORCE
n'ont pas de conditions préalables, de sorte.PHONY: FORCE
est nécessaire).L'autre solution (à l'aide de
$(shell touch version.c)
) a aussi un problème: il peut causer votre éditeur de penser à la version.c a été mis à jour, et l'invite pour un rechargement du fichier, qui pourrait être destructeur si vous avez été en éditant le fichier de la mémoire tampon, mais qui n'ont pas encore enregistré. Si vous n'avez pas l'esprit à cela, il peut être encore plus simple en observant que letouch
commande est silencieux, de sorte que l'affectation à lahack
dummy variable n'est pas nécessaire:L' .FAUX "truc" mentionné dans les commentaires sur la question en général NE fonctionne PAS. Il peut sembler comme il le fait parce qu'il force un relink iff
version.o
existe déjà, mais l'objet même fichier ne sera pas reconstruit si le.o
fichier de règle est une règle implicite (ce qui est souvent le cas). Le problème, c'est que ne pas le faire, la règle implicite de recherche explicite des fausses cibles. Ce dossier montre l'échec:Si un modèle statique règle est utilisée au lieu d'une règle implicite de la
.PHONY: version.o
astuce fonctionne. En général à l'aide du modèle statique règles au lieu de règles implicites des coupes de plus en plus confus Faire de comportements. Mais la plupart de rendre l'utilisation des fichiers des règles implicites.Rapide hack version lorsque vous avez juste besoin de travailler et vous ne voulez pas jouer Faire jeux:
Fondamentalement, il suffit de faire exécuter
touch
pour vous.