IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ANT Java Discussion :

ne recompiler que ce qui est nécessaire


Sujet :

ANT Java

  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1
    Par défaut ne recompiler que ce qui est nécessaire
    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 :
    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)
    (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.)

    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 :
    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>
    Outre le fait que le fichier est carrément plus gros, il ne fait pas encore tout à fait ce que je veux :

    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 )

    Merci de votre aide.

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    La philosophie avec ant est de partir du principe que ce n'est pas au script de gérer les dépendances à ce niveau.
    Par exemple en java c'est javac qui s'occupe de ça.
    En C/C++ le problème des dépendances est plus complexe que juste tester 'naïvement' les dates de fichiers (à cause des include notamment, d'où les magouilles avec gcc -E par exemple).

    Donc la réponse exacte à ta question dépend de ce que tu entends par 'compiler' dans ton cas

    MAT.

Discussions similaires

  1. Ne garder que ce qui est entre deux plans
    Par rambc dans le forum OpenGL
    Réponses: 9
    Dernier message: 17/04/2009, 12h39
  2. Déterminer ce qui est nécessaire
    Par mestressat dans le forum Déploiement/Installation
    Réponses: 1
    Dernier message: 24/10/2008, 20h46
  3. Réponses: 5
    Dernier message: 27/06/2007, 09h42
  4. Réponses: 3
    Dernier message: 10/08/2005, 11h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo