{"id":77,"date":"2009-06-22T18:00:14","date_gmt":"2009-06-22T16:00:14","guid":{"rendered":"http:\/\/46.105.150.90\/tstnunix\/?p=77"},"modified":"2009-06-22T18:00:14","modified_gmt":"2009-06-22T16:00:14","slug":"compiler-des-projets-ada-sous-linux","status":"publish","type":"post","link":"https:\/\/nunix.fr\/?p=77","title":{"rendered":"Compiler des projets ADA sous linux"},"content":{"rendered":"<h1>1. Installation du compilateur<\/h1>\n<p>Le compilateur de r\u00e9f\u00e9rence de l&rsquo;Ada est <a href=\"http:\/\/libre.adacore.com\/libre\/\" title=\"GNAT - Adacore\">GNAT<\/a> (GNU Ada Translator).\u00a0<\/p>\n<p>Ce compilateur sous licence GPL est \u00e9dit\u00e9 par la soci\u00e9t\u00e9 Adacore qui publie \u00e9galement une version \u00ab\u00a0<a href=\"http:\/\/www.adacore.com\/home\/\" title=\"GNAT pro\">pro<\/a>\u00a0\u00bb et payante dont nous ne parlerons pas ici.<\/p>\n<p>L&rsquo;installation se fat des plus facilement en installant le paquet (qui est d&rsquo;ailleurs disponible dans les d\u00e9p\u00f4ts sous ubuntu) :\u00a0<\/p>\n<pre>apt-get install gnat <\/pre>\n<h1>2. Documentation<\/h1>\n<p>Tout d&rsquo;abord les liens indispensables :\u00a0<\/p>\n<p><a href=\"http:\/\/www.iste.uni-stuttgart.de\/ps\/ada-doc\/gnat\/gnat_ug.html\" title=\"GNAT user's guide\">GNAT user&rsquo;s guide<\/a><\/p>\n<p> <!--more--> <\/p>\n<p><a href=\"http:\/\/gcc.gnu.org\/onlinedocs\/gcc-3.2.3\/gnat_rm\/\" title=\"GNAT reference manual\">GNAT reference manual<\/a><\/p>\n<p>Ainsi qu&rsquo;un site contenant un <a href=\"http:\/\/www.les-ziboux.rasama.org\/guide-utilisation-gnat.html\" title=\"abr\u00e9g\u00e9 du guide d'utilisation de GNAT\">abr\u00e9g\u00e9 du guide d&rsquo;utilisation de GNAT<\/a> (en fran\u00e7ais).<\/p>\n<h1>3. Fichier de test<\/h1>\n<p>Pour chacun des exemples, nous allons utiliser un classique \u00ab\u00a0hello world\u00a0\u00bb : hello_world.adb<\/p>\n<p class=\"info\">Petit rappel : Les fichiers .ads correspondent aux .h du langage C, tandis que les .adb correspondent aux .c (en une vision grossi\u00e8re&#8230;)<\/p>\n<p>Voici donc le code source utilis\u00e9 :\u00a0<\/p>\n<pre>with Ada.Text_IO; -- Biblioth\u00e8que<br \/>\u00a0<br \/>procedure hello_world is -- Annonce de la proc\u00e9dure \"Hello\"<br \/>begin -- D\u00e9but de la proc\u00e9dure \"Hello\"<br \/>\u00a0   Ada.Text_IO.Put_Line(\"Hello, world!\"); -- Code qui imprime \"Hello, world!\" \u00e0 l'\u00e9cran<br \/>end hello_world; -- Fin de la proc\u00e9dure \"Hello\"<br \/><\/pre>\n<h1>4. Compilation<\/h1>\n<h2>4.1 Compilation simple<\/h2>\n<p>La compilation simple (cad d&rsquo;un fichier seul, sans hi\u00e9rarchie de projet) ne requiert rien de plus que notre fichier .adb :\u00a0<\/p>\n<pre>gnatmake -a hello_world.adb<\/pre>\n<p>Comme on peut le voir dans le guide abr\u00e9g\u00e9 de GNAT, l&rsquo;option -a nous permet de tout compiler en effectuant totalement l&rsquo;\u00e9tape de link.<\/p>\n<p>Nous obtenons alors (si tout vas bien) 3 fichiers dans le m\u00eame r\u00e9pertoire :\u00a0<\/p>\n<ul>\n<li>hello_world.ali (qui contient entre autre la liste des paquetages utilis\u00e9s)<\/li>\n<\/ul>\n<ul>\n<li>hello_world.o (fichier objet qui contient la liste des symboles)<\/li>\n<\/ul>\n<ul>\n<li>hello_world (fichier ex\u00e9cutable ELF)<\/li>\n<\/ul>\n<p>Cependant il appara\u00eet assez vite le probl\u00e8me de hi\u00e9rarchiser les projets ou tout simplement de s\u00e9parer les fichiers g\u00e9n\u00e9r\u00e9s lors de la compilation. La prochaine \u00e9tape nous explique cela.<\/p>\n<h2>4.2 Compilation de projets<\/h2>\n<p>La compilation d&rsquo;un projet devient vite un casse t\u00eate en ligne de commande. Le plus simple est alors de mettre en place un fichier de projet qui va contenir toutes les informations n\u00e9cessaires \u00e0 la compilation du projet complet. Ces fichiers de projet portent l&rsquo;extension gpr (Gnat Project). <\/p>\n<h3>4.2.1 Fichier gpr simple <\/h3>\n<p>Voici un fichier .gpr simple\u00a0 :\u00a0<\/p>\n<pre>project hello_world is<br \/><br \/>\u00a0\u00a0 for Languages use (\"Ada\");<br \/>\u00a0\u00a0 for Object_Dir use \"obj\";<br \/>\u00a0\u00a0 for Source_Dirs use (\"src\");<br \/>\u00a0\u00a0 for Exec_Dir use \"bin\";<br \/>\u00a0\u00a0 for Main use (\"hello_world.adb\");<br \/><br \/>\u00a0\u00a0 package Linker is<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0 for Default_Switches (\"ada\")\u00a0 use (<br \/>\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \"-g\"<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0 );<br \/>\u00a0\u00a0 end Linker;<br \/><br \/>\u00a0\u00a0 package Ide is<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0 for Debugger_Command use \"gdb\";<br \/>\u00a0\u00a0 end Ide;<br \/><br \/>end hello_world;<br \/><\/pre>\n<p>Ce qu&rsquo;il faut retenir : <\/p>\n<ul>\n<li>Les premi\u00e8res lignes permettent de d\u00e9finir les r\u00e9pertoires de destination des fichiers g\u00e9n\u00e9r\u00e9s par la compilation.<\/li>\n<\/ul>\n<ul>\n<li>La seconde partie permet de donner les options de compilation ainsi que les options de link. Nous verrons cela plus loin. <\/li>\n<\/ul>\n<p>Ici nous avons donc regroup\u00e9 les fichiers sources dans le r\u00e9pertoire src, les fichiers objets dans le r\u00e9pertoire obj&#8230; Les langages accept\u00e9s sont Ada et assembleur (s) et le fichier contenant le main est hello_world.adb<\/p>\n<h3>4.2.2 Inclusion de sous projets<\/h3>\n<p>Il est parfois utile de d\u00e9velopper des sous-projets s\u00e9par\u00e9ment afin de les tester plus facilement. Il est alors possible d&rsquo;inclure le fichier gpr de ces sous-projets directement dans le projet principal pour tout compiler en une seule fois.<\/p>\n<p>Il suffit d&rsquo;ajouter la ligne suivante en ent\u00eate du fichier gpr principal :\u00a0<\/p>\n<\/p>\n<pre style=\"margin-bottom: 0cm\">-- include the framework project <br \/>with \"framework\/framework.gpr\"; <br \/>-- include here your others subprojects<\/pre>\n<h3>4.2.3 Directives de compilation et de link<\/h3>\n<p>C&rsquo;est ici que notre fichier gpr devient particuli\u00e8rement intr\u00e9ressant. En effet, nous allons maintenant donner toutes les directives de compilation et de link de notre projet (les sous projets inclus peuvent donc \u00eatre compil\u00e9s ou link\u00e9s avec des options diff\u00e9rentes). Par exemple :\u00a0<\/p>\n<pre>package Linker is<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0 for Default_Switches (\"ada\")\u00a0 use (<br \/>\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"-g\", \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 --debug option<br \/>\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"-T\/[\u2026]\/framework\/lib\/linker_script.ld\", \u00a0\u00a0\u00a0 --extern linkerscript include<br \/>\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"--section-start .zconf=0x40040000\",\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 --ld option<br \/>\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"-Lframework\/lib\", \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 --extern library dir include<br \/>\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"-lposix\" \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 --extern library<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0 );<br \/>end Linker; <br \/><\/pre>\n<p>Dans notre exemple il n&rsquo;y a qu&rsquo;une seule librairie externe incluse, mais il est tr\u00e8s ais\u00e9 d&rsquo;ajouter d&rsquo;autres r\u00e9pertoires ou d&rsquo;autres librairies. On peut facilement imaginer la longueur de la ligne de commande si nous n&rsquo;avions pas utilis\u00e9 de fichier de projet&#8230;\u00e7a fait peur ! <img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-76\" src=\"http:\/\/46.105.150.90\/tstnunix\/wp-content\/uploads\/2009\/06\/smiley-surprised.gif\" border=\"0\" alt=\"Surprised\" title=\"Surprised\" width=\"18\" height=\"18\" \/><\/p>\n<h3>4.2.4 Compilation du projet<\/h3>\n<p>La compilation de notre projet se r\u00e9sume maintenant \u00e0 une simple commande : <\/p>\n<pre>gnatmake -P hello_world.gpr<\/pre>\n<p class=\"attention\">Attention, il ne faut pas oublier l&rsquo;option -P qui signale au compilateur qu&rsquo;il doit travailler avec un projet. <\/p>\n<p>Apr\u00e8s ex\u00e9cution de cette commande, nous obtenons bien nos fichier .ali et .o proprement rang\u00e9s dans le r\u00e9pertoire obj, ainsi que l&rsquo;ex\u00e9cutable dans le fichier bin. Il ne reste plus qu&rsquo;\u00e0 tester notre programme : <\/p>\n<pre>.\/hello_world <\/pre>\n<p>qui nous donne <\/p>\n<pre>Hello, world!\u00a0 <\/pre>\n<p>Et pour terminer en beaut\u00e9, un makefile qui nous facilite encore plus le travail :\u00a0<\/p>\n<pre>clean :<br \/>\u00a0\u00a0\u00a0 @echo suppression des fichiers obj et bin<br \/>\u00a0\u00a0\u00a0 gnatclean -P hello_world.gpr<br \/><br \/>all :<br \/>\u00a0\u00a0\u00a0 @echo compilation du projet<br \/>\u00a0\u00a0\u00a0 gnatmake -P hello_world.gpr<\/pre>\n<p class=\"info\">La commande gnatclean associ\u00e9e au fichier gpr permet de supprimer tous les fichiers g\u00e9n\u00e9r\u00e9s lors de la compilation du projet. Ainsi il n&rsquo;est pas n\u00e9cessaire de faire plusieurs rm dans le makefile. L\u00e0 encore il ne faut pas oublier l&rsquo;option -P qui pr\u00e9cise \u00e0 gnat qu&rsquo;il traite un projet. <\/p>\n<p>Cet article est termin\u00e9, j&rsquo;esp\u00e8re qu&rsquo;il vous aura \u00e9vit\u00e9 bien des compilations fastidieuses ! <img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-13\" src=\"http:\/\/46.105.150.90\/tstnunix\/wp-content\/uploads\/2009\/04\/smiley-wink.gif\" border=\"0\" alt=\"Wink\" title=\"Wink\" width=\"18\" height=\"18\" \/><\/p>\n<p>{jcomments on}\u00a0<\/p>\n","protected":false},"excerpt":{"rendered":"<p>1. Installation du compilateur Le compilateur de r\u00e9f\u00e9rence de l&rsquo;Ada est GNAT (GNU Ada Translator).\u00a0 Ce compilateur sous licence GPL est \u00e9dit\u00e9 par la soci\u00e9t\u00e9 Adacore qui publie \u00e9galement une version \u00ab\u00a0pro\u00a0\u00bb et payante dont nous ne parlerons pas ici. L&rsquo;installation se fat des plus facilement en installant le paquet (qui est d&rsquo;ailleurs disponible dans &hellip; <a href=\"https:\/\/nunix.fr\/?p=77\" class=\"more-link\">Continuer la lecture<span class=\"screen-reader-text\"> de &laquo;&nbsp;Compiler des projets ADA sous linux&nbsp;&raquo;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":76,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20],"tags":[],"class_list":["post-77","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ada"],"_links":{"self":[{"href":"https:\/\/nunix.fr\/index.php?rest_route=\/wp\/v2\/posts\/77","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nunix.fr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nunix.fr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nunix.fr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nunix.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=77"}],"version-history":[{"count":0,"href":"https:\/\/nunix.fr\/index.php?rest_route=\/wp\/v2\/posts\/77\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nunix.fr\/index.php?rest_route=\/wp\/v2\/media\/76"}],"wp:attachment":[{"href":"https:\/\/nunix.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=77"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nunix.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=77"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nunix.fr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=77"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}