matreshka_league_21.0.0_0c8f4d47/tools/configure/configure-builder.adb

  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
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
------------------------------------------------------------------------------
--                                                                          --
--                            Matreshka Project                             --
--                                                                          --
--         Localization, Internationalization, Globalization for Ada        --
--                                                                          --
--                              Tools Component                             --
--                                                                          --
------------------------------------------------------------------------------
--                                                                          --
-- Copyright © 2011-2014, Vadim Godunko <vgodunko@gmail.com>                --
-- All rights reserved.                                                     --
--                                                                          --
-- Redistribution and use in source and binary forms, with or without       --
-- modification, are permitted provided that the following conditions       --
-- are met:                                                                 --
--                                                                          --
--  * Redistributions of source code must retain the above copyright        --
--    notice, this list of conditions and the following disclaimer.         --
--                                                                          --
--  * Redistributions in binary form must reproduce the above copyright     --
--    notice, this list of conditions and the following disclaimer in the   --
--    documentation and/or other materials provided with the distribution.  --
--                                                                          --
--  * Neither the name of the Vadim Godunko, IE nor the names of its        --
--    contributors may be used to endorse or promote products derived from  --
--    this software without specific prior written permission.              --
--                                                                          --
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS      --
-- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT        --
-- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR    --
-- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT     --
-- HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,   --
-- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED --
-- TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR   --
-- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF   --
-- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING     --
-- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS       --
-- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.             --
--                                                                          --
------------------------------------------------------------------------------
--  $Revision: 4873 $ $Date: 2014-09-11 13:14:42 +0400 (Чт, 11 сен 2014) $
------------------------------------------------------------------------------
with Ada.Directories;
with Ada.Text_IO;
with GNAT.Expect;
with GNAT.OS_Lib;

with Configure.Instantiate;
with Configure.Internals;

package body Configure.Builder is

   use GNAT.Expect;

   function To_String (Args : GNAT.OS_Lib.Argument_List) return String;
   --  Converts argument list into printable string.

   function Build
    (Report_Log : not null access procedure (Message : String);
     Directory  : String) return Boolean;
   --  Common code for both variants of procedure.

   -----------
   -- Build --
   -----------

   function Build
    (Report_Log : not null access procedure (Message : String);
     Directory  : String) return Boolean
   is
      Args   : constant GNAT.OS_Lib.Argument_List
        := (1 => new String'("-p"),
            2 => new String'("-P" & Directory & "/check.gpr"));
      Result : Boolean;

   begin
      --  Generate project file from template when necessary.

      if Ada.Directories.Exists (Directory & "check.gpr.in") then
         Configure.Instantiate (Directory & "check.gpr", True);
      end if;

      --  Run builder.

      Report_Log ("gnatmake" & To_String (Args));

      begin
         declare
            Status : aliased Integer;
            Output : constant String :=
              Get_Command_Output ("gnatmake", Args, "", Status'Access, True);

         begin
            Report_Log (Output);
            Result := Status = 0;
         end;

      exception
         when GNAT.Expect.Invalid_Process =>
            Result := False;
      end;

      --  Cleanup build directory.

      if Ada.Directories.Exists (Directory & "_build") then
         Ada.Directories.Delete_Tree (Directory & "_build");
      end if;

      --  Remove generated project file when necessary.

      if Ada.Directories.Exists (Directory & "check.gpr.in")
        and Ada.Directories.Exists (Directory & "check.gpr")
      then
         Ada.Directories.Delete_File (Directory & "check.gpr");
      end if;

      return Result;
   end Build;

   -----------
   -- Build --
   -----------

   function Build
    (Test      : Configure.Abstract_Tests.Abstract_Test'Class;
     Directory : String) return Boolean
   is

      procedure Report_Log (Message : String);
      --  Reports message using test's log stream.

      ----------------
      -- Report_Log --
      ----------------

      procedure Report_Log (Message : String) is
      begin
         Test.Report_Log (Message);
      end Report_Log;

   begin
      return Build (Report_Log'Access, Directory);
   end Build;

   -----------
   -- Build --
   -----------

   function Build (Directory : String) return Boolean is

      procedure Report_Log (Message : String);
      --  Reports message using global log stream.

      ----------------
      -- Report_Log --
      ----------------

      procedure Report_Log (Message : String) is
      begin
         Ada.Text_IO.Put_Line (Configure.Internals.Log_Output, Message);
         Ada.Text_IO.Flush (Configure.Internals.Log_Output);
      end Report_Log;

   begin
      return Build (Report_Log'Access, Directory);
   end Build;

   ---------------
   -- To_String --
   ---------------

   function To_String (Args : GNAT.OS_Lib.Argument_List) return String is
      Result : Unbounded_String;

   begin
      for Index in Args'Range loop
         Append (Result, ' ');
         Append (Result, Args (Index).all);
      end loop;

      return To_String (Result);
   end To_String;

end Configure.Builder;