xref: /illumos-gate/usr/src/cmd/make/include/mk/defs.h (revision 8e0c8248)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
23  * Use is subject to license terms.
24  *
25  * Copyright 2019, Joyent, Inc.
26  * Copyright 2019 RackTop Systems.
27  */
28 
29 #ifndef _MK_DEFS_H
30 #define	_MK_DEFS_H
31 
32 /*
33  * Included files
34  */
35 
36 #include <mksh/defs.h>
37 
38 /*
39  * Defined macros
40  */
41 
42 #define	SKIPSPACE(x)	while (*x &&				\
43 				((*x == (int)space_char) ||	\
44 				(*x == (int)tab_char) ||	\
45 				(*x == (int)comma_char))) {	\
46 					x++;			\
47 			}
48 
49 #define	SKIPWORD(x)	while (*x &&				\
50 				(*x != (int)space_char) &&	\
51 				(*x != (int)tab_char) &&	\
52 				(*x != (int)newline_char) &&	\
53 				(*x != (int)comma_char) &&	\
54 				(*x != (int)equal_char)) {	\
55 					x++;			\
56 			}
57 
58 #define	SKIPTOEND(x)	while (*x &&				\
59 				(*x != (int)newline_char)) {	\
60 					x++;			\
61 			}
62 
63 #define	PMAKE_DEF_MAX_JOBS	2	/* Default number of parallel jobs. */
64 
65 #define	OUT_OF_DATE(a, b) \
66 	(((a) < (b)) || (((a) == file_doesnt_exist) && \
67 	((b) == file_doesnt_exist)))
68 
69 #define	OUT_OF_DATE_SEC(a, b) \
70 	(((a).tv_sec < (b).tv_sec) || \
71 	(((a).tv_sec == file_doesnt_exist.tv_sec) && \
72 	((b).tv_sec == file_doesnt_exist.tv_sec)))
73 
74 #define	SETVAR(name, value, append) \
75 				setvar_daemon(name, value, append, no_daemon, \
76 				true, debug_level)
77 #define	MAX(a, b)		(((a) > (b))?(a):(b))
78 /*
79  * New feature added to SUN5_0 make,  invoke the vanilla svr4 make when
80  * the USE_SVR4_MAKE environment variable is set.
81  */
82 #define	SVR4_MAKE		"/usr/ccs/lib/svr4.make"
83 #define	USE_SVR4_MAKE		"USE_SVR4_MAKE"
84 /*
85  * The standard MAXHOSTNAMELEN is 64. We want 32.
86  */
87 #define	MAX_HOSTNAMELEN		32
88 
89 
90 /*
91  * typedefs & structs
92  */
93 typedef enum {
94 	no_state,
95 	scan_name_state,
96 	scan_command_state,
97 	enter_dependencies_state,
98 	enter_conditional_state,
99 	enter_equal_state,
100 	illegal_bytes_state,
101 	illegal_eoln_state,
102 	poorly_formed_macro_state,
103 	exit_state
104 } Reader_state;
105 
106 struct _Name_vector {
107 	struct _Name		*names[64];
108 	struct _Chain		*target_group[64];
109 	short			used;
110 	struct _Name_vector	*next;
111 };
112 
113 struct _Running {
114 	struct _Running		*next;
115 	Doname			state;
116 	struct _Name		*target;
117 	struct _Name		*true_target;
118 	struct _Property	*command;
119 	struct _Name		*sprodep_value;
120 	char			*sprodep_env;
121 	int			recursion_level;
122 	Boolean			do_get;
123 	Boolean			implicit;
124 	Boolean			redo;
125 	int			auto_count;
126 	struct _Name		**automatics;
127 	pid_t			pid;
128 	int			job_msg_id;
129 	char			*stdout_file;
130 	char			*stderr_file;
131 	struct _Name		*temp_file;
132 	int			conditional_cnt;
133 	struct _Name		**conditional_targets;
134 	Boolean			make_refd;
135 };
136 
137 typedef enum {
138 	serial_mode,
139 	parallel_mode
140 } DMake_mode;
141 
142 typedef enum {
143 	txt1_mode,
144 	txt2_mode,
145 	html1_mode
146 } DMake_output_mode;
147 
148 struct _Recursive_make {
149 	struct _Recursive_make	*next;	  /* Linked list */
150 	wchar_t			*target;  /* Name of target */
151 	wchar_t			*oldline; /* Original line in .nse_depinfo */
152 	wchar_t			*newline; /* New line in .nse_depinfo */
153 	/*
154 	 * string built from value of
155 	 * conditional macros used by
156 	 * this target
157 	 */
158 	wchar_t			*cond_macrostring;
159 	/* This target is no longer recursive */
160 	Boolean			removed;
161 };
162 
163 struct _Dyntarget {
164 	struct _Dyntarget	*next;
165 	struct _Name		*name;
166 };
167 
168 
169 /*
170  * Typedefs for all structs
171  */
172 typedef struct _Cmd_line	*Cmd_line, Cmd_line_rec;
173 typedef struct _Dependency	*Dependency, Dependency_rec;
174 typedef struct _Macro		*Macro, Macro_rec;
175 typedef struct _Name_vector	*Name_vector, Name_vector_rec;
176 typedef struct _Percent		*Percent, Percent_rec;
177 typedef struct _Dyntarget	*Dyntarget;
178 typedef struct _Recursive_make	*Recursive_make, Recursive_make_rec;
179 typedef struct _Running		*Running, Running_rec;
180 
181 
182 /*
183  *	extern declarations for all global variables.
184  *	The actual declarations are in globals.cc
185  */
186 extern	Boolean		allrules_read;
187 extern	Name		posix_name;
188 extern	Name		svr4_name;
189 extern	Boolean		sdot_target;
190 extern	Boolean		all_parallel;
191 extern	Boolean		assign_done;
192 extern	Boolean		build_failed_seen;
193 extern	Name		built_last_make_run;
194 extern	Name		c_at;
195 extern	Boolean		command_changed;
196 extern	Boolean		commands_done;
197 extern	Chain		conditional_targets;
198 extern	Name		conditionals;
199 extern	Boolean		continue_after_error;
200 extern	Property	current_line;
201 extern	Name		current_make_version;
202 extern	Name		current_target;
203 extern	short		debug_level;
204 extern	Cmd_line	default_rule;
205 extern	Name		default_rule_name;
206 extern	Name		default_target_to_build;
207 extern	Boolean		depinfo_already_read;
208 extern	Name		dmake_group;
209 extern	Name		dmake_max_jobs;
210 extern	Name		dmake_mode;
211 extern	DMake_mode	dmake_mode_type;
212 extern	Name		dmake_output_mode;
213 extern	DMake_output_mode	output_mode;
214 extern	Name		dmake_odir;
215 extern	Name		dmake_rcfile;
216 extern	Name		done;
217 extern	Name		dot;
218 extern	Name		dot_keep_state;
219 extern	Name		dot_keep_state_file;
220 extern	Name		empty_name;
221 extern	Boolean		fatal_in_progress;
222 extern	int		file_number;
223 extern	Name		force;
224 extern	Name		ignore_name;
225 extern	Boolean		ignore_errors;
226 extern	Boolean		ignore_errors_all;
227 extern	Name		init;
228 extern	int		job_msg_id;
229 extern	Boolean		keep_state;
230 extern	Name		make_state;
231 extern	timestruc_t	make_state_before;
232 extern	Boolean		make_state_locked;
233 extern	Dependency	makefiles_used;
234 extern	Name		makeflags;
235 extern	Name		make_version;
236 extern	char		mbs_buffer2[];
237 extern	char		*mbs_ptr;
238 extern	char		*mbs_ptr2;
239 extern	Boolean		no_action_was_taken;
240 extern	Boolean		no_parallel;
241 extern	Name		no_parallel_name;
242 extern	Name		not_auto;
243 extern	Boolean		only_parallel;
244 extern	Boolean		parallel;
245 extern	Name		parallel_name;
246 extern	Name		localhost_name;
247 extern	int		parallel_process_cnt;
248 extern	Percent		percent_list;
249 extern	Dyntarget	dyntarget_list;
250 extern	Name		plus;
251 extern	Name		pmake_machinesfile;
252 extern	Name		precious;
253 extern	Name		primary_makefile;
254 extern	Boolean		quest;
255 extern	short		read_trace_level;
256 extern	Boolean		reading_dependencies;
257 extern	int		recursion_level;
258 extern	Name		recursive_name;
259 extern	short		report_dependencies_level;
260 extern	Boolean		report_pwd;
261 extern	Boolean		rewrite_statefile;
262 extern	Running		running_list;
263 extern	char		*sccs_dir_path;
264 extern	Name		sccs_get_name;
265 extern	Name		sccs_get_posix_name;
266 extern	Cmd_line	sccs_get_rule;
267 extern	Cmd_line	sccs_get_org_rule;
268 extern	Cmd_line	sccs_get_posix_rule;
269 extern	Name		get_name;
270 extern	Name		get_posix_name;
271 extern	Cmd_line	get_rule;
272 extern	Cmd_line	get_posix_rule;
273 extern	Boolean		all_precious;
274 extern	Boolean		report_cwd;
275 extern	Boolean		silent_all;
276 extern	Boolean		silent;
277 extern	Name		silent_name;
278 extern	char		*stderr_file;
279 extern	char		*stdout_file;
280 extern	Boolean		stdout_stderr_same;
281 extern	Dependency	suffixes;
282 extern	Name		suffixes_name;
283 extern	Name		sunpro_dependencies;
284 extern	Boolean		target_variants;
285 extern	const char	*tmpdir;
286 extern	const char	*temp_file_directory;
287 extern	Name		temp_file_name;
288 extern	short		temp_file_number;
289 extern  wchar_t		*top_level_target;
290 extern	Boolean		touch;
291 extern	Boolean		trace_reader;
292 extern	Boolean		build_unconditional;
293 extern	pathpt		vroot_path;
294 extern	Name		wait_name;
295 extern	wchar_t		wcs_buffer2[];
296 extern	wchar_t		*wcs_ptr;
297 extern	wchar_t		*wcs_ptr2;
298 extern	long int	hostid;
299 extern	Boolean		path_reset;
300 extern	Boolean		rebuild_arg0;
301 
302 /*
303  * Declarations of system defined variables
304  */
305 /* On linux this variable is defined in 'signal.h' */
306 extern	char		*sys_siglist[];
307 
308 /*
309  * Declarations of system supplied functions
310  */
311 extern	int		file_lock(char *, char *, int *, int);
312 
313 /*
314  * Declarations of functions declared and used by make
315  */
316 extern	void		add_pending(Name target, int recursion_level,
317 	Boolean do_get, Boolean implicit, Boolean redo);
318 extern	void		add_running(Name target, Name true_target,
319 	Property command, int recursion_level, int auto_count,
320 	Name *automatics, Boolean do_get, Boolean implicit);
321 extern	void		add_serial(Name target, int recursion_level,
322 	Boolean do_get, Boolean implicit);
323 extern	void		add_subtree(Name target, int recursion_level,
324 	Boolean do_get, Boolean implicit);
325 extern  void		append_or_replace_macro_in_dyn_array(
326 	ASCII_Dyn_Array *Ar, char *macro);
327 extern	void		await_parallel(Boolean waitflg);
328 extern	void		build_suffix_list(Name target_suffix);
329 extern	Boolean		check_auto_dependencies(Name target, int auto_count,
330 	Name *automatics);
331 extern	void		check_state(Name temp_file_name);
332 extern	void		cond_macros_into_string(Name np, String_rec *buffer);
333 extern	void		construct_target_string();
334 extern	void		create_xdrs_ptr(void);
335 extern	void		depvar_add_to_list(Name name, Boolean cmdline);
336 extern	Doname		doname(Name target, Boolean do_get, Boolean implicit,
337 	Boolean automatic = false);
338 extern	Doname		doname_check(Name target, Boolean do_get,
339 	Boolean implicit, Boolean automatic);
340 extern	Doname		doname_parallel(Name target, Boolean do_get,
341 	Boolean implicit);
342 extern	Doname		dosys(Name command, Boolean ignore_error,
343 	Boolean call_make, Boolean silent_error, Boolean always_exec,
344 	Name target);
345 extern	void		dump_make_state(void);
346 extern	void		dump_target_list(void);
347 extern	void		enter_conditional(Name target, Name name, Name value,
348 	Boolean append);
349 extern	void		enter_dependencies(Name target, Chain target_group,
350 	Name_vector depes, Cmd_line command, Separator separator);
351 extern	void		enter_dependency(Property line, Name depe,
352 	Boolean automatic);
353 extern	void		enter_equal(Name name, Name value, Boolean append);
354 extern  Percent		enter_percent(Name target, Chain target_group,
355 	Name_vector depes, Cmd_line command);
356 extern	Dyntarget	enter_dyntarget(Name target);
357 extern	Name_vector	enter_name(String string, Boolean tail_present,
358 	wchar_t *string_start, wchar_t *string_end, Name_vector current_names,
359 	Name_vector *extra_names, Boolean *target_group_seen);
360 extern	Boolean		exec_vp(char *name, char **argv, char **envp,
361 	Boolean ignore_error);
362 extern	Doname		execute_parallel(Property line, Boolean waitflg,
363 	Boolean local = false);
364 extern	Doname		execute_serial(Property line);
365 extern	timestruc_t&	exists(Name target);
366 extern	void		fatal(const char *, ...) __NORETURN;
367 extern	void		fatal_reader(char *, ...) __NORETURN;
368 extern	Doname		find_ar_suffix_rule(Name target, Name true_target,
369 	Property *command, Boolean rechecking);
370 extern	Doname		find_double_suffix_rule(Name target, Property *command,
371 	Boolean rechecking);
372 extern	Doname		find_percent_rule(Name target, Property *command,
373 	Boolean rechecking);
374 extern	int		find_run_directory(char *cmd, char *cwd, char *dir,
375 	char **pgm, char **run, char *path);
376 extern	Doname		find_suffix_rule(Name target, Name target_body,
377 	Name target_suffix, Property *command, Boolean rechecking);
378 extern	Chain		find_target_groups(Name_vector target_list, int i,
379 	Boolean reset);
380 extern	void		finish_children(Boolean docheck);
381 extern	void		finish_running(void);
382 extern	void		free_chain(Name_vector ptr);
383 extern  void		gather_recursive_deps(void);
384 extern	char		*get_current_path(void);
385 extern	int		get_job_msg_id(void);
386 extern	wchar_t		*getmem_wc(int size);
387 extern	void		handle_interrupt(int);
388 extern	Boolean		is_running(Name target);
389 extern	void		load_cached_names(void);
390 extern	Boolean		parallel_ok(Name target, Boolean line_prop_must_exists);
391 extern	void		print_dependencies(Name target, Property line);
392 extern	void		send_job_start_msg(Property line);
393 extern	void		send_rsrc_info_msg(int max_jobs, char *hostname,
394 	char *username);
395 extern	void		print_value(Name value, Daemon daemon);
396 extern	timestruc_t&	read_archive(Name target);
397 extern	int		read_dir(Name dir, wchar_t *pattern, Property line,
398 	wchar_t *library);
399 extern	void		read_directory_of_file(Name file);
400 extern	int		read_make_machines(Name make_machines_name);
401 extern	Boolean		read_simple_file(Name makefile_name, Boolean chase_path,
402 	Boolean doname_it, Boolean complain, Boolean must_exist,
403 	Boolean report_file, Boolean lock_makefile);
404 extern	void		remove_recursive_dep(Name target);
405 extern	void		report_recursive_dep(Name target, char *line);
406 extern	void		report_recursive_done(void);
407 extern	void		report_recursive_init(void);
408 extern	Recursive_make	find_recursive_target(Name target);
409 extern	void		reset_locals(Name target, Property old_locals,
410 	Property conditional, int index);
411 extern	void		set_locals(Name target, Property old_locals);
412 extern	void		setvar_append(Name name, Name value);
413 extern	void		setvar_envvar(void);
414 extern	void		special_reader(Name target, Name_vector depes,
415 	Cmd_line command);
416 extern	void		startup_rxm();
417 extern	Doname		target_can_be_built(Name target);
418 extern	char		*time_to_string(const timestruc_t &time);
419 extern	void		update_target(Property line, Doname result);
420 extern	void		warning(char *, ...);
421 extern	void		write_state_file(int report_recursive, Boolean exiting);
422 extern	Name		vpath_translation(Name cmd);
423 extern	char		*make_install_prefix(void);
424 
425 #define	DEPINFO_FMT_VERSION "VERS2$"
426 #define	VER_LEN strlen(DEPINFO_FMT_VERSION)
427 
428 
429 #endif	/* _MK_DEFS_H */
430