6 * The contents of this file are subject to the terms of the
7 * Common Development and Distribution License (the "License").
8 * You may not use this file except in compliance with the License.
10 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
11 * or http://www.opensolaris.org/os/licensing.
12 * See the License for the specific language governing permissions
13 * and limitations under the License.
15 * When distributing Covered Code, include this CDDL HEADER in each
16 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
17 * If applicable, add the following below this CDDL HEADER, with the
18 * fields enclosed by brackets "[]" replaced with your own identifying
19 * information: Portions Copyright [yyyy] [name of copyright owner]
24 * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
25 * Use is subject to license terms.
32 #include <mksh/defs.h>
40 #define SKIPSPACE(x) while (*x && \
41 ((*x == (int) space_char) || \
42 (*x == (int) tab_char) || \
43 (*x == (int) comma_char))) { \
47 #define SKIPWORD(x) while (*x && \
48 (*x != (int) space_char) && \
49 (*x != (int) tab_char) && \
50 (*x != (int) newline_char) && \
51 (*x != (int) comma_char) && \
52 (*x != (int) equal_char)) { \
56 #define SKIPTOEND(x) while (*x && \
57 (*x != (int) newline_char)) { \
61 #define PMAKE_DEF_MAX_JOBS 2 /* Default number of parallel jobs. */
63 #define OUT_OF_DATE(a,b) \
64 (((a) < (b)) || (((a) == file_doesnt_exist) && ((b) == file_doesnt_exist)))
66 #define OUT_OF_DATE_SEC(a,b) \
67 (((a).tv_sec < (b).tv_sec) || (((a).tv_sec == file_doesnt_exist.tv_sec) && ((b).tv_sec == file_doesnt_exist.tv_sec)))
69 #define SETVAR(name, value, append) \
70 setvar_daemon(name, value, append, no_daemon, \
72 #define MAX(a,b) (((a)>(b))?(a):(b))
74 * New feature added to SUN5_0 make, invoke the vanilla svr4 make when
75 * the USE_SVR4_MAKE environment variable is set.
77 #define SVR4_MAKE "/usr/ccs/lib/svr4.make"
78 #define USE_SVR4_MAKE "USE_SVR4_MAKE"
80 * The standard MAXHOSTNAMELEN is 64. We want 32.
82 #define MAX_HOSTNAMELEN 32
92 enter_dependencies_state
,
93 enter_conditional_state
,
97 poorly_formed_macro_state
,
101 struct _Name_vector
{
102 struct _Name
*names
[64];
103 struct _Chain
*target_group
[64];
105 struct _Name_vector
*next
;
109 struct _Running
*next
;
111 struct _Name
*target
;
112 struct _Name
*true_target
;
113 struct _Property
*command
;
114 struct _Name
*sprodep_value
;
121 struct _Name
**automatics
;
126 struct _Name
*temp_file
;
128 struct _Name
**conditional_targets
;
143 struct _Recursive_make
{
144 struct _Recursive_make
*next
; /* Linked list */
145 wchar_t *target
;/* Name of target */
146 wchar_t *oldline
;/* Original line in .nse_depinfo */
147 wchar_t *newline
;/* New line in .nse_depinfo */
148 wchar_t *cond_macrostring
;
149 /* string built from value of
150 * conditional macros used by
153 Boolean removed
;/* This target is no longer recursive*/
157 struct _Dyntarget
*next
;
163 * Typedefs for all structs
165 typedef struct _Cmd_line
*Cmd_line
, Cmd_line_rec
;
166 typedef struct _Dependency
*Dependency
, Dependency_rec
;
167 typedef struct _Macro
*Macro
, Macro_rec
;
168 typedef struct _Name_vector
*Name_vector
, Name_vector_rec
;
169 typedef struct _Percent
*Percent
, Percent_rec
;
170 typedef struct _Dyntarget
*Dyntarget
;
171 typedef struct _Recursive_make
*Recursive_make
, Recursive_make_rec
;
172 typedef struct _Running
*Running
, Running_rec
;
176 * extern declarations for all global variables.
177 * The actual declarations are in globals.cc
179 extern Boolean allrules_read
;
180 extern Name posix_name
;
181 extern Name svr4_name
;
182 extern Boolean sdot_target
;
183 extern Boolean all_parallel
;
184 extern Boolean assign_done
;
185 extern Boolean build_failed_seen
;
186 extern Name built_last_make_run
;
188 extern Boolean command_changed
;
189 extern Boolean commands_done
;
190 extern Chain conditional_targets
;
191 extern Name conditionals
;
192 extern Boolean continue_after_error
;
193 extern Property current_line
;
194 extern Name current_make_version
;
195 extern Name current_target
;
196 extern short debug_level
;
197 extern Cmd_line default_rule
;
198 extern Name default_rule_name
;
199 extern Name default_target_to_build
;
200 extern Boolean depinfo_already_read
;
201 extern Name dmake_group
;
202 extern Name dmake_max_jobs
;
203 extern Name dmake_mode
;
204 extern DMake_mode dmake_mode_type
;
205 extern Name dmake_output_mode
;
206 extern DMake_output_mode output_mode
;
207 extern Name dmake_odir
;
208 extern Name dmake_rcfile
;
211 extern Name dot_keep_state
;
212 extern Name dot_keep_state_file
;
213 extern Name empty_name
;
214 extern Boolean fatal_in_progress
;
215 extern int file_number
;
217 extern Name ignore_name
;
218 extern Boolean ignore_errors
;
219 extern Boolean ignore_errors_all
;
221 extern int job_msg_id
;
222 extern Boolean keep_state
;
223 extern Name make_state
;
224 extern timestruc_t make_state_before
;
225 extern Boolean make_state_locked
;
226 extern Dependency makefiles_used
;
227 extern Name makeflags
;
228 extern Name make_version
;
229 extern char mbs_buffer2
[];
230 extern char *mbs_ptr
;
231 extern char *mbs_ptr2
;
232 extern Boolean no_action_was_taken
;
233 extern Boolean no_parallel
;
234 extern Name no_parallel_name
;
235 extern Name not_auto
;
236 extern Boolean only_parallel
;
237 extern Boolean parallel
;
238 extern Name parallel_name
;
239 extern Name localhost_name
;
240 extern int parallel_process_cnt
;
241 extern Percent percent_list
;
242 extern Dyntarget dyntarget_list
;
244 extern Name pmake_machinesfile
;
245 extern Name precious
;
246 extern Name primary_makefile
;
247 extern Boolean quest
;
248 extern short read_trace_level
;
249 extern Boolean reading_dependencies
;
250 extern int recursion_level
;
251 extern Name recursive_name
;
252 extern short report_dependencies_level
;
253 extern Boolean report_pwd
;
254 extern Boolean rewrite_statefile
;
255 extern Running running_list
;
256 extern char *sccs_dir_path
;
257 extern Name sccs_get_name
;
258 extern Name sccs_get_posix_name
;
259 extern Cmd_line sccs_get_rule
;
260 extern Cmd_line sccs_get_org_rule
;
261 extern Cmd_line sccs_get_posix_rule
;
262 extern Name get_name
;
263 extern Name get_posix_name
;
264 extern Cmd_line get_rule
;
265 extern Cmd_line get_posix_rule
;
266 extern Boolean all_precious
;
267 extern Boolean report_cwd
;
268 extern Boolean silent_all
;
269 extern Boolean silent
;
270 extern Name silent_name
;
271 extern char *stderr_file
;
272 extern char *stdout_file
;
273 extern Boolean stdout_stderr_same
;
274 extern Dependency suffixes
;
275 extern Name suffixes_name
;
276 extern Name sunpro_dependencies
;
277 extern Boolean target_variants
;
278 extern const char *tmpdir
;
279 extern const char *temp_file_directory
;
280 extern Name temp_file_name
;
281 extern short temp_file_number
;
282 extern wchar_t *top_level_target
;
283 extern Boolean touch
;
284 extern Boolean trace_reader
;
285 extern Boolean build_unconditional
;
286 extern pathpt vroot_path
;
287 extern Name wait_name
;
288 extern wchar_t wcs_buffer2
[];
289 extern wchar_t *wcs_ptr
;
290 extern wchar_t *wcs_ptr2
;
291 extern long int hostid
;
294 * Declarations of system defined variables
296 /* On linux this variable is defined in 'signal.h' */
297 extern char *sys_siglist
[];
300 * Declarations of system supplied functions
302 extern int file_lock(char *, char *, int *, int);
305 * Declarations of functions declared and used by make
307 extern void add_pending(Name target
, int recursion_level
, Boolean do_get
, Boolean implicit
, Boolean redo
);
308 extern void add_running(Name target
, Name true_target
, Property command
, int recursion_level
, int auto_count
, Name
*automatics
, Boolean do_get
, Boolean implicit
);
309 extern void add_serial(Name target
, int recursion_level
, Boolean do_get
, Boolean implicit
);
310 extern void add_subtree(Name target
, int recursion_level
, Boolean do_get
, Boolean implicit
);
311 extern void append_or_replace_macro_in_dyn_array(ASCII_Dyn_Array
*Ar
, char *macro
);
312 extern void await_parallel(Boolean waitflg
);
313 extern void build_suffix_list(Name target_suffix
);
314 extern Boolean
check_auto_dependencies(Name target
, int auto_count
, Name
*automatics
);
315 extern void check_state(Name temp_file_name
);
316 extern void cond_macros_into_string(Name np
, String_rec
*buffer
);
317 extern void construct_target_string();
318 extern void create_xdrs_ptr(void);
319 extern void depvar_add_to_list (Name name
, Boolean cmdline
);
320 extern Doname
doname(register Name target
, register Boolean do_get
, register Boolean implicit
, register Boolean automatic
= false);
321 extern Doname
doname_check(register Name target
, register Boolean do_get
, register Boolean implicit
, register Boolean automatic
);
322 extern Doname
doname_parallel(Name target
, Boolean do_get
, Boolean implicit
);
323 extern Doname
dosys(register Name command
, register Boolean ignore_error
, register Boolean call_make
, Boolean silent_error
, Boolean always_exec
, Name target
);
324 extern void dump_make_state(void);
325 extern void dump_target_list(void);
326 extern void enter_conditional(register Name target
, Name name
, Name value
, register Boolean append
);
327 extern void enter_dependencies(register Name target
, Chain target_group
, register Name_vector depes
, register Cmd_line command
, register Separator separator
);
328 extern void enter_dependency(Property line
, register Name depe
, Boolean automatic
);
329 extern void enter_equal(Name name
, Name value
, register Boolean append
);
330 extern Percent
enter_percent(register Name target
, Chain target_group
, register Name_vector depes
, Cmd_line command
);
331 extern Dyntarget
enter_dyntarget(register Name target
);
332 extern Name_vector
enter_name(String string
, Boolean tail_present
, register wchar_t *string_start
, register wchar_t *string_end
, Name_vector current_names
, Name_vector
*extra_names
, Boolean
*target_group_seen
);
333 extern Boolean
exec_vp(register char *name
, register char **argv
, char **envp
, register Boolean ignore_error
);
334 extern Doname
execute_parallel(Property line
, Boolean waitflg
, Boolean local
= false);
335 extern Doname
execute_serial(Property line
);
336 extern timestruc_t
& exists(register Name target
);
337 extern void fatal(const char *, ...);
338 extern void fatal_reader(char *, ...);
339 extern Doname
find_ar_suffix_rule(register Name target
, Name true_target
, Property
*command
, Boolean rechecking
);
340 extern Doname
find_double_suffix_rule(register Name target
, Property
*command
, Boolean rechecking
);
341 extern Doname
find_percent_rule(register Name target
, Property
*command
, Boolean rechecking
);
342 extern int find_run_directory (char *cmd
, char *cwd
, char *dir
, char **pgm
, char **run
, char *path
);
343 extern Doname
find_suffix_rule(Name target
, Name target_body
, Name target_suffix
, Property
*command
, Boolean rechecking
);
344 extern Chain
find_target_groups(register Name_vector target_list
, register int i
, Boolean reset
);
345 extern void finish_children(Boolean docheck
);
346 extern void finish_running(void);
347 extern void free_chain(Name_vector ptr
);
348 extern void gather_recursive_deps(void);
349 extern char *get_current_path(void);
350 extern int get_job_msg_id(void);
351 extern wchar_t *getmem_wc(register int size
);
352 /* On linux getwd(char *) is defined in 'unistd.h' */
356 extern char *getwd(char *);
360 extern void handle_interrupt(int);
361 extern Boolean
is_running(Name target
);
362 extern void load_cached_names(void);
363 extern Boolean
parallel_ok(Name target
, Boolean line_prop_must_exists
);
364 extern void print_dependencies(register Name target
, register Property line
);
365 extern void send_job_start_msg(Property line
);
366 extern void send_rsrc_info_msg(int max_jobs
, char *hostname
, char *username
);
367 extern void print_value(register Name value
, Daemon daemon
);
368 extern timestruc_t
& read_archive(register Name target
);
369 extern int read_dir(Name dir
, wchar_t *pattern
, Property line
, wchar_t *library
);
370 extern void read_directory_of_file(register Name file
);
371 extern int read_make_machines(Name make_machines_name
);
372 extern Boolean
read_simple_file(register Name makefile_name
, register Boolean chase_path
, register Boolean doname_it
, Boolean complain
, Boolean must_exist
, Boolean report_file
, Boolean lock_makefile
);
373 extern void remove_recursive_dep(Name target
);
374 extern void report_recursive_dep(Name target
, char *line
);
375 extern void report_recursive_done(void);
376 extern void report_recursive_init(void);
377 extern Recursive_make
find_recursive_target(Name target
);
378 extern void reset_locals(register Name target
, register Property old_locals
, register Property conditional
, register int index
);
379 extern void set_locals(register Name target
, register Property old_locals
);
380 extern void setvar_append(register Name name
, register Name value
);
381 extern void setvar_envvar(void);
382 extern void special_reader(Name target
, register Name_vector depes
, Cmd_line command
);
383 extern void startup_rxm();
384 extern Doname
target_can_be_built(register Name target
);
385 extern char *time_to_string(const timestruc_t
&time
);
386 extern void update_target(Property line
, Doname result
);
387 extern void warning(char *, ...);
388 extern void write_state_file(int report_recursive
, Boolean exiting
);
389 extern Name
vpath_translation(register Name cmd
);
390 extern char *make_install_prefix(void);
392 #define DEPINFO_FMT_VERSION "VERS2$"
393 #define VER_LEN strlen(DEPINFO_FMT_VERSION)