1 |
/* Miscellaneous global declarations and portability cruft for GNU Make. |
2 |
Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1999, |
3 |
2002 Free Software Foundation, Inc. |
4 |
This file is part of GNU Make. |
5 |
|
6 |
GNU Make is free software; you can redistribute it and/or modify |
7 |
it under the terms of the GNU General Public License as published by |
8 |
the Free Software Foundation; either version 2, or (at your option) |
9 |
any later version. |
10 |
|
11 |
GNU Make is distributed in the hope that it will be useful, |
12 |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 |
GNU General Public License for more details. |
15 |
|
16 |
You should have received a copy of the GNU General Public License |
17 |
along with GNU Make; see the file COPYING. If not, write to |
18 |
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
19 |
Boston, MA 02111-1307, USA. */ |
20 |
|
21 |
/* We use <config.h> instead of "config.h" so that a compilation |
22 |
using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h |
23 |
(which it would do because make.h was found in $srcdir). */ |
24 |
#include <config.h> |
25 |
#undef HAVE_CONFIG_H |
26 |
#define HAVE_CONFIG_H 1 |
27 |
|
28 |
/* AIX requires this to be the first thing in the file. */ |
29 |
#ifndef __GNUC__ |
30 |
# if HAVE_ALLOCA_H |
31 |
# include <alloca.h> |
32 |
# else |
33 |
# ifdef _AIX |
34 |
#pragma alloca |
35 |
# else |
36 |
# ifndef alloca /* predefined by HP cc +Olibcalls */ |
37 |
char *alloca (); |
38 |
# endif |
39 |
# endif |
40 |
# endif |
41 |
#endif |
42 |
|
43 |
|
44 |
/* Use prototypes if available. */ |
45 |
#if defined (__cplusplus) || (defined (__STDC__) && __STDC__) |
46 |
# undef PARAMS |
47 |
# define PARAMS(protos) protos |
48 |
#else /* Not C++ or ANSI C. */ |
49 |
# undef PARAMS |
50 |
# define PARAMS(protos) () |
51 |
#endif /* C++ or ANSI C. */ |
52 |
|
53 |
/* Specify we want GNU source code. This must be defined before any |
54 |
system headers are included. */ |
55 |
|
56 |
#define _GNU_SOURCE 1 |
57 |
|
58 |
|
59 |
#ifdef CRAY |
60 |
/* This must happen before #include <signal.h> so |
61 |
that the declaration therein is changed. */ |
62 |
# define signal bsdsignal |
63 |
#endif |
64 |
|
65 |
/* If we're compiling for the dmalloc debugger, turn off string inlining. */ |
66 |
#if defined(HAVE_DMALLOC_H) && defined(__GNUC__) |
67 |
# define __NO_STRING_INLINES |
68 |
#endif |
69 |
|
70 |
#include <sys/types.h> |
71 |
#include <sys/stat.h> |
72 |
#include <signal.h> |
73 |
#include <stdio.h> |
74 |
#include <ctype.h> |
75 |
#ifdef HAVE_SYS_TIMEB_H |
76 |
/* SCO 3.2 "devsys 4.2" has a prototype for `ftime' in <time.h> that bombs |
77 |
unless <sys/timeb.h> has been included first. Does every system have a |
78 |
<sys/timeb.h>? If any does not, configure should check for it. */ |
79 |
# include <sys/timeb.h> |
80 |
#endif |
81 |
|
82 |
#if TIME_WITH_SYS_TIME |
83 |
# include <sys/time.h> |
84 |
# include <time.h> |
85 |
#else |
86 |
# if HAVE_SYS_TIME_H |
87 |
# include <sys/time.h> |
88 |
# else |
89 |
# include <time.h> |
90 |
# endif |
91 |
#endif |
92 |
|
93 |
#include <errno.h> |
94 |
|
95 |
#ifndef errno |
96 |
extern int errno; |
97 |
#endif |
98 |
|
99 |
#ifndef isblank |
100 |
# define isblank(c) ((c) == ' ' || (c) == '\t') |
101 |
#endif |
102 |
|
103 |
#ifdef HAVE_UNISTD_H |
104 |
# include <unistd.h> |
105 |
/* Ultrix's unistd.h always defines _POSIX_VERSION, but you only get |
106 |
POSIX.1 behavior with `cc -YPOSIX', which predefines POSIX itself! */ |
107 |
# if defined (_POSIX_VERSION) && !defined (ultrix) && !defined (VMS) |
108 |
# define POSIX 1 |
109 |
# endif |
110 |
#endif |
111 |
|
112 |
/* Some systems define _POSIX_VERSION but are not really POSIX.1. */ |
113 |
#if (defined (butterfly) || defined (__arm) || (defined (__mips) && defined (_SYSTYPE_SVR3)) || (defined (sequent) && defined (i386))) |
114 |
# undef POSIX |
115 |
#endif |
116 |
|
117 |
#if !defined (POSIX) && defined (_AIX) && defined (_POSIX_SOURCE) |
118 |
# define POSIX 1 |
119 |
#endif |
120 |
|
121 |
#ifndef RETSIGTYPE |
122 |
# define RETSIGTYPE void |
123 |
#endif |
124 |
|
125 |
#ifndef sigmask |
126 |
# define sigmask(sig) (1 << ((sig) - 1)) |
127 |
#endif |
128 |
|
129 |
#ifndef HAVE_SA_RESTART |
130 |
# define SA_RESTART 0 |
131 |
#endif |
132 |
|
133 |
#ifdef HAVE_LIMITS_H |
134 |
# include <limits.h> |
135 |
#endif |
136 |
#ifdef HAVE_SYS_PARAM_H |
137 |
# include <sys/param.h> |
138 |
#endif |
139 |
|
140 |
#ifndef PATH_MAX |
141 |
# ifndef POSIX |
142 |
# define PATH_MAX MAXPATHLEN |
143 |
# endif |
144 |
#endif |
145 |
#ifndef MAXPATHLEN |
146 |
# define MAXPATHLEN 1024 |
147 |
#endif |
148 |
|
149 |
#ifdef PATH_MAX |
150 |
# define GET_PATH_MAX PATH_MAX |
151 |
# define PATH_VAR(var) char var[PATH_MAX] |
152 |
#else |
153 |
# define NEED_GET_PATH_MAX 1 |
154 |
# define GET_PATH_MAX (get_path_max ()) |
155 |
# define PATH_VAR(var) char *var = (char *) alloca (GET_PATH_MAX) |
156 |
extern unsigned int get_path_max PARAMS ((void)); |
157 |
#endif |
158 |
|
159 |
#ifndef CHAR_BIT |
160 |
# define CHAR_BIT 8 |
161 |
#endif |
162 |
|
163 |
/* Nonzero if the integer type T is signed. */ |
164 |
#define INTEGER_TYPE_SIGNED(t) ((t) -1 < 0) |
165 |
|
166 |
/* The minimum and maximum values for the integer type T. |
167 |
Use ~ (t) 0, not -1, for portability to 1's complement hosts. */ |
168 |
#define INTEGER_TYPE_MINIMUM(t) \ |
169 |
(! INTEGER_TYPE_SIGNED (t) ? (t) 0 : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)) |
170 |
#define INTEGER_TYPE_MAXIMUM(t) (~ (t) 0 - INTEGER_TYPE_MINIMUM (t)) |
171 |
|
172 |
#ifndef CHAR_MAX |
173 |
# define CHAR_MAX INTEGER_TYPE_MAXIMUM (char) |
174 |
#endif |
175 |
|
176 |
#ifdef STAT_MACROS_BROKEN |
177 |
# ifdef S_ISREG |
178 |
# undef S_ISREG |
179 |
# endif |
180 |
# ifdef S_ISDIR |
181 |
# undef S_ISDIR |
182 |
# endif |
183 |
#endif /* STAT_MACROS_BROKEN. */ |
184 |
|
185 |
#ifndef S_ISREG |
186 |
# define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) |
187 |
#endif |
188 |
#ifndef S_ISDIR |
189 |
# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) |
190 |
#endif |
191 |
|
192 |
#ifdef VMS |
193 |
# include <types.h> |
194 |
# include <unixlib.h> |
195 |
# include <unixio.h> |
196 |
# include <perror.h> |
197 |
/* Needed to use alloca on VMS. */ |
198 |
# include <builtins.h> |
199 |
#endif |
200 |
|
201 |
#ifndef __attribute__ |
202 |
/* This feature is available in gcc versions 2.5 and later. */ |
203 |
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__ |
204 |
# define __attribute__(x) |
205 |
# endif |
206 |
/* The __-protected variants of `format' and `printf' attributes |
207 |
are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ |
208 |
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) |
209 |
# define __format__ format |
210 |
# define __printf__ printf |
211 |
# endif |
212 |
#endif |
213 |
|
214 |
#if defined (STDC_HEADERS) || defined (__GNU_LIBRARY__) |
215 |
# include <stdlib.h> |
216 |
# include <string.h> |
217 |
# define ANSI_STRING 1 |
218 |
#else /* No standard headers. */ |
219 |
# ifdef HAVE_STRING_H |
220 |
# include <string.h> |
221 |
# define ANSI_STRING 1 |
222 |
# else |
223 |
# include <strings.h> |
224 |
# endif |
225 |
# ifdef HAVE_MEMORY_H |
226 |
# include <memory.h> |
227 |
# endif |
228 |
# ifdef HAVE_STDLIB_H |
229 |
# include <stdlib.h> |
230 |
# else |
231 |
extern char *malloc PARAMS ((int)); |
232 |
extern char *realloc PARAMS ((char *, int)); |
233 |
extern void free PARAMS ((char *)); |
234 |
|
235 |
extern void abort PARAMS ((void)) __attribute__ ((noreturn)); |
236 |
extern void exit PARAMS ((int)) __attribute__ ((noreturn)); |
237 |
# endif /* HAVE_STDLIB_H. */ |
238 |
|
239 |
#endif /* Standard headers. */ |
240 |
|
241 |
/* These should be in stdlib.h. Make sure we have them. */ |
242 |
#ifndef EXIT_SUCCESS |
243 |
# define EXIT_SUCCESS 0 |
244 |
#endif |
245 |
#ifndef EXIT_FAILURE |
246 |
# define EXIT_FAILURE 0 |
247 |
#endif |
248 |
|
249 |
#ifdef ANSI_STRING |
250 |
|
251 |
# ifndef bcmp |
252 |
# define bcmp(s1, s2, n) memcmp ((s1), (s2), (n)) |
253 |
# endif |
254 |
# ifndef bzero |
255 |
# define bzero(s, n) memset ((s), 0, (n)) |
256 |
# endif |
257 |
# if defined(HAVE_MEMMOVE) && !defined(bcopy) |
258 |
# define bcopy(s, d, n) memmove ((d), (s), (n)) |
259 |
# endif |
260 |
|
261 |
#else /* Not ANSI_STRING. */ |
262 |
|
263 |
# ifndef HAVE_STRCHR |
264 |
# define strchr(s, c) index((s), (c)) |
265 |
# define strrchr(s, c) rindex((s), (c)) |
266 |
# endif |
267 |
|
268 |
# ifndef bcmp |
269 |
extern int bcmp PARAMS ((const char *, const char *, int)); |
270 |
# endif |
271 |
# ifndef bzero |
272 |
extern void bzero PARAMS ((char *, int)); |
273 |
#endif |
274 |
# ifndef bcopy |
275 |
extern void bcopy PARAMS ((const char *b1, char *b2, int)); |
276 |
# endif |
277 |
|
278 |
#endif /* ANSI_STRING. */ |
279 |
#undef ANSI_STRING |
280 |
|
281 |
/* SCO Xenix has a buggy macro definition in <string.h>. */ |
282 |
#undef strerror |
283 |
|
284 |
#if !defined(ANSI_STRING) && !defined(__DECC) |
285 |
extern char *strerror PARAMS ((int errnum)); |
286 |
#endif |
287 |
|
288 |
#if HAVE_INTTYPES_H |
289 |
# include <inttypes.h> |
290 |
#endif |
291 |
#define FILE_TIMESTAMP uintmax_t |
292 |
|
293 |
#if !defined(HAVE_STRSIGNAL) |
294 |
extern char *strsignal PARAMS ((int signum)); |
295 |
#endif |
296 |
|
297 |
/* ISDIGIT offers the following features: |
298 |
- Its arg may be any int or unsigned int; it need not be an unsigned char. |
299 |
- It's guaranteed to evaluate its argument exactly once. |
300 |
NOTE! Make relies on this behavior, don't change it! |
301 |
- It's typically faster. |
302 |
POSIX 1003.2-1992 section 2.5.2.1 page 50 lines 1556-1558 says that |
303 |
only '0' through '9' are digits. Prefer ISDIGIT to isdigit() unless |
304 |
it's important to use the locale's definition of `digit' even when the |
305 |
host does not conform to POSIX. */ |
306 |
#define ISDIGIT(c) ((unsigned) (c) - '0' <= 9) |
307 |
|
308 |
#ifndef iAPX286 |
309 |
# define streq(a, b) \ |
310 |
((a) == (b) || \ |
311 |
(*(a) == *(b) && (*(a) == '\0' || !strcmp ((a) + 1, (b) + 1)))) |
312 |
# ifdef HAVE_CASE_INSENSITIVE_FS |
313 |
/* This is only used on Windows/DOS platforms, so we assume strcmpi(). */ |
314 |
# define strieq(a, b) \ |
315 |
((a) == (b) \ |
316 |
|| (tolower((unsigned char)*(a)) == tolower((unsigned char)*(b)) \ |
317 |
&& (*(a) == '\0' || !strcmpi ((a) + 1, (b) + 1)))) |
318 |
# else |
319 |
# define strieq(a, b) streq(a, b) |
320 |
# endif |
321 |
#else |
322 |
/* Buggy compiler can't handle this. */ |
323 |
# define streq(a, b) (strcmp ((a), (b)) == 0) |
324 |
# define strieq(a, b) (strcmp ((a), (b)) == 0) |
325 |
#endif |
326 |
#define strneq(a, b, l) (strncmp ((a), (b), (l)) == 0) |
327 |
#ifdef VMS |
328 |
extern int strcmpi (const char *,const char *); |
329 |
#endif |
330 |
|
331 |
#if defined(__GNUC__) || defined(ENUM_BITFIELDS) |
332 |
# define ENUM_BITFIELD(bits) :bits |
333 |
#else |
334 |
# define ENUM_BITFIELD(bits) |
335 |
#endif |
336 |
|
337 |
/* Handle gettext and locales. */ |
338 |
|
339 |
#if HAVE_LOCALE_H |
340 |
# include <locale.h> |
341 |
#else |
342 |
# define setlocale(category, locale) |
343 |
#endif |
344 |
|
345 |
#include <gettext.h> |
346 |
|
347 |
#define _(msgid) gettext (msgid) |
348 |
#define N_(msgid) gettext_noop (msgid) |
349 |
#define S_(msg1,msg2,num) ngettext (msg1,msg2,num) |
350 |
|
351 |
/* Handle other OSs. */ |
352 |
#if defined(HAVE_DOS_PATHS) |
353 |
# define PATH_SEPARATOR_CHAR ';' |
354 |
#elif defined(VMS) |
355 |
# define PATH_SEPARATOR_CHAR ',' |
356 |
#else |
357 |
# define PATH_SEPARATOR_CHAR ':' |
358 |
#endif |
359 |
|
360 |
#ifdef WINDOWS32 |
361 |
# include <fcntl.h> |
362 |
# include <malloc.h> |
363 |
# define pipe(p) _pipe(p, 512, O_BINARY) |
364 |
# define kill(pid,sig) w32_kill(pid,sig) |
365 |
|
366 |
extern void sync_Path_environment(void); |
367 |
extern int kill(int pid, int sig); |
368 |
extern int safe_stat(char *file, struct stat *sb); |
369 |
extern char *end_of_token_w32(char *s, char stopchar); |
370 |
extern int find_and_set_default_shell(char *token); |
371 |
|
372 |
/* indicates whether or not we have Bourne shell */ |
373 |
extern int no_default_sh_exe; |
374 |
|
375 |
/* is default_shell unixy? */ |
376 |
extern int unixy_shell; |
377 |
#endif /* WINDOWS32 */ |
378 |
|
379 |
struct floc |
380 |
{ |
381 |
char *filenm; |
382 |
unsigned long lineno; |
383 |
}; |
384 |
#define NILF ((struct floc *)0) |
385 |
|
386 |
#define STRING_SIZE_TUPLE(_s) (_s), (sizeof (_s)-1) |
387 |
|
388 |
|
389 |
/* Fancy processing for variadic functions in both ANSI and pre-ANSI |
390 |
compilers. */ |
391 |
#if defined __STDC__ && __STDC__ |
392 |
extern void message (int prefix, const char *fmt, ...) |
393 |
__attribute__ ((__format__ (__printf__, 2, 3))); |
394 |
extern void error (const struct floc *flocp, const char *fmt, ...) |
395 |
__attribute__ ((__format__ (__printf__, 2, 3))); |
396 |
extern void fatal (const struct floc *flocp, const char *fmt, ...) |
397 |
__attribute__ ((noreturn, __format__ (__printf__, 2, 3))); |
398 |
#else |
399 |
extern void message (); |
400 |
extern void error (); |
401 |
extern void fatal (); |
402 |
#endif |
403 |
|
404 |
extern void die PARAMS ((int)) __attribute__ ((noreturn)); |
405 |
extern void log_working_directory PARAMS ((int)); |
406 |
extern void pfatal_with_name PARAMS ((const char *)) __attribute__ ((noreturn)); |
407 |
extern void perror_with_name PARAMS ((const char *, const char *)); |
408 |
extern char *savestring PARAMS ((const char *, unsigned int)); |
409 |
extern char *concat PARAMS ((const char *, const char *, const char *)); |
410 |
extern char *xmalloc PARAMS ((unsigned int)); |
411 |
extern char *xrealloc PARAMS ((char *, unsigned int)); |
412 |
extern char *xstrdup PARAMS ((const char *)); |
413 |
extern char *find_next_token PARAMS ((char **, unsigned int *)); |
414 |
extern char *next_token PARAMS ((const char *)); |
415 |
extern char *end_of_token PARAMS ((char *)); |
416 |
extern void collapse_continuations PARAMS ((char *)); |
417 |
extern void remove_comments PARAMS((char *)); |
418 |
extern char *sindex PARAMS ((const char *, unsigned int, \ |
419 |
const char *, unsigned int)); |
420 |
extern char *lindex PARAMS ((const char *, const char *, int)); |
421 |
extern int alpha_compare PARAMS ((const void *, const void *)); |
422 |
extern void print_spaces PARAMS ((unsigned int)); |
423 |
extern char *find_char_unquote PARAMS ((char *, int, int, int)); |
424 |
extern char *find_percent PARAMS ((char *)); |
425 |
extern FILE *open_tmpfile PARAMS ((char **, const char *)); |
426 |
|
427 |
#ifndef NO_ARCHIVES |
428 |
extern int ar_name PARAMS ((char *)); |
429 |
extern void ar_parse_name PARAMS ((char *, char **, char **)); |
430 |
extern int ar_touch PARAMS ((char *)); |
431 |
extern time_t ar_member_date PARAMS ((char *)); |
432 |
#endif |
433 |
|
434 |
extern int dir_file_exists_p PARAMS ((char *, char *)); |
435 |
extern int file_exists_p PARAMS ((char *)); |
436 |
extern int file_impossible_p PARAMS ((char *)); |
437 |
extern void file_impossible PARAMS ((char *)); |
438 |
extern char *dir_name PARAMS ((char *)); |
439 |
extern void hash_init_directories PARAMS ((void)); |
440 |
|
441 |
extern void define_default_variables PARAMS ((void)); |
442 |
extern void set_default_suffixes PARAMS ((void)); |
443 |
extern void install_default_suffix_rules PARAMS ((void)); |
444 |
extern void install_default_implicit_rules PARAMS ((void)); |
445 |
|
446 |
extern void build_vpath_lists PARAMS ((void)); |
447 |
extern void construct_vpath_list PARAMS ((char *pattern, char *dirpath)); |
448 |
extern int vpath_search PARAMS ((char **file, FILE_TIMESTAMP *mtime_ptr)); |
449 |
extern int gpath_search PARAMS ((char *file, int len)); |
450 |
|
451 |
extern void construct_include_path PARAMS ((char **arg_dirs)); |
452 |
|
453 |
extern void user_access PARAMS ((void)); |
454 |
extern void make_access PARAMS ((void)); |
455 |
extern void child_access PARAMS ((void)); |
456 |
|
457 |
#ifdef HAVE_VFORK_H |
458 |
# include <vfork.h> |
459 |
#endif |
460 |
|
461 |
/* We omit these declarations on non-POSIX systems which define _POSIX_VERSION, |
462 |
because such systems often declare them in header files anyway. */ |
463 |
|
464 |
#if !defined (__GNU_LIBRARY__) && !defined (POSIX) && !defined (_POSIX_VERSION) && !defined(WINDOWS32) |
465 |
|
466 |
extern long int atol (); |
467 |
# ifndef VMS |
468 |
extern long int lseek (); |
469 |
# endif |
470 |
|
471 |
#endif /* Not GNU C library or POSIX. */ |
472 |
|
473 |
#ifdef HAVE_GETCWD |
474 |
# if !defined(VMS) && !defined(__DECC) |
475 |
extern char *getcwd (); |
476 |
#endif |
477 |
#else |
478 |
extern char *getwd (); |
479 |
# define getcwd(buf, len) getwd (buf) |
480 |
#endif |
481 |
|
482 |
extern const struct floc *reading_file; |
483 |
|
484 |
extern char **environ; |
485 |
|
486 |
extern int just_print_flag, silent_flag, ignore_errors_flag, keep_going_flag; |
487 |
extern int print_data_base_flag, question_flag, touch_flag, always_make_flag; |
488 |
extern int env_overrides, no_builtin_rules_flag, no_builtin_variables_flag; |
489 |
extern int print_version_flag, print_directory_flag; |
490 |
extern int warn_undefined_variables_flag, posix_pedantic, not_parallel; |
491 |
extern int clock_skew_detected; |
492 |
|
493 |
/* can we run commands via 'sh -c xxx' or must we use batch files? */ |
494 |
extern int batch_mode_shell; |
495 |
|
496 |
extern unsigned int job_slots; |
497 |
extern int job_fds[2]; |
498 |
extern int job_rfd; |
499 |
#ifndef NO_FLOAT |
500 |
extern double max_load_average; |
501 |
#else |
502 |
extern int max_load_average; |
503 |
#endif |
504 |
|
505 |
extern char *program; |
506 |
extern char *starting_directory; |
507 |
extern unsigned int makelevel; |
508 |
extern char *version_string, *remote_description, *make_host; |
509 |
|
510 |
extern unsigned int commands_started; |
511 |
|
512 |
extern int handling_fatal_signal; |
513 |
|
514 |
|
515 |
#ifndef MIN |
516 |
#define MIN(_a,_b) ((_a)<(_b)?(_a):(_b)) |
517 |
#endif |
518 |
#ifndef MAX |
519 |
#define MAX(_a,_b) ((_a)>(_b)?(_a):(_b)) |
520 |
#endif |
521 |
|
522 |
#ifdef VMS |
523 |
# define MAKE_SUCCESS 1 |
524 |
# define MAKE_TROUBLE 2 |
525 |
# define MAKE_FAILURE 3 |
526 |
#else |
527 |
# define MAKE_SUCCESS 0 |
528 |
# define MAKE_TROUBLE 1 |
529 |
# define MAKE_FAILURE 2 |
530 |
#endif |
531 |
|
532 |
/* Set up heap debugging library dmalloc. */ |
533 |
|
534 |
#ifdef HAVE_DMALLOC_H |
535 |
#include <dmalloc.h> |
536 |
#endif |
537 |
|
538 |
#ifndef initialize_main |
539 |
# ifdef __EMX__ |
540 |
# define initialize_main(pargc, pargv) \ |
541 |
{ _wildcard(pargc, pargv); _response(pargc, pargv); } |
542 |
# else |
543 |
# define initialize_main(pargc, pargv) |
544 |
# endif |
545 |
#endif |
546 |
|
547 |
|
548 |
#ifdef __EMX__ |
549 |
# if !HAVE_STRCASECMP |
550 |
# define strcasecmp stricmp |
551 |
# endif |
552 |
|
553 |
# if !defined chdir |
554 |
# define chdir _chdir2 |
555 |
# endif |
556 |
# if !defined getcwd |
557 |
# define getcwd _getcwd2 |
558 |
# endif |
559 |
|
560 |
/* NO_CHDIR2 causes make not to use _chdir2() and _getcwd2() instead of |
561 |
chdir() and getcwd(). This avoids some error messages for the |
562 |
make testsuite but restricts the drive letter support. */ |
563 |
# ifdef NO_CHDIR2 |
564 |
# warning NO_CHDIR2: usage of drive letters restricted |
565 |
# undef chdir |
566 |
# undef getcwd |
567 |
# endif |
568 |
#endif |
569 |
|
570 |
#ifndef initialize_main |
571 |
# define initialize_main(pargc, pargv) |
572 |
#endif |
573 |
|
574 |
|
575 |
/* Some systems (like Solaris, PTX, etc.) do not support the SA_RESTART flag |
576 |
properly according to POSIX. So, we try to wrap common system calls with |
577 |
checks for EINTR. Note that there are still plenty of system calls that |
578 |
can fail with EINTR but this, reportedly, gets the vast majority of |
579 |
failure cases. If you still experience failures you'll need to either get |
580 |
a system where SA_RESTART works, or you need to avoid -j. */ |
581 |
|
582 |
#define EINTRLOOP(_v,_c) while (((_v)=_c)==-1 && errno==EINTR) |
583 |
|
584 |
/* While system calls that return integers are pretty consistent about |
585 |
returning -1 on failure and setting errno in that case, functions that |
586 |
return pointers are not always so well behaved. Sometimes they return |
587 |
NULL for expected behavior: one good example is readdir() which returns |
588 |
NULL at the end of the directory--and _doesn't_ reset errno. So, we have |
589 |
to do it ourselves here. */ |
590 |
|
591 |
#define ENULLLOOP(_v,_c) do{ errno = 0; \ |
592 |
while (((_v)=_c)==0 && errno==EINTR); }while(0) |
593 |
|