1------------------------------------------------------------------------------ 2-- -- 3-- GNAT COMPILER COMPONENTS -- 4-- -- 5-- M L I B . T G T -- 6-- -- 7-- S p e c -- 8-- -- 9-- Copyright (C) 2001-2009, 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 26-- This package provides a set of target dependent routines to build static, 27-- dynamic and shared libraries. There are several packages providing 28-- the actual routines. This package calls them indirectly by means of 29-- access-to-subprogram values. Each target-dependent package initializes 30-- these values in its elaboration block. 31 32with Prj; use Prj; 33 34package MLib.Tgt is 35 36 function Support_For_Libraries return Library_Support; 37 -- Indicates how building libraries by gnatmake is supported by the GNAT 38 -- implementation for the platform. 39 40 function Standalone_Library_Auto_Init_Is_Supported return Boolean; 41 -- Indicates if when building a dynamic Standalone Library, 42 -- automatic initialization is supported. If it is, then it is the default, 43 -- unless attribute Library_Auto_Init has the value "false". 44 45 function Archive_Builder return String; 46 -- Returns the name of the archive builder program, usually "ar" 47 48 function Archive_Builder_Options return String_List_Access; 49 -- A list of options to invoke the Archive_Builder, usually "cr" for "ar" 50 51 function Archive_Builder_Append_Options return String_List_Access; 52 -- A list of options to use with the archive builder to append object 53 -- files ("q", for example). 54 55 function Archive_Indexer return String; 56 -- Returns the name of the program, if any, that generates an index to the 57 -- contents of an archive, usually "ranlib". If there is no archive indexer 58 -- to be used, returns an empty string. 59 60 function Archive_Indexer_Options return String_List_Access; 61 -- A list of options to invoke the Archive_Indexer, usually empty 62 63 function Dynamic_Option return String; 64 -- gcc option to create a dynamic library. 65 -- For Unix, returns "-shared", for Windows returns "-mdll". 66 67 function Libgnat return String; 68 -- System dependent static GNAT library 69 70 function Archive_Ext return String; 71 -- System dependent static library extension, without leading dot. 72 -- For Unix and Windows, return "a". 73 74 function Object_Ext return String; 75 -- System dependent object extension, without leading dot. 76 -- On Unix, returns "o". 77 78 function DLL_Prefix return String; 79 -- System dependent dynamic library prefix. 80 -- On Windows, returns "". On other platforms, returns "lib". 81 82 function DLL_Ext return String; 83 -- System dependent dynamic library extension, without leading dot. 84 -- On Windows, returns "dll". On Unix, usually returns "so", but not 85 -- always, e.g. on HP-UX the extension for shared libraries is "sl". 86 87 function PIC_Option return String; 88 -- Position independent code option 89 90 function Is_Object_Ext (Ext : String) return Boolean; 91 -- Returns True iff Ext is an object file extension 92 93 function Is_C_Ext (Ext : String) return Boolean; 94 -- Returns True iff Ext is a C file extension 95 96 function Is_Archive_Ext (Ext : String) return Boolean; 97 -- Returns True iff Ext is an extension for a library 98 99 function Default_Symbol_File_Name return String; 100 -- Returns the name of the symbol file when Library_Symbol_File is not 101 -- specified. Return the empty string when symbol files are not supported. 102 103 procedure Build_Dynamic_Library 104 (Ofiles : Argument_List; 105 Options : Argument_List; 106 Interfaces : Argument_List; 107 Lib_Filename : String; 108 Lib_Dir : String; 109 Symbol_Data : Symbol_Record; 110 Driver_Name : Name_Id := No_Name; 111 Lib_Version : String := ""; 112 Auto_Init : Boolean := False); 113 -- Build a dynamic/relocatable library 114 -- 115 -- Ofiles is the list of all object files in the library 116 -- 117 -- Options is a list of options to be passed to the tool 118 -- (gcc or other) that effectively builds the dynamic library. 119 -- 120 -- Interfaces is the list of ALI files for the interfaces of a SAL. 121 -- It is empty if the library is not a SAL. 122 -- 123 -- Lib_Filename is the name of the library, without any prefix or 124 -- extension. For example, on Unix, if Lib_Filename is "toto", the 125 -- name of the library file will be "libtoto.so". 126 -- 127 -- Lib_Dir is the directory path where the library will be located 128 -- 129 -- For OSes that support symbolic links, Lib_Version, if non null, 130 -- is the actual file name of the library. For example on Unix, if 131 -- Lib_Filename is "toto" and Lib_Version is "libtoto.so.2.1", 132 -- "libtoto.so" will be a symbolic link to "libtoto.so.2.1" which 133 -- will be the actual library file. 134 -- 135 -- Symbol_Data is used for some platforms, including VMS, to generate 136 -- the symbols to be exported by the library. 137 -- 138 -- Note: Depending on the OS, some of the parameters may not be taken into 139 -- account. For example, on Linux, Interfaces, Symbol_Data and Auto_Init 140 -- are ignored. 141 142 function Library_Exists_For 143 (Project : Project_Id; 144 In_Tree : Project_Tree_Ref) return Boolean; 145 -- Return True if the library file for a library project already exists. 146 -- This function can only be called for library projects. 147 148 function Library_File_Name_For 149 (Project : Project_Id; 150 In_Tree : Project_Tree_Ref) return File_Name_Type; 151 -- Returns the file name of the library file of a library project. 152 -- This function can only be called for library projects. 153 154 function Library_Major_Minor_Id_Supported return Boolean; 155 -- Indicates if major and minor ids are supported for libraries. 156 -- If they are supported, then a Library_Version such as libtoto.so.1.2 157 -- will have a major id of 1 and a minor id of 2. Then libtoto.so, 158 -- libtoto.so.1 and libtoto.so.1.2 will be created, all three designating 159 -- the same file. 160 161private 162 No_Argument_List : constant Argument_List := (1 .. 0 => null); 163 164 -- Access to subprogram types for indirection 165 166 type String_Function is access function return String; 167 type Is_Ext_Function is access function (Ext : String) return Boolean; 168 type String_List_Access_Function is access function 169 return String_List_Access; 170 171 type Build_Dynamic_Library_Function is access procedure 172 (Ofiles : Argument_List; 173 Options : Argument_List; 174 Interfaces : Argument_List; 175 Lib_Filename : String; 176 Lib_Dir : String; 177 Symbol_Data : Symbol_Record; 178 Driver_Name : Name_Id := No_Name; 179 Lib_Version : String := ""; 180 Auto_Init : Boolean := False); 181 182 type Library_Exists_For_Function is access function 183 (Project : Project_Id; 184 In_Tree : Project_Tree_Ref) return Boolean; 185 186 type Library_File_Name_For_Function is access function 187 (Project : Project_Id; 188 In_Tree : Project_Tree_Ref) return File_Name_Type; 189 190 type Boolean_Function is access function return Boolean; 191 type Library_Support_Function is access function return Library_Support; 192 193 function Archive_Builder_Default return String; 194 Archive_Builder_Ptr : String_Function := Archive_Builder_Default'Access; 195 196 function Archive_Builder_Options_Default return String_List_Access; 197 Archive_Builder_Options_Ptr : String_List_Access_Function := 198 Archive_Builder_Options_Default'Access; 199 200 function Archive_Builder_Append_Options_Default return String_List_Access; 201 Archive_Builder_Append_Options_Ptr : String_List_Access_Function := 202 Archive_Builder_Append_Options_Default'Access; 203 204 function Archive_Ext_Default return String; 205 Archive_Ext_Ptr : String_Function := Archive_Ext_Default'Access; 206 207 function Archive_Indexer_Default return String; 208 Archive_Indexer_Ptr : String_Function := Archive_Indexer_Default'Access; 209 210 function Archive_Indexer_Options_Default return String_List_Access; 211 Archive_Indexer_Options_Ptr : String_List_Access_Function := 212 Archive_Indexer_Options_Default'Access; 213 214 function Default_Symbol_File_Name_Default return String; 215 Default_Symbol_File_Name_Ptr : String_Function := 216 Default_Symbol_File_Name_Default'Access; 217 218 Build_Dynamic_Library_Ptr : Build_Dynamic_Library_Function; 219 220 function DLL_Ext_Default return String; 221 DLL_Ext_Ptr : String_Function := DLL_Ext_Default'Access; 222 223 function DLL_Prefix_Default return String; 224 DLL_Prefix_Ptr : String_Function := DLL_Prefix_Default'Access; 225 226 function Dynamic_Option_Default return String; 227 Dynamic_Option_Ptr : String_Function := Dynamic_Option_Default'Access; 228 229 function Is_Object_Ext_Default (Ext : String) return Boolean; 230 Is_Object_Ext_Ptr : Is_Ext_Function := Is_Object_Ext_Default'Access; 231 232 function Is_C_Ext_Default (Ext : String) return Boolean; 233 Is_C_Ext_Ptr : Is_Ext_Function := Is_C_Ext_Default'Access; 234 235 function Is_Archive_Ext_Default (Ext : String) return Boolean; 236 Is_Archive_Ext_Ptr : Is_Ext_Function := Is_Archive_Ext_Default'Access; 237 238 function Libgnat_Default return String; 239 Libgnat_Ptr : String_Function := Libgnat_Default'Access; 240 241 function Library_Exists_For_Default 242 (Project : Project_Id; 243 In_Tree : Project_Tree_Ref) return Boolean; 244 Library_Exists_For_Ptr : Library_Exists_For_Function := 245 Library_Exists_For_Default'Access; 246 247 function Library_File_Name_For_Default 248 (Project : Project_Id; 249 In_Tree : Project_Tree_Ref) return File_Name_Type; 250 Library_File_Name_For_Ptr : Library_File_Name_For_Function := 251 Library_File_Name_For_Default'Access; 252 253 function Object_Ext_Default return String; 254 Object_Ext_Ptr : String_Function := Object_Ext_Default'Access; 255 256 function PIC_Option_Default return String; 257 PIC_Option_Ptr : String_Function := PIC_Option_Default'Access; 258 259 function Standalone_Library_Auto_Init_Is_Supported_Default return Boolean; 260 Standalone_Library_Auto_Init_Is_Supported_Ptr : Boolean_Function := 261 Standalone_Library_Auto_Init_Is_Supported_Default'Access; 262 263 function Support_For_Libraries_Default return Library_Support; 264 Support_For_Libraries_Ptr : Library_Support_Function := 265 Support_For_Libraries_Default'Access; 266 267 function Library_Major_Minor_Id_Supported_Default return Boolean; 268 Library_Major_Minor_Id_Supported_Ptr : Boolean_Function := 269 Library_Major_Minor_Id_Supported_Default'Access; 270end MLib.Tgt; 271