1------------------------------------------------------------------------------
2--                                                                          --
3--                         GNAT COMPILER COMPONENTS                         --
4--                                                                          --
5--                             M L I B . T G T                              --
6--                                                                          --
7--                                 B o d y                                  --
8--                                                                          --
9--                     Copyright (C) 2001-2010, AdaCore                     --
10--                                                                          --
11-- GNAT is free software;  you can  redistribute it  and/or modify it under --
12-- terms of the  GNU General Public License as published  by the Free Soft- --
13-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
14-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
15-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
16-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
17-- for  more details.  You should have  received  a copy of the GNU General --
18-- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
19-- http://www.gnu.org/licenses for a complete copy of the license.          --
20--                                                                          --
21-- GNAT was originally developed  by the GNAT team at  New York University. --
22-- Extensive contributions were provided by Ada Core Technologies Inc.      --
23--                                                                          --
24------------------------------------------------------------------------------
25
26with MLib.Fil;
27with Prj.Com;
28
29with MLib.Tgt.Specific;
30pragma Warnings (Off, MLib.Tgt.Specific);
31--  MLib.Tgt.Specific is with'ed only for elaboration purposes
32
33package body MLib.Tgt is
34
35   ---------------------
36   -- Archive_Builder --
37   ---------------------
38
39   function Archive_Builder return String is
40   begin
41      return Archive_Builder_Ptr.all;
42   end Archive_Builder;
43
44   -----------------------------
45   -- Archive_Builder_Default --
46   -----------------------------
47
48   function Archive_Builder_Default return String is
49   begin
50      return "ar";
51   end Archive_Builder_Default;
52
53   -----------------------------
54   -- Archive_Builder_Options --
55   -----------------------------
56
57   function Archive_Builder_Options return String_List_Access is
58   begin
59      return Archive_Builder_Options_Ptr.all;
60   end Archive_Builder_Options;
61
62   -------------------------------------
63   -- Archive_Builder_Options_Default --
64   -------------------------------------
65
66   function Archive_Builder_Options_Default return String_List_Access is
67   begin
68      return new String_List'(1 => new String'("cr"));
69   end Archive_Builder_Options_Default;
70
71   ------------------------------------
72   -- Archive_Builder_Append_Options --
73   ------------------------------------
74
75   function Archive_Builder_Append_Options return String_List_Access is
76   begin
77      return Archive_Builder_Append_Options_Ptr.all;
78   end Archive_Builder_Append_Options;
79
80   --------------------------------------------
81   -- Archive_Builder_Append_Options_Default --
82   --------------------------------------------
83
84   function Archive_Builder_Append_Options_Default return String_List_Access is
85   begin
86      return new String_List'(1 => new String'("q"));
87   end Archive_Builder_Append_Options_Default;
88
89   -----------------
90   -- Archive_Ext --
91   -----------------
92
93   function Archive_Ext return String is
94   begin
95      return Archive_Ext_Ptr.all;
96   end Archive_Ext;
97
98   -------------------------
99   -- Archive_Ext_Default --
100   -------------------------
101
102   function Archive_Ext_Default return String is
103   begin
104      return "a";
105   end Archive_Ext_Default;
106
107   ---------------------
108   -- Archive_Indexer --
109   ---------------------
110
111   function Archive_Indexer return String is
112   begin
113      return Archive_Indexer_Ptr.all;
114   end Archive_Indexer;
115
116   -----------------------------
117   -- Archive_Indexer_Default --
118   -----------------------------
119
120   function Archive_Indexer_Default return String is
121   begin
122      return "ranlib";
123   end Archive_Indexer_Default;
124
125   -----------------------------
126   -- Archive_Indexer_Options --
127   -----------------------------
128
129   function Archive_Indexer_Options return String_List_Access is
130   begin
131      return Archive_Indexer_Options_Ptr.all;
132   end Archive_Indexer_Options;
133
134   -------------------------------------
135   -- Archive_Indexer_Options_Default --
136   -------------------------------------
137
138   function Archive_Indexer_Options_Default return String_List_Access is
139   begin
140      return new String_List (1 .. 0);
141   end Archive_Indexer_Options_Default;
142
143   ---------------------------
144   -- Build_Dynamic_Library --
145   ---------------------------
146
147   procedure Build_Dynamic_Library
148     (Ofiles       : Argument_List;
149      Options      : Argument_List;
150      Interfaces   : Argument_List;
151      Lib_Filename : String;
152      Lib_Dir      : String;
153      Symbol_Data  : Symbol_Record;
154      Driver_Name  : Name_Id := No_Name;
155      Lib_Version  : String  := "";
156      Auto_Init    : Boolean := False)
157   is
158   begin
159      Build_Dynamic_Library_Ptr
160        (Ofiles,
161         Options,
162         Interfaces,
163         Lib_Filename,
164         Lib_Dir,
165         Symbol_Data,
166         Driver_Name,
167         Lib_Version,
168         Auto_Init);
169   end Build_Dynamic_Library;
170
171   ------------------------------
172   -- Default_Symbol_File_Name --
173   ------------------------------
174
175   function Default_Symbol_File_Name return String is
176   begin
177      return Default_Symbol_File_Name_Ptr.all;
178   end Default_Symbol_File_Name;
179
180   --------------------------------------
181   -- Default_Symbol_File_Name_Default --
182   --------------------------------------
183
184   function Default_Symbol_File_Name_Default return String is
185   begin
186      return "";
187   end Default_Symbol_File_Name_Default;
188
189   -------------
190   -- DLL_Ext --
191   -------------
192
193   function DLL_Ext return String is
194   begin
195      return DLL_Ext_Ptr.all;
196   end DLL_Ext;
197
198   ---------------------
199   -- DLL_Ext_Default --
200   ---------------------
201
202   function DLL_Ext_Default return String is
203   begin
204      return "so";
205   end DLL_Ext_Default;
206
207   ----------------
208   -- DLL_Prefix --
209   ----------------
210
211   function DLL_Prefix return String is
212   begin
213      return DLL_Prefix_Ptr.all;
214   end DLL_Prefix;
215
216   ------------------------
217   -- DLL_Prefix_Default --
218   ------------------------
219
220   function DLL_Prefix_Default return String is
221   begin
222      return "lib";
223   end DLL_Prefix_Default;
224
225   --------------------
226   -- Dynamic_Option --
227   --------------------
228
229   function Dynamic_Option return String is
230   begin
231      return Dynamic_Option_Ptr.all;
232   end Dynamic_Option;
233
234   ----------------------------
235   -- Dynamic_Option_Default --
236   ----------------------------
237
238   function Dynamic_Option_Default return String is
239   begin
240      return "-shared";
241   end Dynamic_Option_Default;
242
243   -------------------
244   -- Is_Object_Ext --
245   -------------------
246
247   function Is_Object_Ext (Ext : String) return Boolean is
248   begin
249      return Is_Object_Ext_Ptr (Ext);
250   end Is_Object_Ext;
251
252   ---------------------------
253   -- Is_Object_Ext_Default --
254   ---------------------------
255
256   function Is_Object_Ext_Default (Ext : String) return Boolean is
257   begin
258      return Ext = ".o";
259   end Is_Object_Ext_Default;
260
261   --------------
262   -- Is_C_Ext --
263   --------------
264
265   function Is_C_Ext (Ext : String) return Boolean is
266   begin
267      return Is_C_Ext_Ptr (Ext);
268   end Is_C_Ext;
269
270   ----------------------
271   -- Is_C_Ext_Default --
272   ----------------------
273
274   function Is_C_Ext_Default (Ext : String) return Boolean is
275   begin
276      return Ext = ".c";
277   end Is_C_Ext_Default;
278
279   --------------------
280   -- Is_Archive_Ext --
281   --------------------
282
283   function Is_Archive_Ext (Ext : String) return Boolean is
284   begin
285      return Is_Archive_Ext_Ptr (Ext);
286   end Is_Archive_Ext;
287
288   ----------------------------
289   -- Is_Archive_Ext_Default --
290   ----------------------------
291
292   function Is_Archive_Ext_Default (Ext : String) return Boolean is
293   begin
294      return Ext = ".a";
295   end Is_Archive_Ext_Default;
296
297   -------------
298   -- Libgnat --
299   -------------
300
301   function Libgnat return String is
302   begin
303      return Libgnat_Ptr.all;
304   end Libgnat;
305
306   ---------------------
307   -- Libgnat_Default --
308   ---------------------
309
310   function Libgnat_Default return String is
311   begin
312      return "libgnat.a";
313   end Libgnat_Default;
314
315   ------------------------
316   -- Library_Exists_For --
317   ------------------------
318
319   function Library_Exists_For
320     (Project : Project_Id;
321      In_Tree : Project_Tree_Ref) return Boolean
322   is
323   begin
324      return Library_Exists_For_Ptr (Project, In_Tree);
325   end Library_Exists_For;
326
327   --------------------------------
328   -- Library_Exists_For_Default --
329   --------------------------------
330
331   function Library_Exists_For_Default
332     (Project : Project_Id;
333      In_Tree : Project_Tree_Ref) return Boolean
334   is
335      pragma Unreferenced (In_Tree);
336
337   begin
338      if not Project.Library then
339         Prj.Com.Fail ("INTERNAL ERROR: Library_Exists_For called " &
340                       "for non library project");
341         return False;
342
343      else
344         declare
345            Lib_Dir  : constant String :=
346                         Get_Name_String (Project.Library_Dir.Display_Name);
347            Lib_Name : constant String :=
348                         Get_Name_String (Project.Library_Name);
349
350         begin
351            if Project.Library_Kind = Static then
352               return Is_Regular_File
353                 (Lib_Dir & Directory_Separator & "lib" &
354                  Fil.Append_To (Lib_Name, Archive_Ext));
355
356            else
357               return Is_Regular_File
358                 (Lib_Dir & Directory_Separator & DLL_Prefix &
359                  Fil.Append_To (Lib_Name, DLL_Ext));
360            end if;
361         end;
362      end if;
363   end Library_Exists_For_Default;
364
365   ---------------------------
366   -- Library_File_Name_For --
367   ---------------------------
368
369   function Library_File_Name_For
370     (Project : Project_Id;
371      In_Tree : Project_Tree_Ref) return File_Name_Type
372   is
373   begin
374      return Library_File_Name_For_Ptr (Project, In_Tree);
375   end Library_File_Name_For;
376
377   -----------------------------------
378   -- Library_File_Name_For_Default --
379   -----------------------------------
380
381   function Library_File_Name_For_Default
382     (Project : Project_Id;
383      In_Tree : Project_Tree_Ref) return File_Name_Type
384   is
385      pragma Unreferenced (In_Tree);
386   begin
387      if not Project.Library then
388         Prj.Com.Fail ("INTERNAL ERROR: Library_File_Name_For called " &
389                       "for non library project");
390         return No_File;
391
392      else
393         declare
394            Lib_Name : constant String :=
395                         Get_Name_String (Project.Library_Name);
396
397         begin
398            if Project.Library_Kind =
399                 Static
400            then
401               Name_Len := 3;
402               Name_Buffer (1 .. Name_Len) := "lib";
403               Add_Str_To_Name_Buffer (Fil.Append_To (Lib_Name, Archive_Ext));
404            else
405               Name_Len := 0;
406               Add_Str_To_Name_Buffer (DLL_Prefix);
407               Add_Str_To_Name_Buffer (Fil.Append_To (Lib_Name, DLL_Ext));
408            end if;
409
410            return Name_Find;
411         end;
412      end if;
413   end Library_File_Name_For_Default;
414
415   --------------------------------------
416   -- Library_Major_Minor_Id_Supported --
417   --------------------------------------
418
419   function Library_Major_Minor_Id_Supported return Boolean is
420   begin
421      return Library_Major_Minor_Id_Supported_Ptr.all;
422   end Library_Major_Minor_Id_Supported;
423
424   ----------------------------------------------
425   -- Library_Major_Minor_Id_Supported_Default --
426   ----------------------------------------------
427
428   function Library_Major_Minor_Id_Supported_Default return Boolean is
429   begin
430      return True;
431   end Library_Major_Minor_Id_Supported_Default;
432
433   ----------------
434   -- Object_Ext --
435   ----------------
436
437   function Object_Ext return String is
438   begin
439      return Object_Ext_Ptr.all;
440   end Object_Ext;
441
442   ------------------------
443   -- Object_Ext_Default --
444   ------------------------
445
446   function Object_Ext_Default return String is
447   begin
448      return "o";
449   end Object_Ext_Default;
450
451   ----------------
452   -- PIC_Option --
453   ----------------
454
455   function PIC_Option return String is
456   begin
457      return PIC_Option_Ptr.all;
458   end PIC_Option;
459
460   ------------------------
461   -- PIC_Option_Default --
462   ------------------------
463
464   function PIC_Option_Default return String is
465   begin
466      return "-fPIC";
467   end PIC_Option_Default;
468
469   -----------------------------------------------
470   -- Standalone_Library_Auto_Init_Is_Supported --
471   -----------------------------------------------
472
473   function Standalone_Library_Auto_Init_Is_Supported return Boolean is
474   begin
475      return Standalone_Library_Auto_Init_Is_Supported_Ptr.all;
476   end Standalone_Library_Auto_Init_Is_Supported;
477
478   -------------------------------------------------------
479   -- Standalone_Library_Auto_Init_Is_Supported_Default --
480   -------------------------------------------------------
481
482   function Standalone_Library_Auto_Init_Is_Supported_Default return Boolean is
483   begin
484      return True;
485   end Standalone_Library_Auto_Init_Is_Supported_Default;
486
487   ---------------------------
488   -- Support_For_Libraries --
489   ---------------------------
490
491   function Support_For_Libraries return Library_Support is
492   begin
493      return Support_For_Libraries_Ptr.all;
494   end Support_For_Libraries;
495
496   -----------------------------------
497   -- Support_For_Libraries_Default --
498   -----------------------------------
499
500   function Support_For_Libraries_Default return Library_Support is
501   begin
502      return Full;
503   end Support_For_Libraries_Default;
504
505end MLib.Tgt;
506