7
votes

Puis-je afficher la progression d'une construction utilisant des scêtions?

J'ai un système de construction simple pour un projet que j'ai mis en place avec Swons . Le projet dispose de nombreux fichiers source et je pensais qu'il serait convivial d'afficher une sorte d'informations de progression à mesure que la construction progresse. Scons fournit des variables de construction telles que CXXCOMSTR que je peux remplacer pour contrôler ce qui est affiché sur le terminal au cours de chacune des étapes de construction. Par exemple, au lieu de voir quelque chose comme: xxx

Il serait agréable d'avoir quelque chose comme: xxx

où le [ 1/10] Spécifie qu'il s'agit du premier de dix objectifs qui sont mis à jour lors de cette construction. Y a-t-il un moyen d'accéder à ces informations afin que je puisse générer des messages comme celui-ci? On dirait que je devrais connaître le nombre total de cibles qui sont mis à jour (qui repose sur la numérisation de dépendance que Scons fait) et une manière d'énumérer chacun. Je sais que des comportements similaires sont similaires avec d'autres systèmes de construction tels que Cumake et WAF, mais n'ont rencontré rien dans la documentation de Scuons (expansive).


0 commentaires

3 Réponses :


5
votes

Ceci peut être fait avec le Progress () Fonction SCONS.

Il y a plus d'exemples dans le Page Scons Man , Juste chercher "Progress".

Vous pouvez soit apporter une fonction à appeler, une chaîne qui sera affichée périodiquement, ou une liste des chaînes qui seront affichées de manière tournante. Vous pouvez avoir accès à la cible actuelle en cours de construction, mais je ne pense pas qu'il soit possible de connaître le pourcentage complet.


1 commentaires

Merci pour l'info. Malheureusement, je pense que la réponse ultime à ma question se trouve sur le bas de cette page: (Notez qu'il y a une question suivante évidente ici: Comment trouverez-vous le nombre total de nœuds qui seront évalués afin que vous puissiez Dites à l'utilisateur à quel point la construction est de terminer? Malheureusement, dans l'affaire Général, il n'ya pas de bon moyen de le faire, à moins que les scons évaluent deux fois son graphique de dépendance, d'abord pour compter le total et la deuxième fois Construisez les cibles ...) Donc, il semble que je ne puisse pas obtenir le [1/10] progressant compteur que je voudrais.



4
votes

