]>
Commit | Line | Data |
---|---|---|
38cbfe40 RK |
1 | ------------------------------------------------------------------------------ |
2 | -- -- | |
3 | -- GNAT COMPILER COMPONENTS -- | |
4 | -- -- | |
5 | -- O S I N T -- | |
6 | -- -- | |
7 | -- S p e c -- | |
8 | -- -- | |
1d005acc | 9 | -- Copyright (C) 1992-2019, Free Software Foundation, Inc. -- |
38cbfe40 RK |
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- -- | |
b5c84c3c | 13 | -- ware Foundation; either version 3, or (at your option) any later ver- -- |
38cbfe40 RK |
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 -- | |
b5c84c3c RD |
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. -- | |
38cbfe40 RK |
20 | -- -- |
21 | -- GNAT was originally developed by the GNAT team at New York University. -- | |
71ff80dc | 22 | -- Extensive contributions were provided by Ada Core Technologies Inc. -- |
38cbfe40 RK |
23 | -- -- |
24 | ------------------------------------------------------------------------------ | |
25 | ||
4ecc031c RD |
26 | -- This package contains the low level, operating system routines used in the |
27 | -- compiler and binder for command line processing and file input output. | |
38cbfe40 | 28 | |
39f4e199 VC |
29 | with Namet; use Namet; |
30 | with Types; use Types; | |
38cbfe40 | 31 | |
d56e7acd | 32 | with System; use System; |
9e9df9da AC |
33 | |
34 | pragma Warnings (Off); | |
35 | -- This package is used also by gnatcoll | |
fa5aa835 | 36 | with System.OS_Lib; use System.OS_Lib; |
9e9df9da AC |
37 | pragma Warnings (On); |
38 | ||
fa5aa835 | 39 | with System.Storage_Elements; |
39f4e199 VC |
40 | |
41 | pragma Elaborate_All (System.OS_Lib); | |
87ace727 | 42 | -- For the call to function Get_Target_Object_Suffix in the private part |
38cbfe40 | 43 | |
07fc65c4 | 44 | package Osint is |
38cbfe40 | 45 | |
7a5b62b0 | 46 | Multi_Unit_Index_Character : constant Character := '~'; |
fa5aa835 | 47 | -- The character before the index of the unit in a multi-unit source in ALI |
7a5b62b0 | 48 | -- and object file names. |
6b6fcd3e | 49 | |
fbf5a39b AC |
50 | Ada_Include_Path : constant String := "ADA_INCLUDE_PATH"; |
51 | Ada_Objects_Path : constant String := "ADA_OBJECTS_PATH"; | |
52 | Project_Include_Path_File : constant String := "ADA_PRJ_INCLUDE_FILE"; | |
53 | Project_Objects_Path_File : constant String := "ADA_PRJ_OBJECTS_FILE"; | |
54 | ||
ed05b790 RD |
55 | Output_FD : File_Descriptor; |
56 | -- File descriptor for current library info, list, tree, C, H, or binder | |
57 | -- output. Only one of these is open at a time, so we need only one FD. | |
58 | ||
64989f18 DA |
59 | On_Windows : constant Boolean := Directory_Separator = '\'; |
60 | -- True when on Windows | |
61 | ||
fbf5a39b AC |
62 | procedure Initialize; |
63 | -- Initialize internal tables | |
64 | ||
38cbfe40 RK |
65 | function Normalize_Directory_Name (Directory : String) return String_Ptr; |
66 | -- Verify and normalize a directory name. If directory name is invalid, | |
67 | -- this will return an empty string. Otherwise it will insure a trailing | |
68 | -- slash and make other normalizations. | |
69 | ||
fbf5a39b | 70 | type File_Type is (Source, Library, Config, Definition, Preprocessing_Data); |
38cbfe40 RK |
71 | |
72 | function Find_File | |
3ccedacc AC |
73 | (N : File_Name_Type; |
74 | T : File_Type; | |
75 | Full_Name : Boolean := False) return File_Name_Type; | |
4ecc031c RD |
76 | -- Finds a source, library or config file depending on the value of T |
77 | -- following the directory search order rules unless N is the name of the | |
dec55d76 | 78 | -- file just read with Next_Main_File and already contains directory |
4ecc031c RD |
79 | -- information, in which case just look in the Primary_Directory. Returns |
80 | -- File_Name_Type of the full file name if found, No_File if file not | |
81 | -- found. Note that for the special case of gnat.adc, only the compilation | |
82 | -- environment directory is searched, i.e. the directory where the ali and | |
83 | -- object files are written. Another special case is Debug_Generated_Code | |
db318f46 | 84 | -- set and the file name ends in ".dg", in which case we look for the |
4ecc031c RD |
85 | -- generated file only in the current directory, since that is where it is |
86 | -- always built. | |
4ff2b6dc | 87 | -- |
3ccedacc AC |
88 | -- In the case of configuration files, full path names are needed for some |
89 | -- ASIS queries. The flag Full_Name indicates that the name of the file | |
90 | -- should be normalized to include a full path. | |
38cbfe40 RK |
91 | |
92 | function Get_File_Names_Case_Sensitive return Int; | |
93 | pragma Import (C, Get_File_Names_Case_Sensitive, | |
07fc65c4 | 94 | "__gnat_get_file_names_case_sensitive"); |
38cbfe40 | 95 | File_Names_Case_Sensitive : constant Boolean := |
07fc65c4 | 96 | Get_File_Names_Case_Sensitive /= 0; |
38cbfe40 RK |
97 | -- Set to indicate whether the operating system convention is for file |
98 | -- names to be case sensitive (e.g., in Unix, set True), or non case | |
ea7f928b | 99 | -- sensitive (e.g., in Windows, set False). |
38cbfe40 RK |
100 | |
101 | procedure Canonical_Case_File_Name (S : in out String); | |
102 | -- Given a file name, converts it to canonical case form. For systems | |
103 | -- where file names are case sensitive, this procedure has no effect. | |
104 | -- If file names are not case sensitive (i.e. for example if you have | |
105 | -- the file "xyz.adb", you can refer to it as XYZ.adb or XyZ.AdB), then | |
106 | -- this call converts the given string to canonical all lower case form, | |
107 | -- so that two file names compare equal if they refer to the same file. | |
108 | ||
0e35524d VC |
109 | function Get_Env_Vars_Case_Sensitive return Int; |
110 | pragma Import (C, Get_Env_Vars_Case_Sensitive, | |
111 | "__gnat_get_env_vars_case_sensitive"); | |
112 | Env_Vars_Case_Sensitive : constant Boolean := | |
a8930b80 | 113 | Get_Env_Vars_Case_Sensitive /= 0; |
0e35524d VC |
114 | -- Set to indicate whether the operating system convention is for |
115 | -- environment variable names to be case sensitive (e.g., in Unix, set | |
116 | -- True), or non case sensitive (e.g., in Windows, set False). | |
117 | ||
118 | procedure Canonical_Case_Env_Var_Name (S : in out String); | |
119 | -- Given an environment variable name, converts it to canonical case form. | |
120 | -- For systems where environment variable names are case sensitive, this | |
121 | -- procedure has no effect. If environment variable names are not case | |
122 | -- sensitive, then this call converts the given string to canonical all | |
123 | -- lower case form, so that two environment variable names compare equal if | |
124 | -- they refer to the same environment variable. | |
125 | ||
16e764a7 | 126 | function Number_Of_Files return Nat; |
9de61fcb | 127 | -- Gives the total number of filenames found on the command line |
38cbfe40 | 128 | |
aa720a54 | 129 | No_Index : constant := -1; |
9de61fcb | 130 | -- Value used in Add_File to indicate no index is specified for main |
aa720a54 AC |
131 | |
132 | procedure Add_File (File_Name : String; Index : Int := No_Index); | |
9de61fcb RD |
133 | -- Called by the subprogram processing the command line for each file name |
134 | -- found. The index, when not defaulted to No_Index is the index of the | |
135 | -- subprogram in its source, zero indicating that the source is not | |
136 | -- multi-unit. | |
38cbfe40 | 137 | |
38cbfe40 RK |
138 | procedure Find_Program_Name; |
139 | -- Put simple name of current program being run (excluding the directory | |
140 | -- path) in Name_Buffer, with the length in Name_Len. | |
141 | ||
686b7752 | 142 | function Program_Name (Nam : String; Prog : String) return String_Access; |
9de61fcb RD |
143 | -- In the native compilation case, Create a string containing Nam. In the |
144 | -- cross compilation case, looks at the prefix of the current program being | |
145 | -- run and prepend it to Nam. For instance if the program being run is | |
146 | -- <target>-gnatmake and Nam is "gcc", the returned value will be a pointer | |
c4dec83f JR |
147 | -- to "<target>-gcc". In the specific case where AAMP_On_Target is set, the |
148 | -- name "gcc" is mapped to "gnaamp", and names of the form "gnat*" are | |
149 | -- mapped to "gnaamp*". This function clobbers Name_Buffer and Name_Len. | |
88462e81 RD |
150 | -- Also look at any suffix, e.g. gnatmake-4.1 -> "gcc-4.1". Prog is the |
151 | -- default name of the current program being executed, e.g. "gnatmake", | |
152 | -- "gnatlink". | |
38cbfe40 RK |
153 | |
154 | procedure Write_Program_Name; | |
88462e81 RD |
155 | -- Writes name of program as invoked to the current output (normally |
156 | -- standard output). | |
38cbfe40 | 157 | |
3dd9959c | 158 | procedure Fail (S : String); |
07fc65c4 | 159 | pragma No_Return (Fail); |
3dd9959c AC |
160 | -- Outputs error message S preceded by the name of the executing program |
161 | -- and exits with E_Fatal. The output goes to standard error, except if | |
162 | -- special output is in effect (see Output). | |
38cbfe40 RK |
163 | |
164 | function Is_Directory_Separator (C : Character) return Boolean; | |
165 | -- Returns True if C is a directory separator | |
166 | ||
167 | function Get_Directory (Name : File_Name_Type) return File_Name_Type; | |
168 | -- Get the prefix directory name (if any) from Name. The last separator | |
07fc65c4 GB |
169 | -- is preserved. Return the normalized current directory if there is no |
170 | -- directory part in the name. | |
38cbfe40 RK |
171 | |
172 | function Is_Readonly_Library (File : File_Name_Type) return Boolean; | |
9de61fcb | 173 | -- Check if this library file is a read-only file |
38cbfe40 RK |
174 | |
175 | function Strip_Directory (Name : File_Name_Type) return File_Name_Type; | |
176 | -- Strips the prefix directory name (if any) from Name. Returns the | |
07fc65c4 | 177 | -- stripped name. Name cannot end with a directory separator. |
38cbfe40 RK |
178 | |
179 | function Strip_Suffix (Name : File_Name_Type) return File_Name_Type; | |
07fc65c4 | 180 | -- Strips the suffix (the last '.' and whatever comes after it) from Name. |
38cbfe40 RK |
181 | -- Returns the stripped name. |
182 | ||
82878151 AC |
183 | function Executable_Name |
184 | (Name : File_Name_Type; | |
185 | Only_If_No_Suffix : Boolean := False) return File_Name_Type; | |
38cbfe40 RK |
186 | -- Given a file name it adds the appropriate suffix at the end so that |
187 | -- it becomes the name of the executable on the system at end. For | |
188 | -- instance under DOS it adds the ".exe" suffix, whereas under UNIX no | |
189 | -- suffix is added. | |
190 | ||
82878151 AC |
191 | function Executable_Name |
192 | (Name : String; | |
193 | Only_If_No_Suffix : Boolean := False) return String; | |
4ecc031c RD |
194 | -- Same as above, with String parameters |
195 | ||
38cbfe40 | 196 | function File_Stamp (Name : File_Name_Type) return Time_Stamp_Type; |
39f4e199 VC |
197 | -- Returns the time stamp of file Name. Name should include relative path |
198 | -- information in order to locate it. If the source file cannot be opened, | |
199 | -- or Name = No_File, and all blank time stamp is returned (this is not an | |
200 | -- error situation). | |
201 | ||
202 | function File_Stamp (Name : Path_Name_Type) return Time_Stamp_Type; | |
203 | -- Same as above for a path name | |
38cbfe40 | 204 | |
38cbfe40 | 205 | type String_Access_List is array (Positive range <>) of String_Access; |
dec55d76 | 206 | -- Dereferenced type used to return a list of file specs in |
38cbfe40 RK |
207 | -- To_Canonical_File_List. |
208 | ||
209 | type String_Access_List_Access is access all String_Access_List; | |
07fc65c4 | 210 | -- Type used to return a String_Access_List without dragging in secondary |
38cbfe40 RK |
211 | -- stack. |
212 | ||
213 | function To_Canonical_File_List | |
07fc65c4 | 214 | (Wildcard_Host_File : String; |
18c0ecbe | 215 | Only_Dirs : Boolean) return String_Access_List_Access; |
7a5b62b0 AC |
216 | -- Expand a wildcard host syntax file or directory specification and return |
217 | -- a list of valid Unix syntax file or directory specs. If Only_Dirs is | |
218 | -- True, then only return directories. | |
38cbfe40 | 219 | |
38cbfe40 RK |
220 | function To_Host_Dir_Spec |
221 | (Canonical_Dir : String; | |
18c0ecbe | 222 | Prefix_Style : Boolean) return String_Access; |
196b1993 AC |
223 | -- Convert a canonical syntax directory specification to host syntax. The |
224 | -- Prefix_Style flag is currently ignored but should be set to False. | |
225 | -- Note that the caller must free result. | |
38cbfe40 RK |
226 | |
227 | function To_Host_File_Spec | |
18c0ecbe | 228 | (Canonical_File : String) return String_Access; |
9de61fcb | 229 | -- Convert a canonical syntax file specification to host syntax |
38cbfe40 | 230 | |
2cdc8909 AC |
231 | function Relocate_Path |
232 | (Prefix : String; | |
233 | Path : String) return String_Ptr; | |
234 | -- Given an absolute path and a prefix, if Path starts with Prefix, | |
235 | -- replace the Prefix substring with the root installation directory. | |
236 | -- By default, try to compute the root installation directory by looking | |
237 | -- at the executable name as it was typed on the command line and, if | |
18c0ecbe AC |
238 | -- needed, use the PATH environment variable. If the above computation |
239 | -- fails, return Path. This function assumes Prefix'First = Path'First. | |
2cdc8909 | 240 | |
91b1417d AC |
241 | function Shared_Lib (Name : String) return String; |
242 | -- Returns the runtime shared library in the form -l<name>-<version> where | |
243 | -- version is the GNAT runtime library option for the platform. For example | |
244 | -- this routine called with Name set to "gnat" will return "-lgnat-5.02" | |
7a5b62b0 | 245 | -- on UNIX and Windows. |
91b1417d | 246 | |
48263c9a EB |
247 | --------------------- |
248 | -- File attributes -- | |
249 | --------------------- | |
d56e7acd | 250 | |
48263c9a EB |
251 | -- The following subprograms offer services similar to those found in |
252 | -- System.OS_Lib, but with the ability to extra multiple information from | |
253 | -- a single system call, depending on the system. This can result in fewer | |
254 | -- system calls when reused. | |
d56e7acd | 255 | |
48263c9a EB |
256 | -- In all these subprograms, the requested value is either read from the |
257 | -- File_Attributes parameter (resulting in no system call), or computed | |
258 | -- from the disk and then cached in the File_Attributes parameter (possibly | |
259 | -- along with other values). | |
260 | ||
f70b0116 AC |
261 | File_Attributes_Size : constant Natural := 32; |
262 | -- This should be big enough to fit a "struct file_attributes" on any | |
263 | -- system. It doesn't cause any malfunction if it is too big (which avoids | |
264 | -- the need for either mapping the struct exactly or importing the sizeof | |
265 | -- from C, which would result in dynamic code). However, it does waste | |
266 | -- space (e.g. when a component of this type appears in a record, if it is | |
267 | -- unnecessarily large). Note: for runtime units, use System.OS_Constants. | |
268 | -- SIZEOF_struct_file_attributes instead, which has the exact value. | |
269 | ||
270 | type File_Attributes is | |
271 | array (1 .. File_Attributes_Size) | |
272 | of System.Storage_Elements.Storage_Element; | |
273 | for File_Attributes'Alignment use Standard'Maximum_Alignment; | |
274 | ||
275 | Unknown_Attributes : File_Attributes; | |
48263c9a | 276 | -- A cache for various attributes for a file (length, accessibility,...) |
f70b0116 AC |
277 | -- Will be initialized properly at elaboration (for efficiency later on, |
278 | -- avoid function calls every time we want to reset the attributes) prior | |
279 | -- to the first usage. We cannot make it constant since the compiler may | |
280 | -- put it in a read-only section. | |
48263c9a EB |
281 | |
282 | function Is_Directory | |
d56e7acd AC |
283 | (Name : C_File_Name; |
284 | Attr : access File_Attributes) return Boolean; | |
48263c9a | 285 | function Is_Regular_File |
d56e7acd AC |
286 | (Name : C_File_Name; |
287 | Attr : access File_Attributes) return Boolean; | |
48263c9a | 288 | function Is_Symbolic_Link |
d56e7acd AC |
289 | (Name : C_File_Name; |
290 | Attr : access File_Attributes) return Boolean; | |
48263c9a EB |
291 | -- Return the type of the file, |
292 | ||
293 | function File_Length | |
d56e7acd AC |
294 | (Name : C_File_Name; |
295 | Attr : access File_Attributes) return Long_Integer; | |
48263c9a EB |
296 | -- Return the length (number of bytes) of the file |
297 | ||
298 | function File_Time_Stamp | |
d56e7acd AC |
299 | (Name : C_File_Name; |
300 | Attr : access File_Attributes) return OS_Time; | |
cca5ded0 AC |
301 | function File_Time_Stamp |
302 | (Name : Path_Name_Type; | |
303 | Attr : access File_Attributes) return Time_Stamp_Type; | |
48263c9a EB |
304 | -- Return the time stamp of the file |
305 | ||
306 | function Is_Readable_File | |
d56e7acd AC |
307 | (Name : C_File_Name; |
308 | Attr : access File_Attributes) return Boolean; | |
48263c9a | 309 | function Is_Executable_File |
d56e7acd AC |
310 | (Name : C_File_Name; |
311 | Attr : access File_Attributes) return Boolean; | |
48263c9a | 312 | function Is_Writable_File |
d56e7acd AC |
313 | (Name : C_File_Name; |
314 | Attr : access File_Attributes) return Boolean; | |
48263c9a EB |
315 | -- Return the access rights for the file |
316 | ||
38cbfe40 RK |
317 | ------------------------- |
318 | -- Search Dir Routines -- | |
319 | ------------------------- | |
320 | ||
65356e64 AC |
321 | function Include_Dir_Default_Prefix return String; |
322 | -- Return the directory of the run-time library sources, as modified | |
323 | -- by update_path. | |
324 | ||
325 | function Object_Dir_Default_Prefix return String; | |
326 | -- Return the directory of the run-time library ALI and object files, as | |
327 | -- modified by update_path. | |
328 | ||
38cbfe40 | 329 | procedure Add_Default_Search_Dirs; |
88462e81 | 330 | -- This routine adds the default search dirs indicated by the environment |
36504e5f AC |
331 | -- variables and sdefault package, as well as the library search dirs set |
332 | -- by option -gnateO for GNAT2WHY. | |
38cbfe40 RK |
333 | |
334 | procedure Add_Lib_Search_Dir (Dir : String); | |
335 | -- Add Dir at the end of the library file search path | |
336 | ||
337 | procedure Add_Src_Search_Dir (Dir : String); | |
338 | -- Add Dir at the end of the source file search path | |
339 | ||
340 | procedure Get_Next_Dir_In_Path_Init | |
341 | (Search_Path : String_Access); | |
2820d220 | 342 | function Get_Next_Dir_In_Path |
18c0ecbe | 343 | (Search_Path : String_Access) return String_Access; |
88462e81 RD |
344 | -- These subprograms are used to parse out the directory names in a search |
345 | -- path specified by a Search_Path argument. The procedure initializes an | |
346 | -- internal pointer to point to the initial directory name, and calls to | |
347 | -- the function return successive directory names, with a null pointer | |
348 | -- marking the end of the list. | |
38cbfe40 | 349 | |
07fc65c4 GB |
350 | type Search_File_Type is (Include, Objects); |
351 | ||
352 | procedure Add_Search_Dirs | |
353 | (Search_Path : String_Ptr; | |
354 | Path_Type : Search_File_Type); | |
355 | -- These procedure adds all the search directories that are in Search_Path | |
356 | -- in the proper file search path (library or source) | |
357 | ||
38cbfe40 RK |
358 | function Get_Primary_Src_Search_Directory return String_Ptr; |
359 | -- Retrieved the primary directory (directory containing the main source | |
07fc65c4 | 360 | -- file for Gnatmake. |
38cbfe40 RK |
361 | |
362 | function Nb_Dir_In_Src_Search_Path return Natural; | |
363 | function Dir_In_Src_Search_Path (Position : Natural) return String_Ptr; | |
364 | -- Functions to access the directory names in the source search path | |
365 | ||
366 | function Nb_Dir_In_Obj_Search_Path return Natural; | |
367 | function Dir_In_Obj_Search_Path (Position : Natural) return String_Ptr; | |
368 | -- Functions to access the directory names in the Object search path | |
369 | ||
07fc65c4 GB |
370 | Include_Search_File : constant String_Access := |
371 | new String'("ada_source_path"); | |
372 | Objects_Search_File : constant String_Access := | |
373 | new String'("ada_object_path"); | |
dec55d76 | 374 | -- Names of the files containing the default include or objects search |
07fc65c4 GB |
375 | -- directories. These files, located in Sdefault.Search_Dir_Prefix, do |
376 | -- not necessarily exist. | |
38cbfe40 | 377 | |
2820d220 AC |
378 | Exec_Name : String_Ptr; |
379 | -- Executable name as typed by the user (used to compute the | |
380 | -- executable prefix). | |
381 | ||
38cbfe40 | 382 | function Read_Default_Search_Dirs |
07fc65c4 GB |
383 | (Search_Dir_Prefix : String_Access; |
384 | Search_File : String_Access; | |
2820d220 | 385 | Search_Dir_Default_Name : String_Access) return String_Access; |
38cbfe40 RK |
386 | -- Read and return the default search directories from the file located |
387 | -- in Search_Dir_Prefix (as modified by update_path) and named Search_File. | |
388 | -- If no such file exists or an error occurs then instead return the | |
389 | -- Search_Dir_Default_Name (as modified by update_path). | |
390 | ||
07fc65c4 GB |
391 | function Get_RTS_Search_Dir |
392 | (Search_Dir : String; | |
18c0ecbe | 393 | File_Type : Search_File_Type) return String_Ptr; |
07fc65c4 GB |
394 | -- This function retrieves the paths to the search (resp. lib) dirs and |
395 | -- return them. The search dir can be absolute or relative. If the search | |
396 | -- dir contains Include_Search_File (resp. Object_Search_File), then this | |
397 | -- function reads and returns the default search directories from the file. | |
398 | -- Otherwise, if the directory is absolute, it will try to find 'adalib' | |
399 | -- (resp. 'adainclude'). If found, null is returned. If the directory is | |
400 | -- relative, the following directories for the directories 'adalib' and | |
401 | -- 'adainclude' will be scanned: | |
402 | -- | |
403 | -- - current directory (from which the tool has been spawned) | |
404 | -- - $GNAT_ROOT/gcc/gcc-lib/$targ/$vers/ | |
405 | -- - $GNAT_ROOT/gcc/gcc-lib/$targ/$vers/rts- | |
406 | -- | |
407 | -- The scan will stop as soon as the directory being searched for (adalib | |
408 | -- or adainclude) is found. If the scan fails, null is returned. | |
409 | ||
38cbfe40 RK |
410 | ----------------------- |
411 | -- Source File Input -- | |
412 | ----------------------- | |
413 | ||
414 | -- Source file input routines are used by the compiler to read the main | |
415 | -- source files and the subsidiary source files (e.g. with'ed units), and | |
416 | -- also by the binder to check presence/time stamps of sources. | |
417 | ||
38cbfe40 RK |
418 | procedure Read_Source_File |
419 | (N : File_Name_Type; | |
420 | Lo : Source_Ptr; | |
421 | Hi : out Source_Ptr; | |
422 | Src : out Source_Buffer_Ptr; | |
cd644ae2 | 423 | FD : out File_Descriptor; |
38cbfe40 RK |
424 | T : File_Type := Source); |
425 | -- Allocates a Source_Buffer of appropriate length and then reads the | |
426 | -- entire contents of the source file N into the buffer. The address of | |
f192ca5e PMR |
427 | -- the allocated buffer is returned in Src. FD is used for extended error |
428 | -- information in the case the read fails. | |
38cbfe40 RK |
429 | -- |
430 | -- Each line of text is terminated by one of the sequences: | |
431 | -- | |
432 | -- CR | |
433 | -- CR/LF | |
38cbfe40 RK |
434 | -- LF |
435 | ||
88462e81 RD |
436 | -- The source is terminated by an EOF (16#1A#) character, which is the last |
437 | -- character of the returned source buffer (note that any EOF characters in | |
438 | -- positions other than the last source character are treated as blanks). | |
38cbfe40 RK |
439 | -- |
440 | -- The logical lower bound of the source buffer is the input value of Lo, | |
211e7410 AC |
441 | -- and on exit Hi is set to the logical upper bound of the source buffer, |
442 | -- which is redundant with Src'Last. | |
38cbfe40 RK |
443 | -- |
444 | -- If the given file cannot be opened, then the action depends on whether | |
445 | -- this file is the current main unit (i.e. its name matches the name | |
446 | -- returned by the most recent call to Next_Main_Source). If so, then the | |
447 | -- failure to find the file is a fatal error, an error message is output, | |
448 | -- and program execution is terminated. Otherwise (for the case of a | |
449 | -- subsidiary source loaded directly or indirectly using with), a file | |
f192ca5e PMR |
450 | -- not found condition causes null to be set as the result value and a |
451 | -- value of No_Source_File (0) to be set as the FD value. In the related | |
452 | -- case of a file with no read permissions the result is the same except FD | |
453 | -- is set to No_Access_To_Source_File (-1). Upon success FD is set to a | |
454 | -- positive Source_File_Index. | |
38cbfe40 RK |
455 | -- |
456 | -- Note that the name passed to this function is the simple file name, | |
457 | -- without any directory information. The implementation is responsible | |
458 | -- for searching for the file in the appropriate directories. | |
459 | -- | |
e23fbee4 RD |
460 | -- Note the special case that if the file name is gnat.adc, then the search |
461 | -- for the file is done ONLY in the directory corresponding to the current | |
462 | -- compilation environment, i.e. in the same directory where the ali and | |
463 | -- object files will be written. | |
38cbfe40 RK |
464 | |
465 | function Full_Source_Name return File_Name_Type; | |
466 | function Current_Source_File_Stamp return Time_Stamp_Type; | |
467 | -- Returns the full name/time stamp of the source file most recently read | |
468 | -- using Read_Source_File. Calling this routine entails no source file | |
469 | -- directory lookup penalty. | |
470 | ||
48263c9a EB |
471 | procedure Full_Source_Name |
472 | (N : File_Name_Type; | |
473 | Full_File : out File_Name_Type; | |
474 | Attr : access File_Attributes); | |
38cbfe40 RK |
475 | function Full_Source_Name (N : File_Name_Type) return File_Name_Type; |
476 | function Source_File_Stamp (N : File_Name_Type) return Time_Stamp_Type; | |
39f4e199 VC |
477 | -- Returns the full name/time stamp of the source file whose simple name |
478 | -- is N which should not include path information. Note that if the file | |
4ecc031c RD |
479 | -- cannot be located No_File is returned for the first routine and an all |
480 | -- blank time stamp is returned for the second (this is not an error | |
481 | -- situation). The full name includes appropriate directory information. | |
482 | -- The source file directory lookup penalty is incurred every single time | |
483 | -- the routines are called unless you have previously called | |
484 | -- Source_File_Data (Cache => True). See below. | |
d56e7acd | 485 | -- |
48263c9a EB |
486 | -- The procedural version also returns some file attributes for the ALI |
487 | -- file (to save on system calls later on). | |
38cbfe40 | 488 | |
aa720a54 AC |
489 | function Current_File_Index return Int; |
490 | -- Return the index in its source file of the current main unit | |
491 | ||
38cbfe40 | 492 | function Matching_Full_Source_Name |
18c0ecbe AC |
493 | (N : File_Name_Type; |
494 | T : Time_Stamp_Type) return File_Name_Type; | |
4ecc031c RD |
495 | -- Same semantics than Full_Source_Name but will search on the source path |
496 | -- until a source file with time stamp matching T is found. If none is | |
497 | -- found returns No_File. | |
38cbfe40 RK |
498 | |
499 | procedure Source_File_Data (Cache : Boolean); | |
500 | -- By default source file data (full source file name and time stamp) | |
501 | -- are looked up every time a call to Full_Source_Name (N) or | |
502 | -- Source_File_Stamp (N) is made. This may be undesirable in certain | |
503 | -- applications as this is uselessly slow if source file data does not | |
504 | -- change during program execution. When this procedure is called with | |
dec55d76 | 505 | -- Cache => True access to source file data does not incur a penalty if |
38cbfe40 RK |
506 | -- this data was previously retrieved. |
507 | ||
3743d5bd AC |
508 | procedure Dump_Source_File_Names; |
509 | -- Prints out the names of all source files that have been read by | |
510 | -- Read_Source_File, except those that come from the run-time library | |
511 | -- (i.e. Include_Dir_Default_Prefix). The text is sent to whatever Output | |
512 | -- is currently using (e.g. standard output or standard error). | |
513 | ||
5fc26697 YM |
514 | procedure Dump_Command_Line_Source_File_Names; |
515 | -- Prints out the names of all source files on the command-line | |
516 | ||
10aea826 JK |
517 | function Get_First_Main_File_Name return String; |
518 | -- Return the file name of the first main file | |
519 | ||
38cbfe40 RK |
520 | ------------------------------------------- |
521 | -- Representation of Library Information -- | |
522 | ------------------------------------------- | |
523 | ||
d56e7acd AC |
524 | -- Associated with each compiled source file is library information, a |
525 | -- string of bytes whose exact format is described in the body of Lib.Writ. | |
526 | -- Compiling a source file generates this library information for the | |
527 | -- compiled unit, and access the library information for units that were | |
528 | -- compiled previously on which the unit being compiled depends. | |
38cbfe40 RK |
529 | |
530 | -- How this information is stored is up to the implementation of this | |
531 | -- package. At the interface level, this information is simply associated | |
532 | -- with its corresponding source. | |
533 | ||
534 | -- Several different implementations are possible: | |
535 | ||
536 | -- 1. The information could be directly associated with the source file, | |
537 | -- e.g. placed in a resource fork of this file on the Mac, or on | |
538 | -- MS-DOS, written to the source file after the end of file mark. | |
539 | ||
540 | -- 2. The information could be written into the generated object module | |
541 | -- if the system supports the inclusion of arbitrary informational | |
542 | -- byte streams into object files. In this case there must be a naming | |
543 | -- convention that allows object files to be located given the name of | |
544 | -- the corresponding source file. | |
545 | ||
546 | -- 3. The information could be written to a separate file, whose name is | |
547 | -- related to the name of the source file by a fixed convention. | |
548 | ||
638e383e | 549 | -- Which of these three methods is chosen depends on the constraints of the |
38cbfe40 | 550 | -- host operating system. The interface described here is independent of |
4ecc031c RD |
551 | -- which of these approaches is used. Currently all versions of GNAT use |
552 | -- the third approach with a file name of xxx.ali where xxx is the source | |
553 | -- file name. | |
38cbfe40 RK |
554 | |
555 | ------------------------------- | |
556 | -- Library Information Input -- | |
557 | ------------------------------- | |
558 | ||
559 | -- These subprograms are used by the binder to read library information | |
560 | -- files, see section above for representation of these files. | |
561 | ||
38cbfe40 RK |
562 | function Read_Library_Info |
563 | (Lib_File : File_Name_Type; | |
18c0ecbe | 564 | Fatal_Err : Boolean := False) return Text_Buffer_Ptr; |
38cbfe40 RK |
565 | -- Allocates a Text_Buffer of appropriate length and reads in the entire |
566 | -- source of the library information from the library information file | |
567 | -- whose name is given by the parameter Name. | |
568 | -- | |
569 | -- See description of Read_Source_File for details on the format of the | |
dec55d76 | 570 | -- returned text buffer (the format is identical). The lower bound of |
38cbfe40 RK |
571 | -- the Text_Buffer is always zero |
572 | -- | |
573 | -- If the specified file cannot be opened, then the action depends on | |
574 | -- Fatal_Err. If Fatal_Err is True, an error message is given and the | |
575 | -- compilation is abandoned. Otherwise if Fatal_Err is False, then null | |
576 | -- is returned. Note that the Lib_File is a simple name which does not | |
577 | -- include any directory information. The implementation is responsible | |
578 | -- for searching for the file in appropriate directories. | |
579 | -- | |
d56e7acd AC |
580 | -- If Opt.Check_Object_Consistency is set to True then this routine checks |
581 | -- whether the object file corresponding to the Lib_File is consistent with | |
582 | -- it. The object file is inconsistent if the object does not exist or if | |
583 | -- it has an older time stamp than Lib_File. This check is not performed | |
584 | -- when the Lib_File is "locked" (i.e. read/only) because in this case the | |
585 | -- object file may be buried in a library. In case of inconsistencies | |
586 | -- Read_Library_Info behaves as if it did not find Lib_File (namely if | |
587 | -- Fatal_Err is False, null is returned). | |
38cbfe40 | 588 | |
b11cb5fd EB |
589 | function Read_Library_Info_From_Full |
590 | (Full_Lib_File : File_Name_Type; | |
48263c9a | 591 | Lib_File_Attr : access File_Attributes; |
b11cb5fd EB |
592 | Fatal_Err : Boolean := False) return Text_Buffer_Ptr; |
593 | -- Same as Read_Library_Info, except Full_Lib_File must contains the full | |
594 | -- path to the library file (instead of having Read_Library_Info recompute | |
48263c9a EB |
595 | -- it). |
596 | -- Lib_File_Attr should be an initialized set of attributes for the | |
597 | -- library file (it can be initialized to Unknown_Attributes, but in | |
598 | -- general will have been initialized by a previous call to Find_File). | |
b11cb5fd | 599 | |
38cbfe40 RK |
600 | function Full_Library_Info_Name return File_Name_Type; |
601 | function Full_Object_File_Name return File_Name_Type; | |
602 | -- Returns the full name of the library/object file most recently read | |
603 | -- using Read_Library_Info, including appropriate directory information. | |
604 | -- Calling this routine entails no library file directory lookup | |
605 | -- penalty. Note that the object file corresponding to a library file | |
dec55d76 | 606 | -- is not actually read. Its time stamp is affected when the flag |
38cbfe40 RK |
607 | -- Opt.Check_Object_Consistency is set. |
608 | ||
609 | function Current_Library_File_Stamp return Time_Stamp_Type; | |
610 | function Current_Object_File_Stamp return Time_Stamp_Type; | |
611 | -- The time stamps of the files returned by the previous two routines. | |
612 | -- It is an error to call Current_Object_File_Stamp if | |
613 | -- Opt.Check_Object_Consistency is set to False. | |
614 | ||
48263c9a EB |
615 | procedure Full_Lib_File_Name |
616 | (N : File_Name_Type; | |
617 | Lib_File : out File_Name_Type; | |
618 | Attr : out File_Attributes); | |
38cbfe40 | 619 | function Full_Lib_File_Name (N : File_Name_Type) return File_Name_Type; |
b11cb5fd | 620 | -- Returns the full name of library file N. N should not include |
39f4e199 VC |
621 | -- path information. Note that if the file cannot be located No_File is |
622 | -- returned for the first routine and an all blank time stamp is returned | |
623 | -- for the second (this is not an error situation). The full name includes | |
624 | -- the appropriate directory information. The library file directory lookup | |
625 | -- penalty is incurred every single time this routine is called. | |
48263c9a EB |
626 | -- The procedural version also returns some file attributes for the ALI |
627 | -- file (to save on system calls later on). | |
38cbfe40 | 628 | |
2820d220 AC |
629 | function Lib_File_Name |
630 | (Source_File : File_Name_Type; | |
631 | Munit_Index : Nat := 0) return File_Name_Type; | |
38cbfe40 | 632 | -- Given the name of a source file, returns the name of the corresponding |
e23fbee4 RD |
633 | -- library information file. This may be the name of the object file or of |
634 | -- a separate file used to store the library information. In the current | |
635 | -- implementation, a separate file (the ALI file) is always used. In either | |
636 | -- case the returned result is suitable for calling Read_Library_Info. The | |
637 | -- Munit_Index is the unit index in multiple unit per file mode, or zero in | |
638 | -- normal single unit per file mode (used to add ~nnn suffix). Note: this | |
639 | -- subprogram is in this section because it is used by the compiler to | |
640 | -- determine the proper library information names to be placed in the | |
641 | -- generated library information file. | |
38cbfe40 | 642 | |
38cbfe40 RK |
643 | ----------------- |
644 | -- Termination -- | |
645 | ----------------- | |
646 | ||
33c423c8 AC |
647 | Current_Exit_Status : Integer := 0; |
648 | -- Exit status that is set with procedure OS_Exit_Through_Exception below | |
649 | -- and can be used in exception handler for Types.Terminate_Program to call | |
650 | -- Set_Exit_Status as the last action of the program. | |
651 | ||
652 | procedure OS_Exit_Through_Exception (Status : Integer); | |
9b7424a7 | 653 | pragma No_Return (OS_Exit_Through_Exception); |
33c423c8 AC |
654 | -- Set the Current_Exit_Status, then raise Types.Terminate_Program |
655 | ||
38cbfe40 RK |
656 | type Exit_Code_Type is ( |
657 | E_Success, -- No warnings or errors | |
658 | E_Warnings, -- Compiler warnings generated | |
659 | E_No_Code, -- No code generated | |
660 | E_No_Compile, -- Compilation not needed (smart recompilation) | |
661 | E_Errors, -- Compiler error messages generated | |
662 | E_Fatal, -- Fatal (serious) error, e.g. source file not found | |
663 | E_Abort); -- Internally detected compiler error | |
664 | ||
665 | procedure Exit_Program (Exit_Code : Exit_Code_Type); | |
07fc65c4 | 666 | pragma No_Return (Exit_Program); |
4ecc031c RD |
667 | -- A call to Exit_Program terminates execution with the given status. A |
668 | -- status of zero indicates normal completion, a non-zero status indicates | |
669 | -- abnormal termination. | |
38cbfe40 RK |
670 | |
671 | ------------------------- | |
672 | -- Command Line Access -- | |
673 | ------------------------- | |
674 | ||
675 | -- Direct interface to command line parameters. (We don't want to use | |
676 | -- the predefined command line package because it defines functions | |
677 | -- returning string) | |
678 | ||
679 | function Arg_Count return Natural; | |
680 | pragma Import (C, Arg_Count, "__gnat_arg_count"); | |
681 | -- Get number of arguments (note: optional globbing may be enabled) | |
682 | ||
683 | procedure Fill_Arg (A : System.Address; Arg_Num : Integer); | |
684 | pragma Import (C, Fill_Arg, "__gnat_fill_arg"); | |
685 | -- Store one argument | |
686 | ||
687 | function Len_Arg (Arg_Num : Integer) return Integer; | |
688 | pragma Import (C, Len_Arg, "__gnat_len_arg"); | |
689 | -- Get length of argument | |
690 | ||
0e47ff5c | 691 | ALI_Default_Suffix : constant String_Ptr := new String'("ali"); |
d33744e4 | 692 | ALI_Suffix : String_Ptr := ALI_Default_Suffix; |
bbe9779c AC |
693 | -- The suffixes used for the ALI files |
694 | ||
695 | function Prep_Suffix return String; | |
a6d25cad | 696 | -- The suffix used for preprocessed files |
07fc65c4 | 697 | |
0e47ff5c AC |
698 | private |
699 | ||
07fc65c4 GB |
700 | Current_Main : File_Name_Type := No_File; |
701 | -- Used to save a simple file name between calls to Next_Main_Source and | |
702 | -- Read_Source_File. If the file name argument to Read_Source_File is | |
703 | -- No_File, that indicates that the file whose name was returned by the | |
704 | -- last call to Next_Main_Source (and stored here) is to be read. | |
705 | ||
bb4daba3 DR |
706 | Target_Object_Suffix : constant String := Get_Target_Object_Suffix.all; |
707 | -- The suffix used for the target object files | |
07fc65c4 | 708 | |
07fc65c4 GB |
709 | Output_File_Name : File_Name_Type; |
710 | -- File_Name_Type for name of open file whose FD is in Output_FD, the name | |
711 | -- stored does not include the trailing NUL character. | |
712 | ||
713 | Argument_Count : constant Integer := Arg_Count - 1; | |
714 | -- Number of arguments (excluding program name) | |
715 | ||
716 | type File_Name_Array is array (Int range <>) of String_Ptr; | |
717 | type File_Name_Array_Ptr is access File_Name_Array; | |
718 | File_Names : File_Name_Array_Ptr := | |
719 | new File_Name_Array (1 .. Int (Argument_Count) + 2); | |
6de1be02 | 720 | -- As arguments are scanned, file names are stored in this array. The |
4ecc031c RD |
721 | -- strings do not have terminating NUL files. The array is extensible, |
722 | -- because when using project files, there may be more files than | |
723 | -- arguments on the command line. | |
07fc65c4 | 724 | |
aa720a54 AC |
725 | type File_Index_Array is array (Int range <>) of Int; |
726 | type File_Index_Array_Ptr is access File_Index_Array; | |
727 | File_Indexes : File_Index_Array_Ptr := | |
728 | new File_Index_Array (1 .. Int (Argument_Count) + 2); | |
729 | ||
07fc65c4 GB |
730 | Current_File_Name_Index : Int := 0; |
731 | -- The index in File_Names of the last file opened by Next_Main_Source | |
732 | -- or Next_Main_Lib_File. The value 0 indicates that no files have been | |
733 | -- opened yet. | |
734 | ||
735 | procedure Create_File_And_Check | |
736 | (Fdesc : out File_Descriptor; | |
737 | Fmode : Mode); | |
738 | -- Create file whose name (NUL terminated) is in Name_Buffer (with the | |
4ecc031c RD |
739 | -- length in Name_Len), and place the resulting descriptor in Fdesc. Issue |
740 | -- message and exit with fatal error if file cannot be created. The Fmode | |
741 | -- parameter is set to either Text or Binary (for details see description | |
39f4e199 | 742 | -- of System.OS_Lib.Create_File). |
07fc65c4 | 743 | |
41d8ee1d AC |
744 | procedure Open_File_To_Append_And_Check |
745 | (Fdesc : out File_Descriptor; | |
746 | Fmode : Mode); | |
747 | -- Opens the file whose name (NUL terminated) is in Name_Buffer (with the | |
748 | -- length in Name_Len), and place the resulting descriptor in Fdesc. Issue | |
749 | -- message and exit with fatal error if file cannot be opened. The Fmode | |
750 | -- parameter is set to either Text or Binary (for details see description | |
751 | -- of System.OS_Lib.Open_Append). | |
752 | ||
07fc65c4 GB |
753 | type Program_Type is (Compiler, Binder, Make, Gnatls, Unspecified); |
754 | -- Program currently running | |
755 | procedure Set_Program (P : Program_Type); | |
4ecc031c RD |
756 | -- Indicates to the body of Osint the program currently running. This |
757 | -- procedure is called by the child packages of Osint. A check is made | |
758 | -- that this procedure is not called more than once. | |
07fc65c4 GB |
759 | |
760 | function More_Files return Boolean; | |
9de61fcb | 761 | -- Implements More_Source_Files and More_Lib_Files |
07fc65c4 GB |
762 | |
763 | function Next_Main_File return File_Name_Type; | |
9de61fcb | 764 | -- Implements Next_Main_Source and Next_Main_Lib_File |
07fc65c4 GB |
765 | |
766 | function Object_File_Name (N : File_Name_Type) return File_Name_Type; | |
4ecc031c RD |
767 | -- Constructs the name of the object file corresponding to library file N. |
768 | -- If N is a full file name than the returned file name will also be a full | |
769 | -- file name. Note that no lookup in the library file directories is done | |
770 | -- for this file. This routine merely constructs the name. | |
07fc65c4 GB |
771 | |
772 | procedure Write_Info (Info : String); | |
f99ff327 | 773 | -- Implements Write_Binder_Info, Write_Debug_Info, and Write_Library_Info |
07fc65c4 | 774 | |
4ecc031c RD |
775 | procedure Write_With_Check (A : Address; N : Integer); |
776 | -- Writes N bytes from buffer starting at address A to file whose FD is | |
777 | -- stored in Output_FD, and whose file name is stored as a File_Name_Type | |
778 | -- in Output_File_Name. A check is made for disk full, and if this is | |
779 | -- detected, the file being written is deleted, and a fatal error is | |
780 | -- signalled. | |
781 | ||
38cbfe40 | 782 | end Osint; |