Bonjour,
Jusqu'à présent j'utilisais make, et j'avoue que je suis un peu perdu avec ANT.
Je cherche à faire quelque chose de très simple : ne recompiler que ce qui est nécessaire. C'est-à-dire, si j'ai déjà commencé à compiler mon projet, mais qu'une erreur est intervenue en cours de chemin, lors de mon prochain appel à ant, je ne veux pas recompiler tous les fichiers qui avaient été compilés correctement.
Pour cela, je me suis dit que j'allais commencer par essayer d'imiter le comportement de ce Makefile :
(c'est-à-dire qu'il y a 5 cibles, A B C D et E qui créent un fichier du même nom. C dépend de A et de B, et D et E dépendent de C.)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 files = A B C D E .PHONY: all all: D $(files): touch $@ C: A B D E: C .PHONY: clean clean: rm -f $(files)
Si je demande à créer D, A B C et D sont créés.
Si je demande ensuite de créer E, il n'y a que E de créé, puisque A B et C existent déjà.
Après quelques recherches sur le net, je trouve que pour faire ce genre de choses avec ant, il faut utiliser l'attribut unless de la target, en mettant en dépendance une target annexe qui calcule s'il faut effectivement exécuter la target demandée.
Après pas mal d'efforts, j'arrive à ceci :
Outre le fait que le fichier est carrément plus gros, il ne fait pas encore tout à fait ce que je veux :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 <?xml version='1.0'?> <project name='test' basedir='.' default='D'> <target name='check.A'> <available property='uptodate.A' file='A'/> </target> <target name='A' depends='check.A' unless='uptodate.A'> <echo message='A'/> <touch file='A'/> </target> <target name='check.B'> <available property='uptodate.B' file='B'/> </target> <target name='B' depends='check.B' unless='uptodate.B'> <echo message='B'/> <touch file='B'/> </target> <target name='check.C'> <uptodate property='uptodate.C' targetfile='C'> <srcfiles dir='.'> <filename name='A'/> <filename name='B'/> </srcfiles> </uptodate> </target> <target name='C' depends='check.C,A,B' unless='uptodate.C'> <echo message='C'/> <touch file='C'/> </target> <target name='check.D'> <uptodate property='uptodate.D' targetfile='D' srcfile='C'/> </target> <target name='D' depends='check.D,C' unless='uptodate.D'> <echo message='D'/> <touch file='D'/> </target> <target name='check.E'> <uptodate property='uptodate.E' targetfile='E' srcfile='C'/> </target> <target name='E' depends='check.E,C' unless='uptodate.E'> <echo message='E'/> <touch file='E'/> </target> <target name='clean'> <delete file='A'/> <delete file='B'/> <delete file='C'/> <delete file='D'/> <delete file='E'/> </target> </project>
Si, une fois que j'ai créé D, je modifie A, je voudrais que lorsque je redemande D, il m'update C, puis D. Ce qu'il ne fait pas.
Y a-t-il un moyen de faire ça sans faire tout le calcul dans check.D et check.E (ce qui n'est pas maintenable si le graphe de dépendance a une grande profondeur) ?
Est-ce que je suis passé à côté d'une fonctionnalité de ant qui fait ça automatiquement ?
Au passage, existe-t-il un moyen de faire des règles génériques avec ant ? (du genre de)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $(files): touch $@
Merci de votre aide.
Partager