2010-09-27 1 views
1

Je suis en train de créer un Makefile qui télécharger le fichier et le processus d'un fichier pour générer des cibles, cela est une version simplifiée:gnu font rechargements comprend, mais ne met pas à jour les objectifs

default: all 
.PHONY: all clean filelist.d 
clean: 
    @rm -fv *.date *.d 

#The actual list comes from a FTP file, but let's simplify things a bit 
filelist.d: 
    @echo "Getting updated filelist..." 
    @echo "LIST=$(shell date +\%M)1.date $(shell date +\%M)2.date" > [email protected] 
    @echo 'all: $$(LIST)' >> [email protected] 

%.date: 
    touch [email protected] 

-include filelist.d 

Malheureusement la cible Tout n'est pas mis à jour correctement lors de la première exécution, il doit être réexécuté pour récupérer les fichiers. Ceci est la sortie que je reçois de ce:

$ make 
Getting updated filelist... 
make: Nothing to be done for `default'. 
$ make 
Getting updated filelist... 
touch 141.date 
touch 142.date 
touch 143.date 

J'utilise GNU Make 3,81 dont la documentation indique qu'il relise les tout si les fichiers inclus sont changés. Qu'est-ce qui ne va pas?

Répondre

2

Vous avez spécifié filelist.d en tant que cible .PHONY, alors faites croire que cette cible ne met pas réellement à jour le fichier spécifié. Cependant, c'est le cas, et les nouveaux contenus sont utilisés lors de la prochaine exécution. Pour la première exécution, le fichier manquant n'est pas une erreur car include est préfixé avec le tiret.

Supprimer filelist.d de .PHONY. Cependant, rappelez-vous qu'il ne sera pas régénéré jusqu'à ce que vous le supprimiez (car il ne dépend de rien). Par ailleurs, vous devez inclure "default" dans .PHONY. Par conséquent, vous devez inclure "default" dans .PHONY.


J'ai écrit un script shell plutôt que amalgamer tout cela dans le makefile:

#!/bin/bash 
# Check whether file $1 is less than $2 days old. 

[ $# -eq 2 ] || { 
    echo "Usage: $0 FILE DAYS" >&2 
    exit 2 
} 

FILE="$1" 
DAYS="$2" 

[ -f "$FILE" ] || exit 1 # doesn't exist or not a file 

TODAY=$(date +%s) 
TARGET=$(($TODAY - ($DAYS * 24 * 60 * 60))) 
MODIFIED=$(date -r "$FILE" +%s) 

(($TARGET < $MODIFIED)) 

Remplacer X avec le nombre maximum de jours qui peut passer avant filelist.d est téléchargé à nouveau:

filelist.d: force-make 
     ./less-than-days [email protected] X || command-to-update 
.PHONY: force-make 
force-make: 

Maintenant, filelist.d dépend d'une cible .PHONY, sans être elle-même un faux. Cela signifie que filelist.d est toujours obsolète (les fausses cibles sont toujours "nouvelles"), mais sa recette ne met à jour le fichier que périodiquement. Malheureusement, cela nécessite que vous écriviez la commande de mise à jour en tant que commande unique, et que l'espace puisse être un problème s'il est long. Dans ce cas, je le mettrais dans un script séparé.

+0

Merci, il y a un problème, car je ne sais pas quand le serveur ftp va être mis à jour, donc j'ai besoin de recréer filelist.d à chaque exécution, mais au moins je comprends ce qui se passe. – user459723

+0

@ user459723: Comment ça? –

+1

Cela fonctionne parfaitement, merci! – user459723

Questions connexes