1------------------------------------------------------------------------------
2--                                                                          --
3--                         GNAT COMPILER COMPONENTS                         --
4--                                                                          --
5--                     M L I B . T G T . S P E C I F I C                    --
6--                              (AIX Version)                               --
7--                                                                          --
8--                                 B o d y                                  --
9--                                                                          --
10--                     Copyright (C) 2003-2008, AdaCore                     --
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 3,  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 COPYING3.  If not, go to --
20-- http://www.gnu.org/licenses for a complete copy of the license.          --
21--                                                                          --
22-- GNAT was originally developed  by the GNAT team at  New York University. --
23-- Extensive contributions were provided by Ada Core Technologies Inc.      --
24--                                                                          --
25------------------------------------------------------------------------------
26
27--  This is the AIX version of the body
28
29with Ada.Strings.Fixed; use Ada.Strings.Fixed;
30
31with MLib.Fil;
32with MLib.Utl;
33with Opt;
34with Output;   use Output;
35with Prj.Com;
36with Prj.Util; use Prj.Util;
37
38package body MLib.Tgt.Specific is
39
40   --  Local subprograms
41   --  These *ALL* require comments ???
42
43   function Archive_Indexer return String;
44   --  What is this???
45
46   procedure Build_Dynamic_Library
47     (Ofiles       : Argument_List;
48      Options      : Argument_List;
49      Interfaces   : Argument_List;
50      Lib_Filename : String;
51      Lib_Dir      : String;
52      Symbol_Data  : Symbol_Record;
53      Driver_Name  : Name_Id := No_Name;
54      Lib_Version  : String  := "";
55      Auto_Init    : Boolean := False);
56
57   function DLL_Ext return String;
58
59   function Library_Major_Minor_Id_Supported return Boolean;
60
61   function Support_For_Libraries return Library_Support;
62
63   --  Local variables
64
65   No_Arguments        : aliased Argument_List         := (1 .. 0 => null);
66   Empty_Argument_List : constant Argument_List_Access := No_Arguments'Access;
67
68   Bexpall : aliased String := "-Wl,-bexpall";
69   Bexpall_Option : constant String_Access := Bexpall'Access;
70   --  The switch to export all symbols
71
72   Lpthreads : aliased String := "-lpthreads";
73   Native_Thread_Options : aliased Argument_List := (1 => Lpthreads'Access);
74   --  The switch to use when linking a library against libgnarl when using
75   --  Native threads.
76
77   Lgthreads : aliased String := "-lgthreads";
78   Lmalloc   : aliased String := "-lmalloc";
79   FSU_Thread_Options : aliased Argument_List :=
80                          (1 => Lgthreads'Access, 2 => Lmalloc'Access);
81   --  The switches to use when linking a library against libgnarl when using
82   --  FSU threads.
83
84   Thread_Options : Argument_List_Access := Empty_Argument_List;
85   --  Designate the thread switches to used when linking a library against
86   --  libgnarl. Depends on the thread library (Native or FSU). Resolved for
87   --  the first library linked against libgnarl.
88
89   ---------------------
90   -- Archive_Indexer --
91   ---------------------
92
93   function Archive_Indexer return String is
94   begin
95      return "";
96   end Archive_Indexer;
97
98   ---------------------------
99   -- Build_Dynamic_Library --
100   ---------------------------
101
102   procedure Build_Dynamic_Library
103     (Ofiles       : Argument_List;
104      Options      : Argument_List;
105      Interfaces   : Argument_List;
106      Lib_Filename : String;
107      Lib_Dir      : String;
108      Symbol_Data  : Symbol_Record;
109      Driver_Name  : Name_Id := No_Name;
110      Lib_Version  : String  := "";
111      Auto_Init    : Boolean := False)
112   is
113      pragma Unreferenced (Interfaces);
114      pragma Unreferenced (Symbol_Data);
115      pragma Unreferenced (Lib_Version);
116      pragma Unreferenced (Auto_Init);
117
118      Lib_File : constant String :=
119                   Lib_Dir & Directory_Separator & "lib" &
120                   MLib.Fil.Append_To (Lib_Filename, DLL_Ext);
121      --  The file name of the library
122
123      Thread_Opts : Argument_List_Access := Empty_Argument_List;
124      --  Set to Thread_Options if -lgnarl is found in the Options
125
126   begin
127      if Opt.Verbose_Mode then
128         Write_Str ("building relocatable shared library ");
129         Write_Line (Lib_File);
130      end if;
131
132      --  Look for -lgnarl in Options. If found, set the thread options
133
134      for J in Options'Range loop
135         if Options (J).all = "-lgnarl" then
136
137            --  If Thread_Options is null, read s-osinte.ads to discover the
138            --  thread library and set Thread_Options accordingly.
139
140            if Thread_Options = null then
141               declare
142                  File : Text_File;
143                  Line : String (1 .. 100);
144                  Last : Natural;
145
146               begin
147                  Open
148                    (File, Include_Dir_Default_Prefix & "/s-osinte.ads");
149
150                  while not End_Of_File (File) loop
151                     Get_Line (File, Line, Last);
152
153                     if Index (Line (1 .. Last), "-lpthreads") /= 0 then
154                        Thread_Options := Native_Thread_Options'Access;
155                        exit;
156
157                     elsif Index (Line (1 .. Last), "-lgthreads") /= 0 then
158                        Thread_Options := FSU_Thread_Options'Access;
159                        exit;
160                     end if;
161                  end loop;
162
163                  Close (File);
164
165                  if Thread_Options = null then
166                     Prj.Com.Fail ("cannot find the thread library in use");
167                  end if;
168
169               exception
170                  when others =>
171                     Prj.Com.Fail ("cannot open s-osinte.ads");
172               end;
173            end if;
174
175            Thread_Opts := Thread_Options;
176            exit;
177         end if;
178      end loop;
179
180      --  Finally, call GCC (or the driver specified) to build the library
181
182      MLib.Utl.Gcc
183        (Output_File => Lib_File,
184         Objects     => Ofiles,
185         Options     => Options & Bexpall_Option,
186         Driver_Name => Driver_Name,
187         Options_2   => Thread_Opts.all);
188   end Build_Dynamic_Library;
189
190   -------------
191   -- DLL_Ext --
192   -------------
193
194   function DLL_Ext return String is
195   begin
196      return "a";
197   end DLL_Ext;
198
199   --------------------------------------
200   -- Library_Major_Minor_Id_Supported --
201   --------------------------------------
202
203   function Library_Major_Minor_Id_Supported return Boolean is
204   begin
205      return False;
206   end Library_Major_Minor_Id_Supported;
207
208   ---------------------------
209   -- Support_For_Libraries --
210   ---------------------------
211
212   function Support_For_Libraries return Library_Support is
213   begin
214      return Static_Only;
215   end Support_For_Libraries;
216
217begin
218   Archive_Indexer_Ptr := Archive_Indexer'Access;
219   Build_Dynamic_Library_Ptr := Build_Dynamic_Library'Access;
220   DLL_Ext_Ptr := DLL_Ext'Access;
221   Library_Major_Minor_Id_Supported_Ptr :=
222                                Library_Major_Minor_Id_Supported'Access;
223   Support_For_Libraries_Ptr := Support_For_Libraries'Access;
224
225end MLib.Tgt.Specific;
226