J'ai pu proposer une solution de contournement assez décente qui vous permet d'afficher la progression de la construction en pourcentage. Fondamentalement comment fonctionne le code suivant:

  • Si une cible n'a jamais été construite auparavant, elle affichera [??%] code> à côté de chaque cible li>
  • Pendant la première fois, il est en cours de construction, il mettra en cache le total des nœuds traités pour cette cible dans .scons_progress code> li>
  • La prochaine fois que vous exécutez une version, il sera lu dans le fichier au démarrage et obtenez le total des nœuds de cette cible la dernière fois et l'utilisera pour afficher un pourcentage (c'est-à-dire [50%] code>). li>
  • Si le nombre de nœuds dépasse jamais le total de la mises en cache, il reviendra retourner à [??%] code> et mettre à jour .scons_progress code> li>
  • Au fil du temps, votre sconstrique "se stabilise" (c'est-à-dire que vous ne apportez pas de modifications tout le temps), ces valeurs de cache doivent devenir de plus en plus précises. li>
  • Mise à jour du cache va ralentir votre build (légèrement par nœud) afin que vous puissiez définir l'intervalle sur code> sur 5 afin qu'il met uniquement à jour le cache tous les 5 nœuds li> ul>

    Voici le code: p>

    in Custom_Utils.py code> sous Site_Scons / Code>: P>

    user@linuxbox:~/project1$ scons -j4 --progress
    scons: Reading SConscript files ...
    scons: done reading SConscript files.
    scons: Building targets ...
    [??%] Compiling (shared): src/ExpressRuntimeException.os
    [??%] Compiling (shared): src/Application.os
    [??%] Compiling (shared): src/Callback.os
    [??%] Compiling (shared): src/Response.os
    [??%] Compiling (shared): src/Router.os
    [??%] Compiling (shared): src/Route.os
    [??%] Compiling (shared): src/Regex.os
    [??%] Compiling (shared): src/tools.os
    [??%] Linking   (shared): libexpresscpp.so
    scons: done building targets.
    
    user@linuxbox:~/project1$ scons -c
    scons: Reading SConscript files ...
    scons: done reading SConscript files.
    scons: Cleaning targets ...
    Removed src/ExpressRuntimeException.os
    Removed src/Application.os
    Removed src/Callback.os
    Removed src/Response.os
    Removed src/Router.os
    Removed src/Route.os
    Removed src/Regex.os
    Removed src/tools.os
    Removed libexpresscpp.so
    scons: done cleaning targets.
    
    user@linuxbox:~/project1$ scons -j4 --progress
    scons: Reading SConscript files ...
    scons: done reading SConscript files.
    scons: Building targets ...
    [14%] Compiling (shared): src/ExpressRuntimeException.os
    [51%] Compiling (shared): src/Application.os
    [59%] Compiling (shared): src/Callback.os
    [66%] Compiling (shared): src/Response.os
    [74%] Compiling (shared): src/Router.os
    [81%] Compiling (shared): src/Route.os
    [88%] Compiling (shared): src/Regex.os
    [96%] Compiling (shared): src/tools.os
    [100%] Linking   (shared): libexpresscpp.so
    scons: done building targets.
    


2 commentaires

C'est super. La prochaine étape consisterait à enregistrer la durée de construction par cible, car toutes les cibles ne sont pas créées égales. Et aussi les cibles supprimées risquent des choses.


Seriez-vous prêt à l'ajouter aux Scons-contribu? bitbucket.org/scons/scons-contrib



2
votes

J'ai beaucoup aimé la réponse de RpgilePie et j'ai joué avec elle pour notre progiciel comportant ~ 4500 nœuds. J'ai fait un peu de peaufie et j'ai pensé que je l'affaiterais au cas où cela aiderait à quiconque. Les principales différences sont les suivantes:

1.) J'ai ajouté une commande à exécuter à la fin du travail pour écrire le nombre total de nœuds dans un fichier basé sur Ce message . Cela enregistre d'avoir à toucher continuellement le système de fichiers dans la fonction de progression. P>

2.) En raison de 1.) Il met à jour le fichier chaque fois que Scons est exécuté (non seulement lorsqu'il détecte le nombre de nœuds dépassés le maximum précédent). Ceci est utile si vous travaillez sur une seule partie de l'arborescence (c'est-à-dire moins de nœuds) et vous reconstruisons constamment cette partie. P>

3.) Je lui ai placé le retour du chariot avant la mise à jour de l'écran afin qu'elle puisse l'écrire directement à partir de la fonction de progression par opposition à la définition d'une variable pour plus tard. Cela a l'avantage supplémentaire de montrer le compteur à la mise à jour alors qu'elle scanne à travers une arborescence principalement construite au début. P>

comme une note latérale, j'ai défini l'intervalle de mise à jour à seulement 1 ici. La raison en est que j'ai remarqué parfois que le nombre de nœuds associés à une seule commande de construction était inférieur à l'intervalle, ce qui lui entraîne de ne pas imprimer le compteur pour cette ligne. Avec la modification ci-dessus sur la manière dont le fichier compteur est écrit, je n'ai vu aucun ralentissement notable en raison de cela. Ymmv. P>

i Mettez ce qui suit à la fin de mon fichier de sconstructeur: p> xxx pré>

Sortie est: p> xxx Pré>

Pour la complétude, voici mes définitions COMSTRSSTR: P>

env.Replace(  CCCOMSTR        = "Compiling  [$SOURCE]",
              CXXCOMSTR       = "Compiling  [$SOURCE]",
              FORTRANPPCOMSTR = "Compiling  [$SOURCE]",
              FORTRANCOMSTR   = "Compiling  [$SOURCE]",
              SHCCCOMSTR      = "Compiling  [$SOURCE]",
              SHCXXCOMSTR     = "Compiling  [$SOURCE]",
              LINKCOMSTR      = "Linking    [$TARGET]",
              SHLINKCOMSTR    = "Linking    [$TARGET]",
              INSTALLSTR      = "Installing [$TARGET]",
              ARCOMSTR        = "Archiving  [$TARGET]",
              RANLIBCOMSTR    = "Ranlib     [$TARGET]")


1 commentaires

Seriez-vous prêt à l'ajouter aux Scons-contribu? bitbucket.org/scons/scons-contrib