OSDN Git Service

Update FSF address
[pf3gnuchains/gcc-fork.git] / gcc / ada / mlib-tgt-tru64.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT COMPILER COMPONENTS                         --
4 --                                                                          --
5 --                             M L I B . T G T                              --
6 --                             (True64 Version)                             --
7 --                                                                          --
8 --                                 B o d y                                  --
9 --                                                                          --
10 --              Copyright (C) 2002-2005 Free Software Foundation, 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,  51  Franklin  Street,  Fifth  Floor, --
21 -- Boston, MA 02110-1301, 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 True64 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    use GNAT;
44    use MLib;
45
46    Expect_Unresolved : aliased String := "-Wl,-expect_unresolved,*";
47
48    No_Arguments        : aliased Argument_List         := (1 .. 0 => null);
49    Empty_Argument_List : constant Argument_List_Access := No_Arguments'Access;
50
51    Wl_Init_String : aliased String         := "-Wl,-init";
52    Wl_Init        : constant String_Access := Wl_Init_String'Access;
53    Wl_Fini_String : aliased String         := "-Wl,-fini";
54    Wl_Fini        : constant String_Access := Wl_Fini_String'Access;
55
56    Init_Fini_List :  constant Argument_List_Access :=
57                        new Argument_List'(1 => Wl_Init,
58                                           2 => null,
59                                           3 => Wl_Fini,
60                                           4 => null);
61    --  Used to put switches for automatic elaboration/finalization
62
63    ---------------------
64    -- Archive_Builder --
65    ---------------------
66
67    function Archive_Builder return String is
68    begin
69       return "ar";
70    end Archive_Builder;
71
72    -----------------------------
73    -- Archive_Builder_Options --
74    -----------------------------
75
76    function Archive_Builder_Options return String_List_Access is
77    begin
78       return new String_List'(1 => new String'("cr"));
79    end Archive_Builder_Options;
80
81    -----------------
82    -- Archive_Ext --
83    -----------------
84
85    function Archive_Ext return  String is
86    begin
87       return "a";
88    end Archive_Ext;
89
90    ---------------------
91    -- Archive_Indexer --
92    ---------------------
93
94    function Archive_Indexer return String is
95    begin
96       return "ranlib";
97    end Archive_Indexer;
98
99    -----------------------------
100    -- Archive_Indexer_Options --
101    -----------------------------
102
103    function Archive_Indexer_Options return String_List_Access is
104    begin
105       return new String_List (1 .. 0);
106    end Archive_Indexer_Options;
107
108    ---------------------------
109    -- Build_Dynamic_Library --
110    ---------------------------
111
112    procedure Build_Dynamic_Library
113      (Ofiles       : Argument_List;
114       Foreign      : Argument_List;
115       Afiles       : Argument_List;
116       Options      : Argument_List;
117       Options_2    : Argument_List;
118       Interfaces   : Argument_List;
119       Lib_Filename : String;
120       Lib_Dir      : String;
121       Symbol_Data  : Symbol_Record;
122       Driver_Name  : Name_Id := No_Name;
123       Lib_Version  : String  := "";
124       Auto_Init    : Boolean := False)
125    is
126       pragma Unreferenced (Foreign);
127       pragma Unreferenced (Afiles);
128       pragma Unreferenced (Interfaces);
129       pragma Unreferenced (Symbol_Data);
130
131       Lib_File : constant String :=
132                    Lib_Dir & Directory_Separator & "lib" &
133                    Fil.Ext_To (Lib_Filename, DLL_Ext);
134
135       Version_Arg          : String_Access;
136       Symbolic_Link_Needed : Boolean := False;
137
138       Init_Fini : Argument_List_Access := Empty_Argument_List;
139
140    begin
141       if Opt.Verbose_Mode then
142          Write_Str ("building relocatable shared library ");
143          Write_Line (Lib_File);
144       end if;
145
146       --  If specified, add automatic elaboration/finalization
147
148       if Auto_Init then
149          Init_Fini := Init_Fini_List;
150          Init_Fini (2) := new String'("-Wl," & Lib_Filename & "init");
151          Init_Fini (4) := new String'("-Wl," & Lib_Filename & "final");
152       end if;
153
154       if Lib_Version = "" then
155          Utl.Gcc
156            (Output_File => Lib_File,
157             Objects     => Ofiles,
158             Options     =>
159               Options &
160               Expect_Unresolved'Access &
161               Init_Fini.all,
162             Options_2   => Options_2,
163             Driver_Name => Driver_Name);
164
165       else
166          Version_Arg := new String'("-Wl,-soname," & Lib_Version);
167
168          if Is_Absolute_Path (Lib_Version) then
169             Utl.Gcc
170               (Output_File => Lib_Version,
171                Objects     => Ofiles,
172                Options     =>
173                  Options &
174                  Version_Arg &
175                  Expect_Unresolved'Access &
176                  Init_Fini.all,
177                Options_2   => Options_2,
178                Driver_Name => Driver_Name);
179             Symbolic_Link_Needed := Lib_Version /= Lib_File;
180
181          else
182             Utl.Gcc
183               (Output_File => Lib_Dir & Directory_Separator & Lib_Version,
184                Objects     => Ofiles,
185                Options     =>
186                  Options &
187                  Version_Arg &
188                  Expect_Unresolved'Access &
189                  Init_Fini.all,
190                Options_2   => Options_2,
191                Driver_Name => Driver_Name);
192             Symbolic_Link_Needed :=
193               Lib_Dir & Directory_Separator & Lib_Version /= Lib_File;
194          end if;
195
196          if Symbolic_Link_Needed then
197             declare
198                Success : Boolean;
199                Oldpath : String (1 .. Lib_Version'Length + 1);
200                Newpath : String (1 .. Lib_File'Length + 1);
201
202                Result : Integer;
203                pragma Unreferenced (Result);
204
205                function Symlink
206                  (Oldpath : System.Address;
207                   Newpath : System.Address)
208                   return    Integer;
209                pragma Import (C, Symlink, "__gnat_symlink");
210
211             begin
212                Oldpath (1 .. Lib_Version'Length) := Lib_Version;
213                Oldpath (Oldpath'Last)            := ASCII.NUL;
214                Newpath (1 .. Lib_File'Length)    := Lib_File;
215                Newpath (Newpath'Last)            := ASCII.NUL;
216
217                Delete_File (Lib_File, Success);
218
219                Result := Symlink (Oldpath'Address, Newpath'Address);
220             end;
221          end if;
222       end if;
223    end Build_Dynamic_Library;
224
225    -------------
226    -- DLL_Ext --
227    -------------
228
229    function DLL_Ext return String is
230    begin
231       return "so";
232    end DLL_Ext;
233
234    --------------------
235    -- Dynamic_Option --
236    --------------------
237
238    function Dynamic_Option return String is
239    begin
240       return "-shared";
241    end Dynamic_Option;
242
243    -------------------
244    -- Is_Object_Ext --
245    -------------------
246
247    function Is_Object_Ext (Ext : String) return Boolean is
248    begin
249       return Ext = ".o";
250    end Is_Object_Ext;
251
252    --------------
253    -- Is_C_Ext --
254    --------------
255
256    function Is_C_Ext (Ext : String) return Boolean is
257    begin
258       return Ext = ".c";
259    end Is_C_Ext;
260
261    --------------------
262    -- Is_Archive_Ext --
263    --------------------
264
265    function Is_Archive_Ext (Ext : String) return Boolean is
266    begin
267       return Ext = ".a" or else Ext = ".so";
268    end Is_Archive_Ext;
269
270    -------------
271    -- Libgnat --
272    -------------
273
274    function Libgnat return String is
275    begin
276       return "libgnat.a";
277    end Libgnat;
278
279    ------------------------
280    -- Library_Exists_For --
281    ------------------------
282
283    function Library_Exists_For
284      (Project : Project_Id; In_Tree : Project_Tree_Ref) return Boolean
285    is
286    begin
287       if not In_Tree.Projects.Table (Project).Library then
288          Prj.Com.Fail ("INTERNAL ERROR: Library_Exists_For called " &
289                        "for non library project");
290          return False;
291
292       else
293          declare
294             Lib_Dir : constant String :=
295               Get_Name_String
296                 (In_Tree.Projects.Table (Project).Library_Dir);
297             Lib_Name : constant String :=
298               Get_Name_String
299                 (In_Tree.Projects.Table (Project).Library_Name);
300
301          begin
302             if In_Tree.Projects.Table (Project).Library_Kind =
303               Static
304             then
305                return Is_Regular_File
306                  (Lib_Dir & Directory_Separator & "lib" &
307                   Fil.Ext_To (Lib_Name, Archive_Ext));
308
309             else
310                return Is_Regular_File
311                  (Lib_Dir & Directory_Separator & "lib" &
312                   Fil.Ext_To (Lib_Name, DLL_Ext));
313             end if;
314          end;
315       end if;
316    end Library_Exists_For;
317
318    ---------------------------
319    -- Library_File_Name_For --
320    ---------------------------
321
322    function Library_File_Name_For
323      (Project : Project_Id;
324       In_Tree : Project_Tree_Ref) return Name_Id
325    is
326    begin
327       if not In_Tree.Projects.Table (Project).Library then
328          Prj.Com.Fail ("INTERNAL ERROR: Library_File_Name_For called " &
329                        "for non library project");
330          return No_Name;
331
332       else
333          declare
334             Lib_Name : constant String :=
335               Get_Name_String
336                 (In_Tree.Projects.Table (Project).Library_Name);
337
338          begin
339             Name_Len := 3;
340             Name_Buffer (1 .. Name_Len) := "lib";
341
342             if In_Tree.Projects.Table (Project).Library_Kind =
343               Static
344             then
345                Add_Str_To_Name_Buffer (Fil.Ext_To (Lib_Name, Archive_Ext));
346
347             else
348                Add_Str_To_Name_Buffer (Fil.Ext_To (Lib_Name, DLL_Ext));
349             end if;
350
351             return Name_Find;
352          end;
353       end if;
354    end Library_File_Name_For;
355
356    ----------------
357    -- Object_Ext --
358    ----------------
359
360    function Object_Ext return String is
361    begin
362       return "o";
363    end Object_Ext;
364
365    ----------------
366    -- PIC_Option --
367    ----------------
368
369    function PIC_Option return String is
370    begin
371       return "";
372    end PIC_Option;
373
374    -----------------------------------------------
375    -- Standalone_Library_Auto_Init_Is_Supported --
376    -----------------------------------------------
377
378    function Standalone_Library_Auto_Init_Is_Supported return Boolean is
379    begin
380       return True;
381    end Standalone_Library_Auto_Init_Is_Supported;
382
383    ---------------------------
384    -- Support_For_Libraries --
385    ---------------------------
386
387    function Support_For_Libraries return Library_Support is
388    begin
389       return Full;
390    end Support_For_Libraries;
391
392 end MLib.Tgt;