1------------------------------------------------------------------------------ 2-- -- 3-- GNAT COMPILER COMPONENTS -- 4-- -- 5-- M L I B . T G T . S P E C I F I C -- 6-- (Darwin Version) -- 7-- -- 8-- B o d y -- 9-- -- 10-- Copyright (C) 2001-2011, 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 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 Darwin version of the body 28 29with MLib; use MLib; 30with MLib.Fil; 31with MLib.Utl; 32with Opt; use Opt; 33with Output; use Output; 34 35package body MLib.Tgt.Specific is 36 37 -- Non default subprograms 38 39 procedure Build_Dynamic_Library 40 (Ofiles : Argument_List; 41 Options : Argument_List; 42 Interfaces : Argument_List; 43 Lib_Filename : String; 44 Lib_Dir : String; 45 Symbol_Data : Symbol_Record; 46 Driver_Name : Name_Id := No_Name; 47 Lib_Version : String := ""; 48 Auto_Init : Boolean := False); 49 50 function DLL_Ext return String; 51 52 function Dynamic_Option return String; 53 54 function Is_Archive_Ext (Ext : String) return Boolean; 55 56 -- Local objects 57 58 Shared_Libgcc : aliased String := "-shared-libgcc"; 59 60 Shared_Options : constant Argument_List := 61 (1 => Shared_Libgcc'Access); 62 63 --------------------------- 64 -- Build_Dynamic_Library -- 65 --------------------------- 66 67 procedure Build_Dynamic_Library 68 (Ofiles : Argument_List; 69 Options : Argument_List; 70 Interfaces : Argument_List; 71 Lib_Filename : String; 72 Lib_Dir : String; 73 Symbol_Data : Symbol_Record; 74 Driver_Name : Name_Id := No_Name; 75 Lib_Version : String := ""; 76 Auto_Init : Boolean := False) 77 is 78 pragma Unreferenced (Interfaces); 79 pragma Unreferenced (Symbol_Data); 80 pragma Unreferenced (Auto_Init); 81 82 Lib_File : constant String := 83 "lib" & Fil.Append_To (Lib_Filename, DLL_Ext); 84 85 Lib_Path : constant String := 86 Lib_Dir & Directory_Separator & Lib_File; 87 88 Symbolic_Link_Needed : Boolean := False; 89 90 begin 91 if Opt.Verbose_Mode then 92 Write_Str ("building relocatable shared library "); 93 Write_Line (Lib_File); 94 end if; 95 96 -- If specified, add automatic elaboration/finalization 97 98 if Lib_Version = "" then 99 Utl.Gcc 100 (Output_File => Lib_Path, 101 Objects => Ofiles, 102 Options => Options & Shared_Options, 103 Driver_Name => Driver_Name, 104 Options_2 => No_Argument_List); 105 106 else 107 declare 108 Maj_Version : constant String := 109 Major_Id_Name (Lib_File, Lib_Version); 110 begin 111 if Is_Absolute_Path (Lib_Version) then 112 Utl.Gcc 113 (Output_File => Lib_Version, 114 Objects => Ofiles, 115 Options => Options & Shared_Options, 116 Driver_Name => Driver_Name, 117 Options_2 => No_Argument_List); 118 Symbolic_Link_Needed := Lib_Version /= Lib_Path; 119 120 else 121 Utl.Gcc 122 (Output_File => Lib_Dir & Directory_Separator & Lib_Version, 123 Objects => Ofiles, 124 Options => Options & Shared_Options, 125 Driver_Name => Driver_Name, 126 Options_2 => No_Argument_List); 127 Symbolic_Link_Needed := 128 Lib_Dir & Directory_Separator & Lib_Version /= Lib_Path; 129 end if; 130 131 if Symbolic_Link_Needed then 132 Create_Sym_Links 133 (Lib_Path, Lib_Version, Lib_Dir, Maj_Version); 134 end if; 135 end; 136 end if; 137 end Build_Dynamic_Library; 138 139 ------------- 140 -- DLL_Ext -- 141 ------------- 142 143 function DLL_Ext return String is 144 begin 145 return "dylib"; 146 end DLL_Ext; 147 148 -------------------- 149 -- Dynamic_Option -- 150 -------------------- 151 152 function Dynamic_Option return String is 153 begin 154 return "-dynamiclib"; 155 end Dynamic_Option; 156 157 -------------------- 158 -- Is_Archive_Ext -- 159 -------------------- 160 161 function Is_Archive_Ext (Ext : String) return Boolean is 162 begin 163 return Ext = ".dylib" or else Ext = ".a"; 164 end Is_Archive_Ext; 165 166begin 167 Build_Dynamic_Library_Ptr := Build_Dynamic_Library'Access; 168 DLL_Ext_Ptr := DLL_Ext'Access; 169 Dynamic_Option_Ptr := Dynamic_Option'Access; 170 Is_Archive_Ext_Ptr := Is_Archive_Ext'Access; 171end MLib.Tgt.Specific; 172