1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
10 -- Copyright (C) 2003-2005, Ada Core Technologies, Inc. --
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. --
23 -- GNAT was originally developed by the GNAT team at New York University. --
24 -- Extensive contributions were provided by Ada Core Technologies Inc. --
26 ------------------------------------------------------------------------------
28 -- This package provides a set of target dependent routines to build
29 -- static, dynamic or relocatable libraries.
31 -- This is the AIX version of the body.
33 with Ada.Strings.Fixed; use Ada.Strings.Fixed;
34 with GNAT.OS_Lib; use GNAT.OS_Lib;
38 with Namet; use Namet;
39 with Osint; use Osint;
41 with Output; use Output;
43 with Prj.Util; use Prj.Util;
45 package body MLib.Tgt is
47 No_Arguments : aliased Argument_List := (1 .. 0 => null);
48 Empty_Argument_List : constant Argument_List_Access := No_Arguments'Access;
50 Bexpall : aliased String := "-Wl,-bexpall";
51 Bexpall_Option : constant String_Access := Bexpall'Access;
52 -- The switch to export all symbols
54 Lpthreads : aliased String := "-lpthreads";
55 Native_Thread_Options : aliased Argument_List := (1 => Lpthreads'Access);
56 -- The switch to use when linking a library against libgnarl when using
59 Lgthreads : aliased String := "-lgthreads";
60 Lmalloc : aliased String := "-lmalloc";
61 FSU_Thread_Options : aliased Argument_List :=
62 (1 => Lgthreads'Access, 2 => Lmalloc'Access);
63 -- The switches to use when linking a library against libgnarl when using
66 Thread_Options : Argument_List_Access := Empty_Argument_List;
67 -- Designate the thread switches to used when linking a library against
68 -- libgnarl. Depends on the thread library (Native or FSU). Resolved for
69 -- the first library linked against libgnarl.
75 function Archive_Builder return String is
80 -----------------------------
81 -- Archive_Builder_Options --
82 -----------------------------
84 function Archive_Builder_Options return String_List_Access is
86 return new String_List'(1 => new String'("cr"));
87 end Archive_Builder_Options;
93 function Archive_Ext return String is
100 ---------------------
102 function Archive_Indexer return String is
107 -----------------------------
108 -- Archive_Indexer_Options --
109 -----------------------------
111 function Archive_Indexer_Options return String_List_Access is
113 return new String_List (1 .. 0);
114 end Archive_Indexer_Options;
116 ---------------------------
117 -- Build_Dynamic_Library --
118 ---------------------------
120 procedure Build_Dynamic_Library
121 (Ofiles : Argument_List;
122 Foreign : Argument_List;
123 Afiles : Argument_List;
124 Options : Argument_List;
125 Options_2 : Argument_List;
126 Interfaces : Argument_List;
127 Lib_Filename : String;
129 Symbol_Data : Symbol_Record;
130 Driver_Name : Name_Id := No_Name;
131 Lib_Version : String := "";
132 Auto_Init : Boolean := False)
134 pragma Unreferenced (Foreign);
135 pragma Unreferenced (Afiles);
136 pragma Unreferenced (Interfaces);
137 pragma Unreferenced (Symbol_Data);
138 pragma Unreferenced (Lib_Version);
139 pragma Unreferenced (Auto_Init);
141 Lib_File : constant String :=
142 Lib_Dir & Directory_Separator & "lib" &
143 MLib.Fil.Ext_To (Lib_Filename, DLL_Ext);
144 -- The file name of the library
146 Thread_Opts : Argument_List_Access := Empty_Argument_List;
147 -- Set to Thread_Options if -lgnarl is found in the Options
150 if Opt.Verbose_Mode then
151 Write_Str ("building relocatable shared library ");
152 Write_Line (Lib_File);
155 -- Look for -lgnarl in Options. If found, set the thread options.
157 for J in Options'Range loop
158 if Options (J).all = "-lgnarl" then
160 -- If Thread_Options is null, read s-osinte.ads to discover the
161 -- thread library and set Thread_Options accordingly.
163 if Thread_Options = null then
166 Line : String (1 .. 100);
171 (File, Include_Dir_Default_Prefix & "/s-osinte.ads");
173 while not End_Of_File (File) loop
174 Get_Line (File, Line, Last);
176 if Index (Line (1 .. Last), "-lpthreads") /= 0 then
177 Thread_Options := Native_Thread_Options'Access;
180 elsif Index (Line (1 .. Last), "-lgthreads") /= 0 then
181 Thread_Options := FSU_Thread_Options'Access;
188 if Thread_Options = null then
189 Prj.Com.Fail ("cannot find the thread library in use");
194 Prj.Com.Fail ("cannot open s-osinte.ads");
198 Thread_Opts := Thread_Options;
203 -- Finally, call GCC (or the driver specified) to build the library
206 (Output_File => Lib_File,
208 Options => Options & Bexpall_Option,
209 Driver_Name => Driver_Name,
210 Options_2 => Options_2 & Thread_Opts.all);
211 end Build_Dynamic_Library;
217 function DLL_Ext return String is
226 function Dynamic_Option return String is
235 function Is_Object_Ext (Ext : String) return Boolean is
244 function Is_C_Ext (Ext : String) return Boolean is
253 function Is_Archive_Ext (Ext : String) return Boolean is
262 function Libgnat return String is
267 ------------------------
268 -- Library_Exists_For --
269 ------------------------
271 function Library_Exists_For
272 (Project : Project_Id; In_Tree : Project_Tree_Ref) return Boolean
275 if not In_Tree.Projects.Table (Project).Library then
276 Prj.Com.Fail ("INTERNAL ERROR: Library_Exists_For called " &
277 "for non library project");
282 Lib_Dir : constant String :=
284 (In_Tree.Projects.Table (Project).Library_Dir);
286 Lib_Name : constant String :=
288 (In_Tree.Projects.Table (Project).Library_Name);
291 if In_Tree.Projects.Table (Project).Library_Kind =
294 return Is_Regular_File
295 (Lib_Dir & Directory_Separator & "lib" &
296 Fil.Ext_To (Lib_Name, Archive_Ext));
299 return Is_Regular_File
300 (Lib_Dir & Directory_Separator & "lib" &
301 Fil.Ext_To (Lib_Name, DLL_Ext));
305 end Library_Exists_For;
307 ---------------------------
308 -- Library_File_Name_For --
309 ---------------------------
311 function Library_File_Name_For
312 (Project : Project_Id;
313 In_Tree : Project_Tree_Ref) return Name_Id
316 if not In_Tree.Projects.Table (Project).Library then
317 Prj.Com.Fail ("INTERNAL ERROR: Library_File_Name_For called " &
318 "for non library project");
323 Lib_Name : constant String :=
325 (In_Tree.Projects.Table (Project).Library_Name);
329 Name_Buffer (1 .. Name_Len) := "lib";
331 if In_Tree.Projects.Table (Project).Library_Kind =
334 Add_Str_To_Name_Buffer (Fil.Ext_To (Lib_Name, Archive_Ext));
337 Add_Str_To_Name_Buffer (Fil.Ext_To (Lib_Name, DLL_Ext));
343 end Library_File_Name_For;
349 function Object_Ext return String is
358 function PIC_Option return String is
363 -----------------------------------------------
364 -- Standalone_Library_Auto_Init_Is_Supported --
365 -----------------------------------------------
367 function Standalone_Library_Auto_Init_Is_Supported return Boolean is
370 end Standalone_Library_Auto_Init_Is_Supported;
372 ---------------------------
373 -- Support_For_Libraries --
374 ---------------------------
376 function Support_For_Libraries return Library_Support is
379 end Support_For_Libraries;