home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gnat-2.06-src.tgz / tar.out / fsf / gnat / ada / gnatbind.adb < prev    next >
Text File  |  1996-09-28  |  6KB  |  198 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                             G N A T B I N D                              --
  6. --                                                                          --
  7. --                                 B o d y                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.25 $                             --
  10. --                                                                          --
  11. --        Copyright (c) 1992,1993,1994,1995 NYU, All Rights Reserved        --
  12. --                                                                          --
  13. -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  14. -- terms of the  GNU General Public License as published  by the Free Soft- --
  15. -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
  16. -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  17. -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  18. -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
  19. -- for  more details.  You should have  received  a copy of the GNU General --
  20. -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
  21. -- to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. --
  22. --                                                                          --
  23. ------------------------------------------------------------------------------
  24.  
  25. with ALI;      use ALI;
  26. with Bcheck;   use Bcheck;
  27. with Binde;    use Binde;
  28. with Binderr;  use Binderr;
  29. with Bindgen;  use Bindgen;
  30. with Bindusg;
  31. with Butil;    use Butil;
  32. with Gnatvsn;  use Gnatvsn;
  33. with Namet;    use Namet;
  34. with Opt;      use Opt;
  35. with Osint;    use Osint;
  36. with Output;   use Output;
  37. with Types;    use Types;
  38.  
  39. with System.Standard_Library;
  40. --  This can eventually be removed when the new binder is in place ???
  41.  
  42. procedure Gnatbind is
  43.  
  44.    Total_Errors : Nat := 0;
  45.    --  Counts total errors in all files
  46.  
  47.    Total_Warnings : Nat := 0;
  48.    --  Total warnings in all files
  49.  
  50.    Main_Lib_File : File_Name_Type;
  51.    --  Current main library file
  52.  
  53.    Std_Lib_File : File_Name_Type;
  54.    --  Standard library
  55.  
  56.    Text : Text_Buffer_Ptr;
  57.    Id   : ALI_Id;
  58.  
  59. begin
  60.    Osint.Initialize (Binder);
  61.  
  62.    if Verbose_Mode then
  63.       Write_Eol;
  64.       Write_Str ("NYU GNAT Binder Version ");
  65.       Write_Str (Gnat_Version_String);
  66.       Write_Str (" (C) NYU, 1992,1993,1994,1995 All Rights Reserved");
  67.       Write_Eol;
  68.    end if;
  69.  
  70.    --  Output usage information if no files
  71.  
  72.    if not More_Lib_Files then
  73.       Bindusg;
  74.       Exit_Program (E_Fatal);
  75.    end if;
  76.  
  77.    --  The block here is to catch the Unrecoverable_Error exception in the
  78.    --  case where we exceed the maximum number of permissible errors or some
  79.    --  other unrecoverable error occurs.
  80.  
  81.    begin
  82.       --  Carry out package initializations. These are initializations which
  83.       --  might logically be performed at elaboration time, but Namet at
  84.       --  least can't be done that way (because it is used in the Compiler),
  85.       --  and we decide to be consistent. Like elaboration, the order in
  86.       --  which these calls are made is in some cases important.
  87.  
  88.       Namet.Initialize;
  89.       Initialize_Binderr;
  90.       Initialize_ALI;
  91.  
  92.       if Verbose_Mode then
  93.          Write_Eol;
  94.       end if;
  95.  
  96.       --  Input ALI files
  97.  
  98.       while More_Lib_Files loop
  99.          Main_Lib_File := Next_Main_Lib_File;
  100.  
  101.          if Verbose_Mode then
  102.             if Check_Only then
  103.                Write_Str ("Checking: ");
  104.             else
  105.                Write_Str ("Binding: ");
  106.             end if;
  107.  
  108.             Write_Name (Main_Lib_File);
  109.             Write_Eol;
  110.          end if;
  111.  
  112.          Text := Read_Library_Info (No_File, True);
  113.          Id := Scan_ALI (Main_Lib_File, Text);
  114.       end loop;
  115.  
  116.       --  Add System.Standard_Library to list to ensure that these files are
  117.       --  included in the bind, even if not directly referenced from Ada code
  118.  
  119.       Name_Buffer (1 .. 12) := "s-stalib.ali";
  120.       Name_Len := 12;
  121.       Std_Lib_File := Name_Find;
  122.       Text := Read_Library_Info (Std_Lib_File, True);
  123.       Id := Scan_ALI (Std_Lib_File, Text);
  124.  
  125.       --  Acquire all information in ALI files that have been read in
  126.  
  127.       for Index in ALIs.First .. ALIs.Last loop
  128.          Read_ALI (Index);
  129.       end loop;
  130.  
  131.       --  Build source file table from the ALI files we have read in
  132.  
  133.       Set_Source_Table;
  134.  
  135.       --  Check that main library file is a suitable main program
  136.  
  137.       if Bind_Main_Program
  138.         and then ALIs.Table (ALIs.First).Main_Program = None
  139.       then
  140.          Error_Msg_Name_1 := Main_Lib_File;
  141.          Error_Msg ("% does not contain a unit that can be a main program");
  142.       end if;
  143.  
  144.       --  Perform consistency checks
  145.  
  146.       Check_Versions;
  147.       Check_Consistency;
  148.  
  149.       --  Complete bind if no errors
  150.  
  151.       if Errors_Detected = 0 then
  152.          Find_Elab_Order;
  153.  
  154.          if Errors_Detected = 0 then
  155.             if Elab_Order_Output then
  156.                Write_Eol;
  157.                Write_Str ("ELABORATION ORDER");
  158.                Write_Eol;
  159.  
  160.                for I in Elab_Order.First .. Elab_Order.Last loop
  161.                   Write_Str ("   ");
  162.                   Write_Unit_Name (Unit.Table (Elab_Order.Table (I)).Uname);
  163.                   Write_Eol;
  164.                end loop;
  165.  
  166.                Write_Eol;
  167.             end if;
  168.  
  169.             if not Check_Only then
  170.                Gen_Output_File;
  171.             end if;
  172.          end if;
  173.       end if;
  174.  
  175.       Total_Errors := Total_Errors + Errors_Detected;
  176.       Total_Warnings := Total_Warnings + Warnings_Detected;
  177.  
  178.    exception
  179.       when Unrecoverable_Error =>
  180.          Total_Errors := Total_Errors + Errors_Detected;
  181.          Total_Warnings := Total_Warnings + Warnings_Detected;
  182.    end;
  183.  
  184.    --  All done. Set proper exit status.
  185.  
  186.    Finalize_Binderr;
  187.    Namet.Finalize;
  188.  
  189.    if Total_Errors > 0 then
  190.       Exit_Program (E_Errors);
  191.    elsif Total_Warnings > 0 then
  192.       Exit_Program (E_Warnings);
  193.    else
  194.       Exit_Program (E_Success);
  195.    end if;
  196.  
  197. end Gnatbind;
  198.