OSDN Git Service

2004-06-25 Pascal Obry <obry@gnat.com>
[pf3gnuchains/gcc-fork.git] / gcc / ada / mlib-tgt-hpux.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT COMPILER COMPONENTS                         --
4 --                                                                          --
5 --                             M L I B . T G T                              --
6 --                             (HP-UX 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 --  libraries (static only on HP-UX).
30
31 --  This is the HP-UX 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    -- Archive_Builder --
59    ---------------------
60
61    function Archive_Builder return String is
62    begin
63       return "ar";
64    end Archive_Builder;
65
66    -----------------------------
67    -- Archive_Builder_Options --
68    -----------------------------
69
70    function Archive_Builder_Options return String_List_Access is
71    begin
72       return new String_List'(1 => new String'("cr"));
73    end Archive_Builder_Options;
74
75    -----------------
76    -- Archive_Ext --
77    -----------------
78
79    function Archive_Ext return String is
80    begin
81       return "a";
82    end Archive_Ext;
83
84    ---------------------
85    -- Archive_Indexer --
86    ---------------------
87
88    function Archive_Indexer return String is
89    begin
90       return "ranlib";
91    end Archive_Indexer;
92
93    ---------------------------
94    -- Build_Dynamic_Library --
95    ---------------------------
96
97    procedure Build_Dynamic_Library
98      (Ofiles       : Argument_List;
99       Foreign      : Argument_List;
100       Afiles       : Argument_List;
101       Options      : Argument_List;
102       Interfaces   : Argument_List;
103       Lib_Filename : String;
104       Lib_Dir      : String;
105       Symbol_Data  : Symbol_Record;
106       Driver_Name  : Name_Id := No_Name;
107       Lib_Version  : String  := "";
108       Auto_Init    : Boolean := False)
109    is
110       pragma Unreferenced (Foreign);
111       pragma Unreferenced (Afiles);
112       pragma Unreferenced (Interfaces);
113       pragma Unreferenced (Symbol_Data);
114
115       Lib_File : constant String :=
116         Lib_Dir & Directory_Separator & "lib" &
117         MLib.Fil.Ext_To (Lib_Filename, DLL_Ext);
118
119       Version_Arg          : String_Access;
120       Symbolic_Link_Needed : Boolean := False;
121
122       Init_Fini : Argument_List_Access := Empty_Argument_List;
123
124       Common_Options : constant Argument_List :=
125                          Options & new String'(PIC_Option);
126       --  Common set of options to the gcc command performing the link.
127       --  On HPUX, this command eventually resorts to collect2, which may
128       --  generate a C file and compile it on the fly. This compilation shall
129       --  also generate position independant code for the final link to
130       --  succeed.
131    begin
132       if Opt.Verbose_Mode then
133          Write_Str ("building relocatable shared library ");
134          Write_Line (Lib_File);
135       end if;
136
137       --  If specified, add automatic elaboration/finalization
138       if Auto_Init then
139          Init_Fini := Init_Fini_List;
140          Init_Fini (2) := new String'("-Wl," & Lib_Filename & "init");
141          Init_Fini (4) := new String'("-Wl," & Lib_Filename & "final");
142       end if;
143
144       if Lib_Version = "" then
145          MLib.Utl.Gcc
146            (Output_File => Lib_File,
147             Objects     => Ofiles,
148             Options     => Common_Options & Init_Fini.all,
149             Driver_Name => Driver_Name);
150
151       else
152          Version_Arg := new String'("-Wl,+h," & Lib_Version);
153
154          if Is_Absolute_Path (Lib_Version) then
155             MLib.Utl.Gcc
156               (Output_File => Lib_Version,
157                Objects     => Ofiles,
158                Options     => Common_Options & Version_Arg & Init_Fini.all,
159                Driver_Name => Driver_Name);
160             Symbolic_Link_Needed := Lib_Version /= Lib_File;
161
162          else
163             MLib.Utl.Gcc
164               (Output_File => Lib_Dir & Directory_Separator & Lib_Version,
165                Objects     => Ofiles,
166                Options     => Common_Options & Version_Arg & Init_Fini.all,
167                Driver_Name => Driver_Name);
168             Symbolic_Link_Needed :=
169               Lib_Dir & Directory_Separator & Lib_Version /= Lib_File;
170          end if;
171
172          if Symbolic_Link_Needed then
173             declare
174                Success : Boolean;
175                Oldpath : String (1 .. Lib_Version'Length + 1);
176                Newpath : String (1 .. Lib_File'Length + 1);
177
178                Result : Integer;
179                pragma Unreferenced (Result);
180
181                function Symlink
182                  (Oldpath : System.Address;
183                   Newpath : System.Address) return Integer;
184                pragma Import (C, Symlink, "__gnat_symlink");
185
186             begin
187                Oldpath (1 .. Lib_Version'Length) := Lib_Version;
188                Oldpath (Oldpath'Last)            := ASCII.NUL;
189                Newpath (1 .. Lib_File'Length)    := Lib_File;
190                Newpath (Newpath'Last)            := ASCII.NUL;
191
192                Delete_File (Lib_File, Success);
193
194                Result := Symlink (Oldpath'Address, Newpath'Address);
195             end;
196          end if;
197       end if;
198    end Build_Dynamic_Library;
199
200    -------------
201    -- DLL_Ext --
202    -------------
203
204    function DLL_Ext return String is
205    begin
206       return "sl";
207    end DLL_Ext;
208
209    --------------------
210    -- Dynamic_Option --
211    --------------------
212
213    function Dynamic_Option return String is
214    begin
215       return "-shared";
216    end Dynamic_Option;
217
218    -------------------
219    -- Is_Object_Ext --
220    -------------------
221
222    function Is_Object_Ext (Ext : String) return Boolean is
223    begin
224       return Ext = ".o";
225    end Is_Object_Ext;
226
227    --------------
228    -- Is_C_Ext --
229    --------------
230
231    function Is_C_Ext (Ext : String) return Boolean is
232    begin
233       return Ext = ".c";
234    end Is_C_Ext;
235
236    --------------------
237    -- Is_Archive_Ext --
238    --------------------
239
240    function Is_Archive_Ext (Ext : String) return Boolean is
241    begin
242       return Ext = ".a" or else Ext = ".so";
243    end Is_Archive_Ext;
244
245    -------------
246    -- Libgnat --
247    -------------
248
249    function Libgnat return String is
250    begin
251       return "libgnat.a";
252    end Libgnat;
253
254    ------------------------
255    -- Library_Exists_For --
256    ------------------------
257
258    function Library_Exists_For (Project : Project_Id) return Boolean is
259    begin
260       if not Projects.Table (Project).Library then
261          Prj.Com.Fail ("INTERNAL ERROR: Library_Exists_For called " &
262                        "for non library project");
263          return False;
264
265       else
266          declare
267             Lib_Dir : constant String :=
268               Get_Name_String (Projects.Table (Project).Library_Dir);
269             Lib_Name : constant String :=
270               Get_Name_String (Projects.Table (Project).Library_Name);
271
272          begin
273             if Projects.Table (Project).Library_Kind = Static then
274                return Is_Regular_File
275                  (Lib_Dir & Directory_Separator & "lib" &
276                   Fil.Ext_To (Lib_Name, Archive_Ext));
277
278             else
279                return Is_Regular_File
280                  (Lib_Dir & Directory_Separator & "lib" &
281                   Fil.Ext_To (Lib_Name, DLL_Ext));
282             end if;
283          end;
284       end if;
285    end Library_Exists_For;
286
287    ---------------------------
288    -- Library_File_Name_For --
289    ---------------------------
290
291    function Library_File_Name_For (Project : Project_Id) return Name_Id is
292    begin
293       if not Projects.Table (Project).Library then
294          Prj.Com.Fail ("INTERNAL ERROR: Library_File_Name_For called " &
295                        "for non library project");
296          return No_Name;
297
298       else
299          declare
300             Lib_Name : constant String :=
301               Get_Name_String (Projects.Table (Project).Library_Name);
302
303          begin
304             Name_Len := 3;
305             Name_Buffer (1 .. Name_Len) := "lib";
306
307             if Projects.Table (Project).Library_Kind = Static then
308                Add_Str_To_Name_Buffer (Fil.Ext_To (Lib_Name, Archive_Ext));
309
310             else
311                Add_Str_To_Name_Buffer (Fil.Ext_To (Lib_Name, DLL_Ext));
312             end if;
313
314             return Name_Find;
315          end;
316       end if;
317    end Library_File_Name_For;
318
319    ----------------
320    -- Object_Ext --
321    ----------------
322
323    function Object_Ext return String is
324    begin
325       return "o";
326    end Object_Ext;
327
328    ----------------
329    -- PIC_Option --
330    ----------------
331
332    function PIC_Option return String is
333    begin
334       return "-fPIC";
335    end PIC_Option;
336
337    -----------------------------------------------
338    -- Standalone_Library_Auto_Init_Is_Supported --
339    -----------------------------------------------
340
341    function Standalone_Library_Auto_Init_Is_Supported return Boolean is
342    begin
343       return True;
344    end Standalone_Library_Auto_Init_Is_Supported;
345
346    ---------------------------
347    -- Support_For_Libraries --
348    ---------------------------
349
350    function Support_For_Libraries return Library_Support is
351    begin
352       return Full;
353    end Support_For_Libraries;
354
355 end MLib.Tgt;