2010-05-04 3 views
1

toujours Cependant, il ne se produit que sur Windows 7. Sous Windows XP une fois construit et intact, pas plus builds. Je PRECISEE la question à une condition sine qua non - $(jar_target_dir).Cygwin rendre le traitement cible

Voici une partie du code

# The location where the JAR file will be created. 
jar_target_dir := $(build_dir)/chrome 

# The main chrome JAR file. 
chrome_jar_file := $(jar_target_dir)/$(extension_name).jar 

# The root of the JAR sources. 
jar_source_root := chrome 

# The sources for the JAR file. 
jar_sources := bla #... some files, doesn't matter 

jar_sources_no_dir := $(subst $(jar_source_root)/,,$(jar_sources)) 

$(chrome_jar_file): $(jar_sources) $(jar_target_dir) 
    @echo "Creating chrome JAR file." 
    @cd $(jar_source_root); $(ZIP) ../$(chrome_jar_file) $(jar_sources_no_dir) 
    @echo "Creating chrome JAR file. Done!" 

$(jar_target_dir): $(build_dir) 
    echo "Creating jar target dir..." 
    if [ ! -x $(jar_target_dir) ]; \ 
    then \ 
    mkdir $(jar_target_dir); \ 
    fi 

$(build_dir): 
    @if [ ! -x $(build_dir) ]; \ 
    then \ 
    mkdir $(build_dir); \ 
    fi 

donc si je viens de supprimer $(jar_target_dir) de la règle $(chrome_jar_file), il fonctionne très bien.

UPD:

est ici la sortie de débogage de base de faire sur Windows 7

Reading makefiles... 
Updating goal targets.... 
File `all' does not exist. 
    Prerequisite `../bin/build/chrome' is newer than 
      target `../bin/build/chrome/alt.jar'. 
    Must remake target `../bin/build/chrome/alt.jar'. 
Creating chrome JAR file. 
updating: content/about.js (deflated 66%) 
updating: content/sprintf.js (deflated 52%) 
... 

et statistiques

$ stat ../bin/build/chrome/alt.jar ../bin/build/chrome 
    File: `../bin/build/chrome/alt.jar' 
    Size: 29220   Blocks: 32   IO Block: 65536 regular file 
Device: 22c6affh/36465407d  Inode: 59672695062724268 Links: 1 
Access: (0644/-rw-r--r--) Uid: (1000/ acid) Gid: ( 513/ None) 
Access: 2010-05-05 13:03:01.066457300 +0900 
Modify: 2010-05-05 13:03:01.088960100 +0900 
Change: 2010-05-05 13:03:01.091460400 +0900 
    File: `../bin/build/chrome' 
    Size: 0    Blocks: 0   IO Block: 65536 directory 
Device: 22c6affh/36465407d  Inode: 3940649674014457 Links: 1 
Access: (0755/drwxr-xr-x) Uid: (1000/ acid) Gid: ( 513/ None) 
Access: 2010-05-05 13:03:01.090960400 +0900 
Modify: 2010-05-05 13:03:01.090960400 +0900 
Change: 2010-05-05 13:03:01.090960400 +0900 

que vous pouvez voir chrome dir est vraiment plus récent que alt.jar

SOL: Comme Eri c mentionné, c'était une mauvaise idée d'avoir un pré-requis d'annuaire et d'en faire un fichier de production. Chaque fois que le mtime est mis à jour, il doit «reconstruire». Cette partie est claire. Cependant, pour certains cas, les horodatages de répertoire et fichiers créés à l'intérieur sont toujours égales. C'est déroutant ...

+1

Luttant pour trouver la question dans le texte - Pouvez-vous clarifier le problème un peu? –

+0

oui, le problème décrit dans le sujet. Une fois que la cible est construite, je devrais avoir un message "à jour" pour que les tentatives de compilation soient exécutées. Cependant, il lance toujours la commande pour '$ (chrome_jar_file)' – Pablo

+0

Pouvez-vous confirmer: il refait '$ (chrome_jar_file)' mais pas '$ (jar_target_dir)' ni rien d'autre? et '$ (jar_target_dir)' existe? – Beta

Répondre

3

Chaque fois que vous ajoutez ou supprimez des fichiers dans un répertoire, l'heure de modification du répertoire change. Pour cette raison, il est difficile d'utiliser des répertoires comme condition préalable dans un Makefile, en particulier si le répertoire est destiné à contenir des fichiers créés pendant la construction.

Si vous utilisez GNU make 3.80 ou 3.81, vous pouvez déclarer la dépendance du répertoire comme une condition order-only:

$(chrome_jar_file): $(jar_sources) | $(jar_target_dir) 

Notez le caractère (ou barre verticale) précédant $(jar_target_dir). Cela indique à GNU make que la dépendance est satisfaite tant que le répertoire existe, indépendamment de l'heure de modification du pré-requis.

Si vous n'utilisez pas GNU make, ce problème est généralement résolu en utilisant un fichier "factice" dans le répertoire. Ce fichier est créé en même temps que le répertoire, puis vos autres cibles dépendent du fichier fictif au lieu du répertoire lui-même. L'avantage ici est bien sûr que l'heure de modification du fichier fictif ne change pas lorsque d'autres fichiers sont ajoutés au répertoire. Voici ce que cela ressemblerait à ceci:

$(chrome_jar_file): $(jar_sources) $(jar_target_dir)/dummy 

$(jar_target_dir)/dummy: 
     echo "Creating jar target dir..." 
     mkdir -p $(jar_target_dir) 
     touch $(jar_target_dir)/dummy 
+0

@Eric Melski: Vous avez raison! – Pablo

0

Votre règle pour créer $ (jar_target_dir) semble suspect. Il crée le répertoire s'il n'a pas le bit exécutable, ce qui ne semble pas correct. Je suppose que vous voulez faire quelque chose comme

$(jar_target_dir): $(build_dir) 
     echo "Creating jar target dir..." 
     [ -e $(jar_target_dir) ] || mkdir $(jar_target_dir) 
+0

@JesperE: ça n'a pas aidé, désolé ... – Pablo

0

Je n'ai pas Windows 7 pour jouer avec (hah!), Mais il semble que lorsque vous modifiez un fichier, le système d'exploitation marque alors le répertoire dans lequel il est en étant modifié.

donc vous devez repenser la règle $(chrome_jar_file). Je suggère:

$(chrome_jar_file): $(jar_sources) 
    @if [ ! -x $(build_dir) ]; then mkdir $(build_dir); fi 
    @if [ ! -x $(jar_target_dir) ]; then mkdir $(jar_target_dir); fi 
    ...