1------------------------------------------------------------------------------ 2-- -- 3-- GNAT COMPILER COMPONENTS -- 4-- -- 5-- M A K E -- 6-- -- 7-- S p e c -- 8-- -- 9-- Copyright (C) 1992-2003 Free Software Foundation, Inc. -- 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 2, 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 COPYING. If not, write -- 19-- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, -- 20-- MA 02111-1307, USA. -- 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-- The following package implements the facilities to recursively 28-- compile (a la make), bind and/or link a set of sources. This package 29-- gives the individual routines for performing such tasks as well as 30-- the routine gnatmake below that puts it all together. 31 32with Table; 33with Types; use Types; 34 35with GNAT.OS_Lib; use GNAT.OS_Lib; 36 37package Make is 38 39 -- The 3 following packages are used to store gcc, gnatbind and gnatbl 40 -- switches passed on the gnatmake or gnatdist command line. 41 -- Note that the lower bounds definitely need to be 1 to match the 42 -- requirement that the argument array prepared for Spawn must have 43 -- a lower bound of 1. 44 45 package Gcc_Switches is new Table.Table ( 46 Table_Component_Type => String_Access, 47 Table_Index_Type => Integer, 48 Table_Low_Bound => 1, 49 Table_Initial => 20, 50 Table_Increment => 100, 51 Table_Name => "Make.Gcc_Switches"); 52 53 package Binder_Switches is new Table.Table ( 54 Table_Component_Type => String_Access, 55 Table_Index_Type => Integer, 56 Table_Low_Bound => 1, 57 Table_Initial => 20, 58 Table_Increment => 100, 59 Table_Name => "Make.Binder_Switches"); 60 61 package Linker_Switches is new Table.Table ( 62 Table_Component_Type => String_Access, 63 Table_Index_Type => Integer, 64 Table_Low_Bound => 1, 65 Table_Initial => 20, 66 Table_Increment => 100, 67 Table_Name => "Make.Linker_Switches"); 68 69 procedure Display_Commands (Display : Boolean := True); 70 -- The default behavior of Make commands (Compile_Sources, Bind, Link) 71 -- is to display them on stderr. This behavior can be changed repeatedly 72 -- by invoking this procedure. 73 74 -- If a compilation, bind or link failed one of the following 3 exceptions 75 -- is raised. These need to be handled by the calling routines. 76 77 Compilation_Failed : exception; 78 -- Raised by Compile_Sources if a compilation failed. 79 80 Bind_Failed : exception; 81 -- Raised by Bind below if the bind failed. 82 83 Link_Failed : exception; 84 -- Raised by Link below if the link failed. 85 86 procedure Bind (ALI_File : File_Name_Type; Args : Argument_List); 87 -- Binds ALI_File. Args are the arguments to pass to the binder. 88 -- Args must have a lower bound of 1. 89 90 procedure Link (ALI_File : File_Name_Type; Args : Argument_List); 91 -- Links ALI_File. Args are the arguments to pass to the linker. 92 -- Args must have a lower bound of 1. 93 94 procedure Initialize; 95 -- Performs default and package initialization. Therefore, 96 -- Compile_Sources can be called by an external unit. 97 98 procedure Scan_Make_Arg (Argv : String; And_Save : Boolean); 99 -- Scan make arguments. Argv is a single argument to be processed. 100 101 procedure Extract_Failure 102 (File : out File_Name_Type; 103 Unit : out Unit_Name_Type; 104 Found : out Boolean); 105 -- Extracts the first failure report from Bad_Compilation table. 106 107 procedure Compile_Sources 108 (Main_Source : File_Name_Type; 109 Args : Argument_List; 110 First_Compiled_File : out Name_Id; 111 Most_Recent_Obj_File : out Name_Id; 112 Most_Recent_Obj_Stamp : out Time_Stamp_Type; 113 Main_Unit : out Boolean; 114 Compilation_Failures : out Natural; 115 Check_Readonly_Files : Boolean := False; 116 Do_Not_Execute : Boolean := False; 117 Force_Compilations : Boolean := False; 118 Keep_Going : Boolean := False; 119 In_Place_Mode : Boolean := False; 120 Initialize_ALI_Data : Boolean := True; 121 Max_Process : Positive := 1); 122 -- Compile_Sources will recursively compile all the sources needed by 123 -- Main_Source. Before calling this routine make sure Namet has been 124 -- initialized. This routine can be called repeatedly with different 125 -- Main_Source file as long as all the source (-I flags), library 126 -- (-B flags) and ada library (-A flags) search paths between calls are 127 -- *exactly* the same. The default directory must also be the same. 128 -- 129 -- Args contains the arguments to use during the compilations. 130 -- The lower bound of Args must be 1. 131 -- 132 -- First_Compiled_File is set to the name of the first file that is 133 -- compiled or that needs to be compiled. This is set to No_Name if no 134 -- compilations were needed. 135 -- 136 -- Most_Recent_Obj_File is set to the full name of the most recent 137 -- object file found when no compilations are needed, that is when 138 -- First_Compiled_File is set to No_Name. When First_Compiled_File 139 -- is set then Most_Recent_Obj_File is set to No_Name. 140 -- 141 -- Most_Recent_Obj_Stamp is the time stamp of Most_Recent_Obj_File. 142 -- 143 -- Main_Unit is set to True if Main_Source can be a main unit. 144 -- If Do_Not_Execute is False and First_Compiled_File /= No_Name 145 -- the value of Main_Unit is always False. 146 -- Is this used any more??? It is certainly not used by gnatmake??? 147 -- 148 -- Compilation_Failures is a count of compilation failures. This count 149 -- is used to extract compilation failure reports with Extract_Failure. 150 -- 151 -- Check_Readonly_Files set it to True to compile source files 152 -- which library files are read-only. When compiling GNAT predefined 153 -- files the "-gnatg" flag is used. 154 -- 155 -- Do_Not_Execute set it to True to find out the first source that 156 -- needs to be recompiled, but without recompiling it. This file is 157 -- saved in First_Compiled_File. 158 -- 159 -- Force_Compilations forces all compilations no matter what but 160 -- recompiles read-only files only if Check_Readonly_Files 161 -- is set. 162 -- 163 -- Keep_Going when True keep compiling even in the presence of 164 -- compilation errors. 165 -- 166 -- In_Place_Mode when True save library/object files in their object 167 -- directory if they already exist; otherwise, in the source directory. 168 -- 169 -- Initialize_ALI_Data set it to True when you want to initialize ALI 170 -- data-structures. This is what you should do most of the time. 171 -- (especially the first time around when you call this routine). 172 -- This parameter is set to False to preserve previously recorded 173 -- ALI file data. 174 -- 175 -- Max_Process is the maximum number of processes that should be spawned 176 -- to carry out compilations. 177 -- 178 -- Flags in Package Opt Affecting Compile_Sources 179 -- ----------------------------------------------- 180 -- 181 -- Check_Object_Consistency set it to False to omit all consistency 182 -- checks between an .ali file and its corresponding object file. 183 -- When this flag is set to true, every time an .ali is read, 184 -- package Osint checks that the corresponding object file 185 -- exists and is more recent than the .ali. 186 -- 187 -- Use of Name Table Info 188 -- ---------------------- 189 -- 190 -- All file names manipulated by Compile_Sources are entered into the 191 -- Names table. The Byte field of a source file is used to mark it. 192 -- 193 -- Calling Compile_Sources Several Times 194 -- ------------------------------------- 195 -- 196 -- Upon return from Compile_Sources all the ALI data structures are left 197 -- intact for further browsing. HOWEVER upon entry to this routine ALI 198 -- data structures are re-initialized if parameter Initialize_ALI_Data 199 -- above is set to true. Typically this is what you want the first time 200 -- you call Compile_Sources. You should not load an ali file, call this 201 -- routine with flag Initialize_ALI_Data set to True and then expect 202 -- that ALI information to be around after the call. Note that the first 203 -- time you call Compile_Sources you better set Initialize_ALI_Data to 204 -- True unless you have called Initialize_ALI yourself. 205 -- 206 -- Compile_Sources ALGORITHM : Compile_Sources (Main_Source) 207 -- ------------------------- 208 -- 209 -- 1. Insert Main_Source in a Queue (Q) and mark it. 210 -- 211 -- 2. Let unit.adb be the file at the head of the Q. If unit.adb is 212 -- missing but its corresponding ali file is in an Ada library directory 213 -- (see below) then, remove unit.adb from the Q and goto step 4. 214 -- Otherwise, look at the files under the D (dependency) section of 215 -- unit.ali. If unit.ali does not exist or some of the time stamps do 216 -- not match, (re)compile unit.adb. 217 -- 218 -- An Ada library directory is a directory containing Ada specs, ali 219 -- and object files but no source files for the bodies. An Ada library 220 -- directory is communicated to gnatmake by means of some switch so that 221 -- gnatmake can skip the sources whole ali are in that directory. 222 -- There are two reasons for skipping the sources in this case. Firstly, 223 -- Ada libraries typically come without full sources but binding and 224 -- linking against those libraries is still possible. Secondly, it would 225 -- be very wasteful for gnatmake to systematically check the consistency 226 -- of every external Ada library used in a program. The binder is 227 -- already in charge of catching any potential inconsistencies. 228 -- 229 -- 3. Look into the W section of unit.ali and insert into the Q all 230 -- unmarked source files. Mark all files newly inserted in the Q. 231 -- Specifically, assuming that the W section looks like 232 -- 233 -- W types%s types.adb types.ali 234 -- W unchecked_deallocation%s 235 -- W xref_tab%s xref_tab.adb xref_tab.ali 236 -- 237 -- Then xref_tab.adb and types.adb are inserted in the Q if they are not 238 -- already marked. 239 -- Note that there is no file listed under W unchecked_deallocation%s 240 -- so no generic body should ever be explicitly compiled (unless the 241 -- Main_Source at the start was a generic body). 242 -- 243 -- 4. Repeat steps 2 and 3 above until the Q is empty 244 -- 245 -- Note that the above algorithm works because the units withed in 246 -- subunits are transitively included in the W section (with section) of 247 -- the main unit. Likewise the withed units in a generic body needed 248 -- during a compilation are also transitively included in the W section 249 -- of the originally compiled file. 250 251 procedure Gnatmake; 252 -- The driver of gnatmake. This routine puts it all together. 253 -- This utility can be used to automatically (re)compile (using 254 -- Compile_Sources), bind (using Bind) and link (using Link) a set of 255 -- ada sources. For more information on gnatmake and its precise usage 256 -- please refer to the gnat documentation. 257 -- 258 -- Flags in Package Opt Affecting Gnatmake 259 -- --------------------------------------- 260 -- 261 -- Check_Readonly_Files: True when -a present in command line 262 -- Check_Object_Consistency: Set to True by Gnatmake 263 -- Compile_Only: True when -c present in command line 264 -- Force_Compilations: True when -f present in command line 265 -- Maximum_Processes: Number of processes given by -jnum 266 -- Keep_Going: True when -k present in command line 267 -- List_Dependencies: True when -l present in command line 268 -- Do_Not_Execute True when -n present in command line 269 -- Quiet_Output: True when -q present in command line 270 -- Minimal_Recompilation: True when -m present in command line 271 -- Verbose_Mode: True when -v present in command line 272 273end Make; 274