Re: GprBuild et GNATColl.Memory

David SAUVAGE - AdaLabs Ltd via Ada-france <[email protected]> Mon, 5 Apr 2021 14:39:28 +0400
Newsgroups gmane.comp.lang.ada.france
Message-ID <[email protected]>

On 4/5/21 13:49, Stéphane Rivière via Ada-france wrote:
> Bonjour à toutes et tous,
> 
> 
> 
> * Contexte
> 
> Pour un projet en libre GPL v3 (gestion de cluster de serveurs avec HA -
> en multi site et réseau privé, ça nous a déjà bien servi avec l'incendie
> de SBG2 d'OVH d'ailleurs), on a monté une petite biblio généraliste pour
> des progs en mode texte.
> 
> Comme c'est aussi pour des services qui vont tourner 365/24, j'ai voulu
> utiliser le package gnatcoll.memory pour observer la conso des objets
> créés :
> 
> - créer dans le chemin des sources un s-memory.adb selon un modèle
> - rajouter with "gnatcoll" en haut du projet GprBuild
> - utiliser avec un with gnatcoll.memory
> - appeler les quelques fonctions du package pour 'mesurer'.
> 
> C'est simple à utiliser et cerise sur le gâteau : /on peut laisser la
> manip dans la version PROD/ car c'est activable par un Boolean quand on
> le souhaite sans consommation de ressource quand c'est inactif.
> 
> C'est donc un bon complément de Valgrind pour partir à la recherche des
> octets perdus - quand on ne dispose par d'un full GNAT Pro...
> 
> Et ces mesures peuvent être activées au moment d'une exception non
> récupérable et écrite dans un fichier d'erreur, ce que fait, entre
> autres, cette petite biblio.
> 
> 
> 
> * Problème
> 
> J'ai pas tout compris sur le build.
> 
> D'après la doc GNATColl AdaCore, il suffit de :
> 
> - poser un with "gnatcoll" en haut du projet GprBuild,
> - créer dans le chemin des sources un s-memory.adb selon un modèle
> 
> Sauf que, sur une install fraîche de GNAT CE 2020, après un build,
> toutes les valeurs ci-dessus sont à 0. Dans le répertoire de build,
> s-memory.o n'est pas créé et on en déduit que le with "gnatcoll" a
> incité GPRBuild à utiliser la lib précompilée...
> 
> ... donc le s-memory.adb n'a même pas été considéré puisque toutes les
> dépendances étaient satisfaites avec la lib GNATColl.
> 
> J'ai donc
> 
> - Viré le  with "gnatcoll"  du projet;
> 
> - Ajouté les sources de GNATColl
> "/home/sr/opt/gnat-2020/include/gnatcoll" dans les chemins de sources
> 
> - Ajouté le C avec for Languages use ("Ada", "C"); (y'a du C dans GNATColl)
> 
> Et là les dépendances de GNATColl sont compilées (voir ci-dessous les
> fichiers gnatcoll concernés, plus de C que de Ada en fait), avec le
> s-memory.adb personnalisé et je retrouve mes stats de mémoire...
> 
> --------------------------------------------------
> gprbuild -d -P/home/sr/Seafile/Sowebio/informatique/dev/ada/prj/v20a/v20.gpr
> Compile
>    [Ada]          test.adb
>    [C]            link_max.c
>    [C]            set_std_prefix.c
>    [C]            executable_path.c
>    [C]            objlist_file.c
>    [C]            update_path.c
>    [C]            run_path_option.c
>    [C]            gnatcoll_support.c
>    [C]            separate_run_path_option.c
>    [C]            getRSS.c
>    [C]            terminals.c
>    [Ada]          gnatcoll.ads
>    [Ada]          gnatcoll-memory.adb
>    [Ada]          v20.adb
>    [Ada]          v20-cfg.adb
>    [Ada]          v20-log.adb
>    [Ada]          v20-prg.adb
>    [Ada]          v20-tio.adb
>    [Ada]          v20-vst.adb
>    [Ada]          s-memory.adb
> Bind
>    [gprbind]      test.bexch
>    [Ada]          test.ali
> Link
>    [archive]      libv20.a
>    [index]        libv20.a
>    [link]         test.adb
> [2021-03-31 20:01:53] process terminated successfully, elapsed time: 02.24s
> --------------------------------------------------
> 
> 
> Ce qui est gênant en l'état c'est que j'ai une chaîne en dur dans mon
> projet dépendante de mon organisation de chemins... ce n'est pas propre
> je trouve...
> 
>    for Source_Dirs use
> ("src-tests","src/**","/home/sr/opt/gnat-2020/include/gnatcoll");
> 
> 
> Je souhaiterais supprimer cette chaîne pour quelque chose de plus
> "générique" (genre tous les include de l'install courante de GNAT)
> 
> Comme fait actuellement le  with "gnatcoll"  qui va chercher ses
> références (si j'ai bien compris) dans /home/sr/opt/gnat-2020/share/gpr
> (un répertoire qui contient tous les gpr des libs installées)
> 
> 
> 
> - Était-ce la bonne manière de faire (j'en doute, vu le niveau
> d'abstraction de GprBuild) ?
> 
> - Le with "gnatcoll"; ne fait pas prendre en compte la recompilation de
> GNATColl via le .gpr de GNATColl ? J'ai oublié quoi pour le forcer à
> recompiler ? Pour lui indiquer que je souhaite recompiler s-memory.adb
> et donc toute la chaîne de dépendances associées ?
> 
> 
> Le projet est là : https://stef.genesix.org/pub/ada/v20-0.3.zip avec le
> .gpr, la doc, faut juste ajuster le chemin des sources
> "/home/sr/opt/gnat-2020/include/gnatcoll"...
> 
> 
> 
> Idées bienvenues...
> 
> Merci d'avance :)
> 
> 
> 
> 
> PS Actuellement, mes chemins GNAT sont ainsi : gnat ls -v
> 
> --------------------------------------------------
> GNATLS Community 2020 (20200429-93)
> Copyright (C) 1997-2020, Free Software Foundation, Inc.
> 
> Source Search Path:
>    <Current_Directory>
> 
> /home/sr/opt/gnat-2020/lib/gcc/x86_64-pc-linux-gnu/9.3.1/rts-native/adainclude
> 
> 
> Object Search Path:
>    <Current_Directory>
> 
> /home/sr/opt/gnat-2020/lib/gcc/x86_64-pc-linux-gnu/9.3.1/rts-native/adalib
> 
> 
> Project Search Path:
>    <Current_Directory>
>    /home/sr/opt/gnat-2020/lib
>    /home/sr/opt/gnat-2020/x86_64-pc-linux-gnu/lib/gnat
>    /home/sr/opt/gnat-2020/x86_64-pc-linux-gnu/share/gpr
>    /home/sr/opt/gnat-2020/share/gpr
>    /home/sr/opt/gnat-2020/lib/gnat
> --------------------------------------------------
> 
> 
> 
> 


Salut,

le composant gnatcoll est considéré comme externe à ton projet, il n'est pas recompilable,
cf. l'attribut Externally_Built du composant gnatcoll (share/gpr/gnatcoll.gpr) qui est à True.

De notre côté, on gère ce genre de besoin par le déploiement de runtime Ada personnalisées.
Ici, il s'agirait de packager une runtime Ada qui contienne votre version personnalisée de s-memory.adb
	- tout les autres composants GPR du projet ayant une dépendance sur s-memory.adb devront aussi être repackagé pour prendre en compte cette nouvelle runtime. Cela est assez lourd à
gérer.
	- au build l'option '--RTS=custom' devra être utilisé (le runtime étant ici /lib/gcc/x86_64-pc-linux-gnu/9.3.1/rts-custom)

Mais dans certain cas, créer un nouveau composant (i.e gnatcoll_custom avec le gestion personnalisé du s-memory.adb au build) peut convenir,
cela dépend aussi;
	- du mode du bind de l'application principal et des autres composants GPR avec la rutime Ada ('-shared' ou '-static')
	- du mode library_kind '-static' ou '-relocatable' des composants GPR
	- de l'acceptabilité ou pas que l'application utilise des implémentations runtime différentes

All the best !


-- 
David SAUVAGE

Software Agile Architect, Director
AdaLabs Ltd - Mauritius
https://adalabs.com
+230 542 818 32
BRN C10097052
_______________________________________________
Ada-france mailing list
[email protected]
https://mail.ada-france.org/cgi-bin/mailman/listinfo/ada-france