OSDN Git Service

Add Fariborz to my last change.
[pf3gnuchains/gcc-fork.git] / gcc / ada / mlib-tgt-irix.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT COMPILER COMPONENTS                         --
4 --                                                                          --
5 --                             M L I B . T G T                              --
6 --                              (IRIX Version)                              --
7 --                                                                          --
8 --                                 B o d y                                  --
9 --                                                                          --
10 --           Copyright (C) 2003-2004, Ada Core Technologies, Inc.           --
11 --                                                                          --
12 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
13 -- terms of the  GNU General Public License as published  by the Free Soft- --
14 -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
15 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
16 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
17 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
18 -- for  more details.  You should have  received  a copy of the GNU General --
19 -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
20 -- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
21 -- MA 02111-1307, USA.                                                      --
22 --                                                                          --
23 -- GNAT was originally developed  by the GNAT team at  New York University. --
24 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
25 --                                                                          --
26 ------------------------------------------------------------------------------
27
28 --  This package provides a set of target dependent routines to build
29 --  static, dynamic and shared libraries.
30
31 --  This is the IRIX version of the body.
32
33 with MLib.Fil;
34 with MLib.Utl;
35 with Namet;  use Namet;
36 with Opt;
37 with Output; use Output;
38 with Prj.Com;
39 with System;
40
41 package body MLib.Tgt is
42
43    No_Arguments        : aliased Argument_List         := (1 .. 0 => null);
44    Empty_Argument_List : constant Argument_List_Access := No_Arguments'Access;
45
46    Wl_Init_String : aliased String         := "-Wl,-init";
47    Wl_Init        : constant String_Access := Wl_Init_String'Access;
48    Wl_Fini_String : aliased String         := "-Wl,-fini";
49    Wl_Fini        : constant String_Access := Wl_Fini_String'Access;
50
51    Init_Fini_List :  constant Argument_List_Access :=
52                        new Argument_List'(1 => Wl_Init,
53                                           2 => null,
54                                           3 => Wl_Fini,
55                                           4 => null);
56    --  Used to put switches for automatic elaboration/finalization
57
58    ---------------------
59    -- Archive_Builder --
60    ---------------------
61
62    function Archive_Builder return String is
63    begin
64       return "ar";
65    end Archive_Builder;
66
67    -----------------------------
68    -- Archive_Builder_Options --
69    -----------------------------
70
71    function Archive_Builder_Options return String_List_Access is
72    begin
73       return new String_List'(1 => new String'("cr"));
74    end Archive_Builder_Options;
75
76    -----------------
77    -- Archive_Ext --
78    -----------------
79
80    function Archive_Ext return String is
81    begin
82       return "a";
83    end Archive_Ext;
84
85    ---------------------
86    -- Archive_Indexer --
87    ---------------------
88
89    function Archive_Indexer return String is
90    begin
91       return "ranlib";
92    end Archive_Indexer;
93
94    ---------------------------
95    -- Build_Dynamic_Library --
96    ---------------------------
97
98    procedure Build_Dynamic_Library
99      (Ofiles       : Argument_List;
100       Foreign      : Argument_List;
101       Afiles       : Argument_List;
102       Options      : Argument_List;
103       Interfaces   : Argument_List;
104       Lib_Filename : String;
105       Lib_Dir      : String;
106       Symbol_Data  : Symbol_Record;
107       Driver_Name  : Name_Id := No_Name;
108       Lib_Version  : String  := "";
109       Auto_Init    : Boolean := False)
110    is
111       pragma Unreferenced (Foreign);
112       pragma Unreferenced (Afiles);
113       pragma Unreferenced (Interfaces);
114       pragma Unreferenced (Symbol_Data);
115
116       Lib_File : constant String :=
117                    Lib_Dir & Directory_Separator & "lib" &
118                    MLib.Fil.Ext_To (Lib_Filename, DLL_Ext);
119
120       Version_Arg          : String_Access;
121       Symbolic_Link_Needed : Boolean := False;
122
123       Init_Fini : Argument_List_Access := Empty_Argument_List;
124
125    begin
126       if Opt.Verbose_Mode then
127          Write_Str ("building relocatable shared library ");
128          Write_Line (Lib_File);
129       end if;
130
131       --  If specified, add automatic elaboration/finalization
132
133       if Auto_Init then
134          Init_Fini := Init_Fini_List;
135          Init_Fini (2) := new String'("-Wl," & Lib_Filename & "init");
136          Init_Fini (4) := new String'("-Wl," & Lib_Filename & "final");
137       end if;
138
139       if Lib_Version = "" then
140          MLib.Utl.Gcc
141            (Output_File => Lib_File,
142             Objects     => Ofiles,
143             Options     => Options & Init_Fini.all,
144             Driver_Name => Driver_Name);
145
146       else
147          Version_Arg := new String'("-Wl,-soname," & Lib_Version);
148
149          if Is_Absolute_Path (Lib_Version) then
150             MLib.Utl.Gcc
151               (Output_File => Lib_Version,
152                Objects     => Ofiles,
153                Options     => Options & Version_Arg & Init_Fini.all,
154                Driver_Name => Driver_Name);
155             Symbolic_Link_Needed := Lib_Version /= Lib_File;
156
157          else
158             MLib.Utl.Gcc
159               (Output_File => Lib_Dir & Directory_Separator & Lib_Version,
160                Objects     => Ofiles,
161                Options     => Options & Version_Arg & Init_Fini.all,
162                Driver_Name => Driver_Name);
163             Symbolic_Link_Needed :=
164               Lib_Dir & Directory_Separator & Lib_Version /= Lib_File;
165          end if;
166
167          if Symbolic_Link_Needed then
168             declare
169                Success : Boolean;
170                Oldpath : String (1 .. Lib_Version'Length + 1);
171                Newpath : String (1 .. Lib_File'Length + 1);
172
173                Result : Integer;
174                pragma Unreferenced (Result);
175
176                function Symlink
177                  (Oldpath : System.Address;
178                   Newpath : System.Address)
179                   return    Integer;
180                pragma Import (C, Symlink, "__gnat_symlink");
181
182             begin
183                Oldpath (1 .. Lib_Version'Length) := Lib_Version;
184                Oldpath (Oldpath'Last)            := ASCII.NUL;
185                Newpath (1 .. Lib_File'Length)    := Lib_File;
186                Newpath (Newpath'Last)            := ASCII.NUL;
187
188                Delete_File (Lib_File, Success);
189
190                Result := Symlink (Oldpath'Address, Newpath'Address);
191             end;
192          end if;
193       end if;
194    end Build_Dynamic_Library;
195
196    -------------
197    -- DLL_Ext --
198    -------------
199
200    function DLL_Ext return String is
201    begin
202       return "so";
203    end DLL_Ext;
204
205    --------------------
206    -- Dynamic_Option --
207    --------------------
208
209    function Dynamic_Option return String is
210    begin
211       return "-shared";
212    end Dynamic_Option;
213
214    -------------------
215    -- Is_Object_Ext --
216    -------------------
217
218    function Is_Object_Ext (Ext : String) return Boolean is
219    begin
220       return Ext = ".o";
221    end Is_Object_Ext;
222
223    --------------
224    -- Is_C_Ext --
225    --------------
226
227    function Is_C_Ext (Ext : String) return Boolean is
228    begin
229       return Ext = ".c";
230    end Is_C_Ext;
231
232    --------------------
233    -- Is_Archive_Ext --
234    --------------------
235
236    function Is_Archive_Ext (Ext : String) return Boolean is
237    begin
238       return Ext = ".a" or else Ext = ".so";
239    end Is_Archive_Ext;
240
241    -------------
242    -- Libgnat --
243    -------------
244
245    function Libgnat return String is
246    begin
247       return "libgnat.a";
248    end Libgnat;
249
250    ------------------------
251    -- Library_Exists_For --
252    ------------------------
253
254    function Library_Exists_For (Project : Project_Id) return Boolean is
255    begin
256       if not Projects.Table (Project).Library then
257          Prj.Com.Fail ("INTERNAL ERROR: Library_Exists_For called " &
258                        "for non library project");
259          return False;
260
261       else
262          declare
263             Lib_Dir : constant String :=
264               Get_Name_String (Projects.Table (Project).Library_Dir);
265             Lib_Name : constant String :=
266               Get_Name_String (Projects.Table (Project).Library_Name);
267
268          begin
269             if Projects.Table (Project).Library_Kind = Static then
270                return Is_Regular_File
271                  (Lib_Dir & Directory_Separator & "lib" &
272                   Fil.Ext_To (Lib_Name, Archive_Ext));
273
274             else
275                return Is_Regular_File
276                  (Lib_Dir & Directory_Separator & "lib" &
277                   Fil.Ext_To (Lib_Name, DLL_Ext));
278             end if;
279          end;
280       end if;
281    end Library_Exists_For;
282
283    ---------------------------
284    -- Library_File_Name_For --
285    ---------------------------
286
287    function Library_File_Name_For (Project : Project_Id) return Name_Id is
288    begin
289       if not Projects.Table (Project).Library then
290          Prj.Com.Fail ("INTERNAL ERROR: Library_File_Name_For called " &
291                        "for non library project");
292          return No_Name;
293
294       else
295          declare
296             Lib_Name : constant String :=
297               Get_Name_String (Projects.Table (Project).Library_Name);
298
299          begin
300             Name_Len := 3;
301             Name_Buffer (1 .. Name_Len) := "lib";
302
303             if Projects.Table (Project).Library_Kind = Static then
304                Add_Str_To_Name_Buffer (Fil.Ext_To (Lib_Name, Archive_Ext));
305
306             else
307                Add_Str_To_Name_Buffer (Fil.Ext_To (Lib_Name, DLL_Ext));
308             end if;
309
310             return Name_Find;
311          end;
312       end if;
313    end Library_File_Name_For;
314
315    ----------------
316    -- Object_Ext --
317    ----------------
318
319    function Object_Ext return String is
320    begin
321       return "o";
322    end Object_Ext;
323
324    ----------------
325    -- PIC_Option --
326    ----------------
327
328    function PIC_Option return String is
329    begin
330       return "-fPIC";
331    end PIC_Option;
332
333    -----------------------------------------------
334    -- Standalone_Library_Auto_Init_Is_Supported --
335    -----------------------------------------------
336
337    function Standalone_Library_Auto_Init_Is_Supported return Boolean is
338    begin
339       return True;
340    end Standalone_Library_Auto_Init_Is_Supported;
341
342    ---------------------------
343    -- Support_For_Libraries --
344    ---------------------------
345
346    function Support_For_Libraries return Library_Support is
347    begin
348       return Full;
349    end Support_For_Libraries;
350
351 end MLib.Tgt;