1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
5 -- M L I B . T G T . S P E C I F I C --
10 -- Copyright (C) 2001-2008, Free Software Foundation, 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 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. --
22 -- GNAT was originally developed by the GNAT team at New York University. --
23 -- Extensive contributions were provided by Ada Core Technologies Inc. --
25 ------------------------------------------------------------------------------
27 -- This is the Darwin version of the body
33 with Output; use Output;
35 package body MLib.Tgt.Specific is
37 -- Non default subprograms
39 procedure Build_Dynamic_Library
40 (Ofiles : Argument_List;
41 Options : Argument_List;
42 Interfaces : Argument_List;
43 Lib_Filename : String;
45 Symbol_Data : Symbol_Record;
46 Driver_Name : Name_Id := No_Name;
47 Lib_Version : String := "";
48 Auto_Init : Boolean := False);
50 function DLL_Ext return String;
52 function Dynamic_Option return String;
54 function Is_Archive_Ext (Ext : String) return Boolean;
58 Flat_Namespace : aliased String := "-Wl,-flat_namespace";
59 -- Instruct the linker to build the shared library as a flat
60 -- namespace image. The default is a two-level namespace image.
62 Shared_Libgcc : aliased String := "-shared-libgcc";
64 Shared_Options : constant Argument_List :=
65 (1 => Flat_Namespace'Access,
66 2 => Shared_Libgcc'Access);
68 ---------------------------
69 -- Build_Dynamic_Library --
70 ---------------------------
72 procedure Build_Dynamic_Library
73 (Ofiles : Argument_List;
74 Options : Argument_List;
75 Interfaces : Argument_List;
76 Lib_Filename : String;
78 Symbol_Data : Symbol_Record;
79 Driver_Name : Name_Id := No_Name;
80 Lib_Version : String := "";
81 Auto_Init : Boolean := False)
83 pragma Unreferenced (Interfaces);
84 pragma Unreferenced (Symbol_Data);
85 pragma Unreferenced (Auto_Init);
87 Lib_File : constant String :=
88 "lib" & Fil.Append_To (Lib_Filename, DLL_Ext);
90 Lib_Path : constant String :=
91 Lib_Dir & Directory_Separator & Lib_File;
93 Symbolic_Link_Needed : Boolean := False;
96 if Opt.Verbose_Mode then
97 Write_Str ("building relocatable shared library ");
98 Write_Line (Lib_File);
101 -- If specified, add automatic elaboration/finalization
103 if Lib_Version = "" then
105 (Output_File => Lib_Path,
107 Options => Options & Shared_Options,
108 Driver_Name => Driver_Name,
109 Options_2 => No_Argument_List);
113 Maj_Version : constant String :=
114 Major_Id_Name (Lib_File, Lib_Version);
116 if Is_Absolute_Path (Lib_Version) then
118 (Output_File => Lib_Version,
120 Options => Options & Shared_Options,
121 Driver_Name => Driver_Name,
122 Options_2 => No_Argument_List);
123 Symbolic_Link_Needed := Lib_Version /= Lib_Path;
127 (Output_File => Lib_Dir & Directory_Separator & Lib_Version,
129 Options => Options & Shared_Options,
130 Driver_Name => Driver_Name,
131 Options_2 => No_Argument_List);
132 Symbolic_Link_Needed :=
133 Lib_Dir & Directory_Separator & Lib_Version /= Lib_Path;
136 if Symbolic_Link_Needed then
138 (Lib_Path, Lib_Version, Lib_Dir, Maj_Version);
142 end Build_Dynamic_Library;
148 function DLL_Ext return String is
157 function Dynamic_Option return String is
159 return "-dynamiclib";
166 function Is_Archive_Ext (Ext : String) return Boolean is
168 return Ext = ".dylib" or else Ext = ".a";
172 Build_Dynamic_Library_Ptr := Build_Dynamic_Library'Access;
173 DLL_Ext_Ptr := DLL_Ext'Access;
174 Dynamic_Option_Ptr := Dynamic_Option'Access;
175 Is_Archive_Ext_Ptr := Is_Archive_Ext'Access;
176 end MLib.Tgt.Specific;