VirtualBox

source: kBuild/trunk/src/kmk/makeint.h@ 3432

Last change on this file since 3432 was 3432, checked in by bird, 5 years ago

kmk: Quick output hack to repeat the failure output at the end of die() as it may easily get lost in output from other jobs (problem on systems with lots of cores).

  • Property svn:eol-style set to native
File size: 34.7 KB
Line 
1/* Miscellaneous global declarations and portability cruft for GNU Make.
2Copyright (C) 1988-2016 Free Software Foundation, Inc.
3This file is part of GNU Make.
4
5GNU Make is free software; you can redistribute it and/or modify it under the
6terms of the GNU General Public License as published by the Free Software
7Foundation; either version 3 of the License, or (at your option) any later
8version.
9
10GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
11WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12A PARTICULAR PURPOSE. See the GNU General Public License for more details.
13
14You should have received a copy of the GNU General Public License along with
15this program. If not, see <http://www.gnu.org/licenses/>. */
16
17/* We use <config.h> instead of "config.h" so that a compilation
18 using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h
19 (which it would do because makeint.h was found in $srcdir). */
20#include <config.h>
21#undef HAVE_CONFIG_H
22#define HAVE_CONFIG_H 1
23
24#include <k/kDefs.h> /* bird */
25
26/* Specify we want GNU source code. This must be defined before any
27 system headers are included. */
28
29#define _GNU_SOURCE 1
30
31/* AIX requires this to be the first thing in the file. */
32#if HAVE_ALLOCA_H
33# include <alloca.h>
34#else
35# ifdef _AIX
36 #pragma alloca
37# else
38# if !defined(__GNUC__) && !defined(WINDOWS32)
39# ifndef alloca /* predefined by HP cc +Olibcalls */
40char *alloca ();
41# endif
42# endif
43# endif
44#endif
45
46/* Disable assert() unless we're a maintainer.
47 Some asserts are compute-intensive. */
48#ifndef MAKE_MAINTAINER_MODE
49# define NDEBUG 1
50#endif
51
52/* Include the externally-visible content.
53 Be sure to use the local one, and not one installed on the system.
54 Define GMK_BUILDING_MAKE for proper selection of dllexport/dllimport
55 declarations for MS-Windows. */
56#ifdef WINDOWS32
57# define GMK_BUILDING_MAKE
58#endif
59#include "gnumake.h"
60
61#ifdef CRAY
62/* This must happen before #include <signal.h> so
63 that the declaration therein is changed. */
64# define signal bsdsignal
65#endif
66
67/* If we're compiling for the dmalloc debugger, turn off string inlining. */
68#if defined(HAVE_DMALLOC_H) && defined(__GNUC__)
69# define __NO_STRING_INLINES
70#endif
71
72#include <sys/types.h>
73#include <sys/stat.h>
74#include <signal.h>
75#include <stdio.h>
76#include <ctype.h>
77
78#ifdef HAVE_SYS_TIMEB_H
79/* SCO 3.2 "devsys 4.2" has a prototype for 'ftime' in <time.h> that bombs
80 unless <sys/timeb.h> has been included first. */
81# include <sys/timeb.h>
82#endif
83#if TIME_WITH_SYS_TIME
84# include <sys/time.h>
85# include <time.h>
86#else
87# if HAVE_SYS_TIME_H
88# include <sys/time.h>
89# else
90# include <time.h>
91# endif
92#endif
93
94#include <errno.h>
95
96#ifndef errno
97extern int errno;
98#endif
99
100#ifdef __VMS
101/* In strict ANSI mode, VMS compilers should not be defining the
102 VMS macro. Define it here instead of a bulk edit for the correct code.
103 */
104# ifndef VMS
105# define VMS
106# endif
107#endif
108
109#ifdef HAVE_UNISTD_H
110# include <unistd.h>
111/* Ultrix's unistd.h always defines _POSIX_VERSION, but you only get
112 POSIX.1 behavior with 'cc -YPOSIX', which predefines POSIX itself! */
113# if defined (_POSIX_VERSION) && !defined (ultrix) && !defined (VMS)
114# define POSIX 1
115# endif
116#endif
117
118/* Some systems define _POSIX_VERSION but are not really POSIX.1. */
119#if (defined (butterfly) || defined (__arm) || (defined (__mips) && defined (_SYSTYPE_SVR3)) || (defined (sequent) && defined (i386)))
120# undef POSIX
121#endif
122
123#if !defined (POSIX) && defined (_AIX) && defined (_POSIX_SOURCE)
124# define POSIX 1
125#endif
126
127#ifndef RETSIGTYPE
128# define RETSIGTYPE void
129#endif
130
131#ifndef sigmask
132# define sigmask(sig) (1 << ((sig) - 1))
133#endif
134
135#ifndef HAVE_SA_RESTART
136# define SA_RESTART 0
137#endif
138
139#ifdef HAVE_VFORK_H
140# include <vfork.h>
141#endif
142
143#ifdef HAVE_LIMITS_H
144# include <limits.h>
145#endif
146#ifdef HAVE_SYS_PARAM_H
147# include <sys/param.h>
148#endif
149
150#ifndef PATH_MAX
151# ifndef POSIX
152# define PATH_MAX MAXPATHLEN
153# endif
154#endif
155#ifndef MAXPATHLEN
156# define MAXPATHLEN 1024
157#endif
158
159#ifdef PATH_MAX
160# define GET_PATH_MAX PATH_MAX
161# define PATH_VAR(var) char var[PATH_MAX]
162#else
163# define NEED_GET_PATH_MAX 1
164# define GET_PATH_MAX (get_path_max ())
165# define PATH_VAR(var) char *var = alloca (GET_PATH_MAX)
166unsigned int get_path_max (void);
167#endif
168
169#if defined (KMK) || defined (CONFIG_WITH_VALUE_LENGTH) \
170 || defined (CONFIG_WITH_ALLOC_CACHES) \
171 || defined (CONFIG_WITH_STRCACHE2)
172# ifdef _MSC_VER
173# define MY_INLINE _inline static
174# elif defined(__GNUC__)
175# define MY_INLINE static __inline__
176# else
177# define MY_INLINE static
178# endif
179
180# ifdef __GNUC__
181# define MY_PREDICT_TRUE(expr) __builtin_expect(!!(expr), 1)
182# define MY_PREDICT_FALSE(expr) __builtin_expect(!!(expr), 0)
183# else
184# define MY_PREDICT_TRUE(expr) (expr)
185# define MY_PREDICT_FALSE(expr) (expr)
186# endif
187#endif
188
189#if defined (KMK) || defined (CONFIG_WITH_VALUE_LENGTH) \
190 || defined (CONFIG_WITH_STRCACHE2)
191# ifdef _MSC_VER
192# define MY_DBGBREAK __debugbreak()
193# elif defined(__GNUC__)
194# if defined(__i386__) || defined(__x86_64__)
195# define MY_DBGBREAK __asm__ __volatile__ ("int3")
196# else
197# define MY_DBGBREAK assert(0)
198# endif
199# else
200# define MY_DBGBREAK assert(0)
201# endif
202# ifndef NDEBUG
203# define MY_ASSERT_MSG(expr, printfargs) \
204 do { if (!(expr)) { printf printfargs; MY_DBGBREAK; } } while (0)
205# else
206# define MY_ASSERT_MSG(expr, printfargs) do { } while (0)
207# endif
208#endif
209
210#ifdef KMK
211/** @todo measure performance diff here! */
212# if 0 /* See if this speeds things up (Windows is doing this anyway, so,
213 we might as well try be consistent in speed + features). */
214# define MY_IS_BLANK(ch) ((ch) == ' ' || (ch) == '\t')
215# define MY_IS_BLANK_OR_EOS(ch) ((ch) == ' ' || (ch) == '\t' || (ch) == '\0')
216# else
217# define MY_IS_BLANK(ch) ISBLANK ((ch))
218# define MY_IS_BLANK_OR_EOS(ch) (ISBLANK ((ch)) || (ch) == '\0')
219# endif
220#endif
221
222#ifdef CONFIG_WITH_MAKE_STATS
223extern long make_stats_allocations;
224extern long make_stats_reallocations;
225extern unsigned long make_stats_allocated;
226extern unsigned long make_stats_ht_lookups;
227extern unsigned long make_stats_ht_collisions;
228
229# ifdef __APPLE__
230# include <malloc/malloc.h>
231# define SIZE_OF_HEAP_BLOCK(ptr) malloc_size(ptr)
232
233# elif defined(__linux__) /* glibc */
234# include <malloc.h>
235# define SIZE_OF_HEAP_BLOCK(ptr) malloc_usable_size(ptr)
236
237# elif defined(_MSC_VER) || defined(__OS2__)
238# define SIZE_OF_HEAP_BLOCK(ptr) _msize(ptr)
239
240# else
241# include <stdlib.h>
242# define SIZE_OF_HEAP_BLOCK(ptr) 0
243#endif
244
245# define MAKE_STATS_3(expr) do { expr; } while (0)
246# define MAKE_STATS_2(expr) do { expr; } while (0)
247# define MAKE_STATS(expr) do { expr; } while (0)
248#else
249# define MAKE_STATS_3(expr) do { } while (0)
250# define MAKE_STATS_2(expr) do { } while (0)
251# define MAKE_STATS(expr) do { } while (0)
252#endif
253
254/* bird - start */
255#ifdef _MSC_VER
256# include <intrin.h>
257# define CURRENT_CLOCK_TICK() __rdtsc()
258#else
259# define CURRENT_CLOCK_TICK() 0
260#endif
261
262#define COMMA ,
263#ifdef CONFIG_WITH_VALUE_LENGTH
264# define IF_WITH_VALUE_LENGTH(a_Expr) a_Expr
265# define IF_WITH_VALUE_LENGTH_PARAM(a_Expr) , a_Expr
266#else
267# define IF_WITH_VALUE_LENGTH(a_Expr)
268# define IF_WITH_VALUE_LENGTH_PARAM(a_Expr)
269#endif
270
271#ifdef CONFIG_WITH_ALLOC_CACHES
272# define IF_WITH_ALLOC_CACHES(a_Expr) a_Expr
273# define IF_WITH_ALLOC_CACHES_PARAM(a_Expr) , a_Expr
274#else
275# define IF_WITH_ALLOC_CACHES(a_Expr)
276# define IF_WITH_ALLOC_CACHES_PARAM(a_Expr)
277#endif
278
279#ifdef CONFIG_WITH_COMMANDS_FUNC
280# define IF_WITH_COMMANDS_FUNC(a_Expr) a_Expr
281# define IF_WITH_COMMANDS_FUNC_PARAM(a_Expr) , a_Expr
282#else
283# define IF_WITH_COMMANDS_FUNC(a_Expr)
284# define IF_WITH_COMMANDS_FUNC_PARAM(a_Expr)
285#endif
286
287/* bird - end */
288
289
290#ifndef CHAR_BIT
291# define CHAR_BIT 8
292#endif
293
294#ifndef USHRT_MAX
295# define USHRT_MAX 65535
296#endif
297
298/* Nonzero if the integer type T is signed.
299 Use <= to avoid GCC warnings about always-false expressions. */
300#define INTEGER_TYPE_SIGNED(t) ((t) -1 <= 0)
301
302/* The minimum and maximum values for the integer type T.
303 Use ~ (t) 0, not -1, for portability to 1's complement hosts. */
304#define INTEGER_TYPE_MINIMUM(t) \
305 (! INTEGER_TYPE_SIGNED (t) ? (t) 0 : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))
306#define INTEGER_TYPE_MAXIMUM(t) (~ (t) 0 - INTEGER_TYPE_MINIMUM (t))
307
308#ifndef CHAR_MAX
309# define CHAR_MAX INTEGER_TYPE_MAXIMUM (char)
310#endif
311
312#ifdef STAT_MACROS_BROKEN
313# ifdef S_ISREG
314# undef S_ISREG
315# endif
316# ifdef S_ISDIR
317# undef S_ISDIR
318# endif
319#endif /* STAT_MACROS_BROKEN. */
320
321#ifndef S_ISREG
322# define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
323#endif
324#ifndef S_ISDIR
325# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
326#endif
327
328#ifdef VMS
329# include <fcntl.h>
330# include <types.h>
331# include <unixlib.h>
332# include <unixio.h>
333# include <perror.h>
334/* Needed to use alloca on VMS. */
335# include <builtins.h>
336
337extern int vms_use_mcr_command;
338extern int vms_always_use_cmd_file;
339extern int vms_gnv_shell;
340extern int vms_comma_separator;
341extern int vms_legacy_behavior;
342extern int vms_unix_simulation;
343#endif
344
345#ifndef __attribute__
346/* This feature is available in gcc versions 2.5 and later. */
347# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
348# define __attribute__(x)
349# endif
350/* The __-protected variants of 'format' and 'printf' attributes
351 are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */
352# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
353# define __format__ format
354# define __printf__ printf
355# endif
356#endif
357#define UNUSED __attribute__ ((unused))
358
359#if defined (STDC_HEADERS) || defined (__GNU_LIBRARY__)
360# include <stdlib.h>
361# include <string.h>
362# define ANSI_STRING 1
363#else /* No standard headers. */
364# ifdef HAVE_STRING_H
365# include <string.h>
366# define ANSI_STRING 1
367# else
368# include <strings.h>
369# endif
370# ifdef HAVE_MEMORY_H
371# include <memory.h>
372# endif
373# ifdef HAVE_STDLIB_H
374# include <stdlib.h>
375# else
376void *malloc (int);
377void *realloc (void *, int);
378void free (void *);
379
380void abort (void) __attribute__ ((noreturn));
381void exit (int) __attribute__ ((noreturn));
382# endif /* HAVE_STDLIB_H. */
383
384#endif /* Standard headers. */
385
386/* These should be in stdlib.h. Make sure we have them. */
387#ifndef EXIT_SUCCESS
388# define EXIT_SUCCESS 0
389#endif
390#ifndef EXIT_FAILURE
391# define EXIT_FAILURE 1
392#endif
393
394#ifndef ANSI_STRING
395
396/* SCO Xenix has a buggy macro definition in <string.h>. */
397#undef strerror
398#if !defined(__DECC)
399char *strerror (int errnum);
400#endif
401
402#endif /* !ANSI_STRING. */
403#undef ANSI_STRING
404
405#if HAVE_INTTYPES_H
406# include <inttypes.h>
407#endif
408#if HAVE_STDINT_H
409# include <stdint.h>
410#endif
411#define FILE_TIMESTAMP uintmax_t
412
413#if !defined(HAVE_STRSIGNAL)
414char *strsignal (int signum);
415#endif
416
417/* ISDIGIT offers the following features:
418 - Its arg may be any int or unsigned int; it need not be an unsigned char.
419 - It's guaranteed to evaluate its argument exactly once.
420 NOTE! Make relies on this behavior, don't change it!
421 - It's typically faster.
422 POSIX 1003.2-1992 section 2.5.2.1 page 50 lines 1556-1558 says that
423 only '0' through '9' are digits. Prefer ISDIGIT to isdigit() unless
424 it's important to use the locale's definition of 'digit' even when the
425 host does not conform to POSIX. */
426#define ISDIGIT(c) ((unsigned) (c) - '0' <= 9)
427
428/* Test if two strings are equal. Is this worthwhile? Should be profiled. */
429#define streq(a, b) \
430 ((a) == (b) || \
431 (*(a) == *(b) && (*(a) == '\0' || !strcmp ((a) + 1, (b) + 1))))
432
433/* Test if two strings are equal, but match case-insensitively on systems
434 which have case-insensitive filesystems. Should only be used for
435 filenames! */
436#ifdef HAVE_CASE_INSENSITIVE_FS
437# define patheq(a, b) \
438 ((a) == (b) \
439 || (tolower((unsigned char)*(a)) == tolower((unsigned char)*(b)) \
440 && (*(a) == '\0' || !strcasecmp ((a) + 1, (b) + 1))))
441#else
442# define patheq(a, b) streq(a, b)
443#endif
444
445#define strneq(a, b, l) (strncmp ((a), (b), (l)) == 0)
446
447#if (defined(__GNUC__) || defined(ENUM_BITFIELDS)) && !defined(NO_ENUM_BITFIELDS) /* bird: NO_ENUM_BITFIELDS */
448# define ENUM_BITFIELD(bits) :bits
449#else
450# define ENUM_BITFIELD(bits)
451#endif
452
453/* Handle gettext and locales. */
454
455#if HAVE_LOCALE_H
456# include <locale.h>
457#else
458# define setlocale(category, locale)
459#endif
460
461#include <gettext.h>
462
463#define _(msgid) gettext (msgid)
464#define N_(msgid) gettext_noop (msgid)
465#define S_(msg1,msg2,num) ngettext (msg1,msg2,num)
466
467/* This is needed for getcwd() and chdir(), on some W32 systems. */
468#if defined(HAVE_DIRECT_H)
469# include <direct.h>
470#endif
471
472#ifdef WINDOWS32
473# include <fcntl.h>
474# include <malloc.h>
475# define pipe(_p) _pipe((_p), 512, O_BINARY)
476# ifndef CONFIG_NEW_WIN_CHILDREN /* (only used by commands.c) */
477# define kill(_pid,_sig) w32_kill((_pid),(_sig))
478# endif
479/* MSVC and Watcom C don't have ftruncate. */
480# if defined(_MSC_VER) || defined(__WATCOMC__)
481# define ftruncate(_fd,_len) _chsize(_fd,_len)
482# endif
483/* MinGW64 doesn't have _S_ISDIR. */
484# ifndef _S_ISDIR
485# define _S_ISDIR(m) S_ISDIR(m)
486# endif
487
488void sync_Path_environment (void);
489# ifndef CONFIG_NEW_WIN_CHILDREN /* (only used by commands.c) */
490int w32_kill (pid_t pid, int sig);
491# endif
492int find_and_set_default_shell (const char *token);
493
494/* indicates whether or not we have Bourne shell */
495extern int no_default_sh_exe;
496
497/* is default_shell unixy? */
498extern int unixy_shell;
499
500/* We don't have a preferred fixed value for LOCALEDIR. */
501# ifndef LOCALEDIR
502# define LOCALEDIR NULL
503# endif
504
505/* Include only the minimal stuff from windows.h. */
506# define WIN32_LEAN_AND_MEAN
507#endif /* WINDOWS32 */
508
509#define ANY_SET(_v,_m) (((_v)&(_m)) != 0)
510#define NONE_SET(_v,_m) (! ANY_SET ((_v),(_m)))
511
512#define MAP_NUL 0x0001
513#define MAP_BLANK 0x0002
514#define MAP_NEWLINE 0x0004
515#define MAP_COMMENT 0x0008
516#define MAP_SEMI 0x0010
517#define MAP_EQUALS 0x0020
518#define MAP_COLON 0x0040
519#define MAP_PERCENT 0x0080
520#define MAP_PIPE 0x0100
521#define MAP_DOT 0x0200
522#define MAP_COMMA 0x0400
523
524/* These are the valid characters for a user-defined function. */
525#define MAP_USERFUNC 0x2000
526/* This means not only a '$', but skip the variable reference. */
527#define MAP_VARIABLE 0x4000
528/* The set of characters which are directory separators is OS-specific. */
529#define MAP_DIRSEP 0x8000
530
531#ifdef VMS
532# define MAP_VMSCOMMA MAP_COMMA
533#else
534# define MAP_VMSCOMMA 0x0000
535#endif
536
537#define MAP_SPACE (MAP_BLANK|MAP_NEWLINE)
538
539/* Handle other OSs.
540 To overcome an issue parsing paths in a DOS/Windows environment when
541 built in a unix based environment, override the PATH_SEPARATOR_CHAR
542 definition unless being built for Cygwin. */
543#if defined(HAVE_DOS_PATHS) && !defined(__CYGWIN__)
544# undef PATH_SEPARATOR_CHAR
545# define PATH_SEPARATOR_CHAR ';'
546# define MAP_PATHSEP MAP_SEMI
547#elif !defined(PATH_SEPARATOR_CHAR)
548# if defined (VMS)
549# define PATH_SEPARATOR_CHAR (vms_comma_separator ? ',' : ':')
550# define MAP_PATHSEP (vms_comma_separator ? MAP_COMMA : MAP_SEMI)
551# else
552# define PATH_SEPARATOR_CHAR ':'
553# define MAP_PATHSEP MAP_COLON
554# endif
555#elif PATH_SEPARATOR_CHAR == ':'
556# define MAP_PATHSEP MAP_COLON
557#elif PATH_SEPARATOR_CHAR == ';'
558# define MAP_PATHSEP MAP_SEMI
559#elif PATH_SEPARATOR_CHAR == ','
560# define MAP_PATHSEP MAP_COMMA
561#else
562# error "Unknown PATH_SEPARATOR_CHAR"
563#endif
564
565#define STOP_SET(_v,_m) ANY_SET(stopchar_map[(unsigned char)(_v)],(_m))
566
567#define ISBLANK(c) STOP_SET((c),MAP_BLANK)
568#define ISSPACE(c) STOP_SET((c),MAP_SPACE)
569#define NEXT_TOKEN(s) while (ISSPACE (*(s))) ++(s)
570#define END_OF_TOKEN(s) while (! STOP_SET (*(s), MAP_SPACE|MAP_NUL)) ++(s)
571
572#if defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_GETRLIMIT) && defined(HAVE_SETRLIMIT)
573# define SET_STACK_SIZE
574#endif
575#ifdef SET_STACK_SIZE
576# include <sys/resource.h>
577extern struct rlimit stack_limit;
578#endif
579
580#include "glob.h" /* bird double quotes */
581
582#define NILF ((floc *)0)
583
584#define CSTRLEN(_s) (sizeof (_s)-1)
585#define STRING_SIZE_TUPLE(_s) (_s), CSTRLEN(_s) /* The number of bytes needed to represent the largest integer as a string. */
586#define INTSTR_LENGTH CSTRLEN ("18446744073709551616")
587
588#define DEFAULT_TTYNAME "true"
589#ifdef HAVE_TTYNAME
590# define TTYNAME(_f) ttyname (_f)
591#else
592# define TTYNAME(_f) DEFAULT_TTYNAME
593#endif
594
595
596
597
598/* Specify the location of elements read from makefiles. */
599typedef struct
600 {
601 const char *filenm;
602 unsigned long lineno;
603 unsigned long offset;
604 } floc;
605
606#if defined (CONFIG_WITH_MATH) /* bird start */ \
607 || defined (CONFIG_WITH_NANOTS) \
608 || defined (CONFIG_WITH_FILE_SIZE) \
609 || defined (CONFIG_WITH_PRINT_TIME_SWITCH)
610# ifdef _MSC_VER
611typedef __int64 big_int;
612# define BIG_INT_C(c) (c ## LL)
613typedef unsigned __int64 big_uint;
614# define BIG_UINT_C(c) (c ## ULL)
615# else
616# include <stdint.h>
617typedef int64_t big_int;
618# define BIG_INT_C(c) INT64_C(c)
619typedef uint64_t big_uint;
620# define BIG_UINT_C(c) UINT64_C(c)
621# endif
622#endif /* bird end */
623
624const char *concat (unsigned int, ...);
625void message (int prefix, size_t length, const char *fmt, ...)
626 __attribute__ ((__format__ (__printf__, 3, 4)));
627void error (const floc *flocp, size_t length, const char *fmt, ...)
628 __attribute__ ((__format__ (__printf__, 3, 4)));
629void fatal (const floc *flocp, size_t length, const char *fmt, ...)
630 __attribute__ ((noreturn, __format__ (__printf__, 3, 4)));
631
632#define O(_t,_a,_f) _t((_a), 0, (_f))
633#define OS(_t,_a,_f,_s) _t((_a), strlen (_s), (_f), (_s))
634#define OSS(_t,_a,_f,_s1,_s2) _t((_a), strlen (_s1) + strlen (_s2), \
635 (_f), (_s1), (_s2))
636#define OSSS(_t,_a,_f,_s1,_s2,_s3) _t((_a), strlen (_s1) + strlen (_s2) + strlen (_s3), \
637 (_f), (_s1), (_s2), (_s3))
638#define ON(_t,_a,_f,_n) _t((_a), INTSTR_LENGTH, (_f), (_n))
639#define ONN(_t,_a,_f,_n1,_n2) _t((_a), INTSTR_LENGTH*2, (_f), (_n1), (_n2))
640
641#define OSN(_t,_a,_f,_s,_n) _t((_a), strlen (_s) + INTSTR_LENGTH, \
642 (_f), (_s), (_n))
643#define ONS(_t,_a,_f,_n,_s) _t((_a), INTSTR_LENGTH + strlen (_s), \
644 (_f), (_n), (_s))
645
646/* bird: more wrappers */
647#define OSNN(_t,_a,_f,_s,_n1,_n2) _t((_a), strlen (_s) + INTSTR_LENGTH + INTSTR_LENGTH, \
648 (_f), (_s), (_n1), (_n2)) /* bird */
649#define OSNS(_t,_a,_f,_s1,_n,_s2) _t((_a), strlen (_s1) + strlen (_s2) + INTSTR_LENGTH, \
650 (_f), (_s1), (_n), (_s2)) /* bird */
651#define OSSSS(_t,_a,_f,_s1,_s2,_s3,_s4) _t((_a), strlen (_s1) + strlen (_s2) + strlen (_s3) + strlen (_s4), \
652 (_f), (_s1), (_s2), (_s3), (_s4)) /* bird */
653#define OSSN(_t,_a,_f,_s1,_s2,_n) _t((_a), strlen (_s1) + strlen (_s2) + INTSTR_LENGTH, \
654 (_f), (_s1), (_s2), (_n)) /* bird */
655#define OSSNS(_t,_a,_f,_s1,_s2,_n,_s3) _t((_a), strlen (_s1) + strlen (_s2) + strlen (_s3) + INTSTR_LENGTH, \
656 (_f), (_s1), (_s2), (_n), (_s3)) /* bird */
657#define ONNS(_t,_a,_f,_n1,_n2,_s1) _t((_a), INTSTR_LENGTH * 2 + strlen (_s1), \
658 (_f), (_n1), (_n2), (_s1)) /* bird */
659#define ONNNS(_t,_a,_f,_n1,_n2,_n3,_s1) _t((_a), INTSTR_LENGTH * 3 + strlen (_s1), \
660 (_f), (_n1), (_n2), (_n3), (_s1)) /* bird */
661
662#define OUT_OF_MEM() O (fatal, NILF, _("virtual memory exhausted"))
663
664void die (int) __attribute__ ((noreturn));
665void die_with_job_output (int, struct output *) __attribute__ ((noreturn));
666void pfatal_with_name (const char *) __attribute__ ((noreturn));
667void perror_with_name (const char *, const char *);
668#define xstrlen(_s) ((_s)==NULL ? 0 : strlen (_s))
669void *xmalloc (unsigned int);
670void *xcalloc (unsigned int);
671void *xrealloc (void *, unsigned int);
672char *xstrdup (const char *);
673char *xstrndup (const char *, unsigned int);
674#ifdef CONFIG_WITH_PRINT_STATS_SWITCH
675void print_heap_stats (void);
676#endif
677char *find_next_token (const char **, unsigned int *);
678char *next_token (const char *);
679char *end_of_token (const char *);
680#ifdef KMK
681char *find_next_token_eos (const char **ptr, const char *eos, unsigned int *lengthptr);
682char *find_next_file_token (const char **ptr, const char *eos, unsigned int *lengthptr);
683#endif
684#ifndef CONFIG_WITH_VALUE_LENGTH
685void collapse_continuations (char *);
686#else
687char *collapse_continuations (char *, unsigned int);
688#endif
689#ifdef CONFIG_WITH_OPTIMIZATION_HACKS /* memchr is usually compiler intrinsic, thus faster. */
690# define lindex(s, limit, c) ((char *)memchr((s), (c), (limit) - (s)))
691#else
692char *lindex (const char *, const char *, int);
693#endif
694int alpha_compare (const void *, const void *);
695void print_spaces (unsigned int);
696char *find_percent (char *);
697const char *find_percent_cached (const char **);
698
699#ifndef NO_ARCHIVES
700int ar_name (const char *);
701void ar_parse_name (const char *, char **, char **);
702int ar_touch (const char *);
703time_t ar_member_date (const char *);
704
705typedef long int (*ar_member_func_t) (int desc, const char *mem, int truncated,
706 long int hdrpos, long int datapos,
707 long int size, long int date, int uid,
708 int gid, unsigned int mode,
709 const void *arg);
710
711long int ar_scan (const char *archive, ar_member_func_t function, const void *arg);
712int ar_name_equal (const char *name, const char *mem, int truncated);
713#ifndef VMS
714int ar_member_touch (const char *arname, const char *memname);
715#endif
716#endif
717
718int dir_file_exists_p (const char *, const char *);
719int file_exists_p (const char *);
720int file_impossible_p (const char *);
721void file_impossible (const char *);
722const char *dir_name (const char *);
723void print_dir_data_base (void);
724void dir_setup_glob (glob_t *);
725void hash_init_directories (void);
726#if defined (KMK) && defined (KBUILD_OS_WINDOWS)
727int utf16_regular_file_p(const wchar_t *pwszPath);
728#endif
729
730void define_default_variables (void);
731void undefine_default_variables (void);
732void set_default_suffixes (void);
733void install_default_suffix_rules (void);
734void install_default_implicit_rules (void);
735
736void build_vpath_lists (void);
737void construct_vpath_list (char *pattern, char *dirpath);
738const char *vpath_search (const char *file, FILE_TIMESTAMP *mtime_ptr,
739 unsigned int* vpath_index, unsigned int* path_index);
740int gpath_search (const char *file, unsigned int len);
741
742void construct_include_path (const char **arg_dirs);
743
744void user_access (void);
745void make_access (void);
746void child_access (void);
747
748char *strip_whitespace (const char **begpp, const char **endpp);
749
750void show_goal_error (void);
751
752
753#ifdef CONFIG_WITH_ALLOC_CACHES /* bird start */
754/* alloccache (misc.c) */
755
756struct alloccache_free_ent
757{
758 struct alloccache_free_ent *next;
759};
760
761struct alloccache
762{
763 char *free_start;
764 char *free_end;
765 struct alloccache_free_ent *free_head;
766 unsigned int size;
767 unsigned int total_count;
768 unsigned long alloc_count;
769 unsigned long free_count;
770 const char *name;
771 struct alloccache *next;
772 void *grow_arg;
773 void *(*grow_alloc)(void *grow_arg, unsigned int size);
774};
775
776void alloccache_init (struct alloccache *cache, unsigned int size, const char *name,
777 void *(*grow_alloc)(void *grow_arg, unsigned int size), void *grow_arg);
778void alloccache_term (struct alloccache *cache,
779 void (*term_free)(void *term_arg, void *ptr, unsigned int size), void *term_arg);
780void alloccache_join (struct alloccache *cache, struct alloccache *eat);
781void alloccache_print (struct alloccache *cache);
782void alloccache_print_all (void);
783struct alloccache_free_ent *alloccache_alloc_grow (struct alloccache *cache);
784void alloccache_free (struct alloccache *cache, void *item);
785
786/* Allocate an item. */
787MY_INLINE void *
788alloccache_alloc (struct alloccache *cache)
789{
790 struct alloccache_free_ent *f;
791# ifndef CONFIG_WITH_ALLOCCACHE_DEBUG
792 f = cache->free_head;
793 if (f)
794 cache->free_head = f->next;
795 else if (cache->free_start != cache->free_end)
796 {
797 f = (struct alloccache_free_ent *)cache->free_start;
798 cache->free_start += cache->size;
799 }
800 else
801# endif
802 f = alloccache_alloc_grow (cache);
803 MAKE_STATS(cache->alloc_count++;);
804 return f;
805}
806
807/* Allocate a cleared item. */
808MY_INLINE void *
809alloccache_calloc (struct alloccache *cache)
810{
811 void *item = alloccache_alloc (cache);
812 memset (item, '\0', cache->size);
813 return item;
814}
815
816
817/* the alloc caches */
818extern struct alloccache dep_cache;
819extern struct alloccache goaldep_cache;
820extern struct alloccache nameseq_cache;
821extern struct alloccache file_cache;
822extern struct alloccache commands_cache;
823extern struct alloccache variable_cache;
824extern struct alloccache variable_set_cache;
825extern struct alloccache variable_set_list_cache;
826
827#endif /* CONFIG_WITH_ALLOC_CACHES - bird end*/
828
829
830/* String caching */
831void strcache_init (void);
832void strcache_print_stats (const char *prefix);
833#ifndef CONFIG_WITH_STRCACHE2 /* bird */
834int strcache_iscached (const char *str);
835const char *strcache_add (const char *str);
836const char *strcache_add_len (const char *str, unsigned int len);
837#else /* CONFIG_WITH_STRCACHE2 */
838
839# include "strcache2.h"
840extern struct strcache2 file_strcache;
841extern const char *suffixes_strcached;
842
843# define strcache_iscached(str) strcache2_is_cached(&file_strcache, str)
844# define strcache_add(str) strcache2_add_file(&file_strcache, str, strlen (str))
845# define strcache_add_len(str, len) strcache2_add_file(&file_strcache, str, len)
846# define strcache_get_len(str) strcache2_get_len(&file_strcache, str) /* FIXME: replace this and related checks ... */
847
848#endif /* CONFIG_WITH_STRCACHE2 */
849
850/* Guile support */
851int guile_gmake_setup (const floc *flocp);
852
853/* Loadable object support. Sets to the strcached name of the loaded file. */
854typedef int (*load_func_t)(const floc *flocp);
855int load_file (const floc *flocp, const char **filename, int noerror);
856void unload_file (const char *name);
857
858/* We omit these declarations on non-POSIX systems which define _POSIX_VERSION,
859 because such systems often declare them in header files anyway. */
860
861#if !defined (__GNU_LIBRARY__) && !defined (POSIX) && !defined (_POSIX_VERSION) && !defined(WINDOWS32)
862
863long int atol ();
864# ifndef VMS
865long int lseek ();
866# endif
867
868# ifdef HAVE_GETCWD
869# if !defined(VMS) && !defined(__DECC) && !defined(_MSC_VER) /* bird: MSC */
870char *getcwd ();
871# endif
872# else
873char *getwd ();
874# define getcwd(buf, len) getwd (buf)
875# endif
876
877#endif /* Not GNU C library or POSIX. */
878
879#if !HAVE_STRCASECMP
880# if HAVE_STRICMP
881# define strcasecmp stricmp
882# elif HAVE_STRCMPI
883# define strcasecmp strcmpi
884# else
885/* Create our own, in misc.c */
886int strcasecmp (const char *s1, const char *s2);
887# endif
888#endif
889
890#if !HAVE_STRNCASECMP
891# if HAVE_STRNICMP
892# define strncasecmp strnicmp
893# elif HAVE_STRNCMPI
894# define strncasecmp strncmpi
895# else
896/* Create our own, in misc.c */
897int strncasecmp (const char *s1, const char *s2, int n);
898# endif
899#endif
900
901#define OUTPUT_SYNC_NONE 0
902#define OUTPUT_SYNC_LINE 1
903#define OUTPUT_SYNC_TARGET 2
904#define OUTPUT_SYNC_RECURSE 3
905
906#if !defined(_MSC_VER) /* bird */
907/* Non-GNU systems may not declare this in unistd.h. */
908extern char **environ;
909#endif
910
911extern const floc *reading_file;
912extern const floc **expanding_var;
913
914extern unsigned short stopchar_map[];
915
916extern int just_print_flag, silent_flag, ignore_errors_flag, keep_going_flag;
917extern int print_data_base_flag, question_flag, touch_flag, always_make_flag;
918extern int env_overrides, no_builtin_rules_flag, no_builtin_variables_flag;
919extern int print_version_flag, print_directory_flag, check_symlink_flag;
920extern int warn_undefined_variables_flag, trace_flag, posix_pedantic;
921extern int not_parallel, second_expansion, clock_skew_detected;
922extern int rebuilding_makefiles, one_shell, output_sync, verify_flag;
923
924#ifdef CONFIG_WITH_2ND_TARGET_EXPANSION /* bird start */
925extern int second_target_expansion;
926#endif
927#ifdef CONFIG_PRETTY_COMMAND_PRINTING
928extern int pretty_command_printing;
929#endif
930#ifdef CONFIG_WITH_PRINT_TIME_SWITCH
931extern int print_time_min, print_time_width;
932#endif
933#if defined (CONFIG_WITH_MAKE_STATS) || defined (CONFIG_WITH_MINIMAL_STATS)
934extern int make_expensive_statistics;
935#endif /* bird end */
936
937extern const char *default_shell;
938
939/* can we run commands via 'sh -c xxx' or must we use batch files? */
940extern int batch_mode_shell;
941
942/* Resetting the command script introduction prefix character. */
943#define RECIPEPREFIX_NAME ".RECIPEPREFIX"
944#define RECIPEPREFIX_DEFAULT '\t'
945extern char cmd_prefix;
946
947extern unsigned int job_slots;
948#ifndef NO_FLOAT
949extern double max_load_average;
950#else
951extern int max_load_average;
952#endif
953
954#ifdef WINDOWS32
955extern char *program;
956#else
957extern const char *program;
958#endif
959
960#ifdef VMS
961const char *vms_command (const char *argv0);
962const char *vms_progname (const char *argv0);
963
964void vms_exit (int);
965# define _exit(foo) vms_exit(foo)
966# define exit(foo) vms_exit(foo)
967
968extern char *program_name;
969
970void
971set_program_name (const char *arv0);
972
973int
974need_vms_symbol (void);
975
976int
977create_foreign_command (const char *command, const char *image);
978
979int
980vms_export_dcl_symbol (const char *name, const char *value);
981
982int
983vms_putenv_symbol (const char *string);
984
985void
986vms_restore_symbol (const char *string);
987
988#endif
989
990void remote_setup (void);
991void remote_cleanup (void);
992int start_remote_job_p (int);
993int start_remote_job (char **, char **, int, int *, int *, int *);
994int remote_status (int *, int *, int *, int);
995void block_remote_children (void);
996void unblock_remote_children (void);
997int remote_kill (int id, int sig);
998void print_variable_data_base (void);
999void print_vpath_data_base (void);
1000
1001extern char *starting_directory;
1002extern unsigned int makelevel;
1003extern char *version_string, *remote_description, *make_host;
1004
1005extern unsigned int commands_started;
1006
1007extern int handling_fatal_signal;
1008
1009
1010#ifndef MIN
1011#define MIN(_a,_b) ((_a)<(_b)?(_a):(_b))
1012#endif
1013#ifndef MAX
1014#define MAX(_a,_b) ((_a)>(_b)?(_a):(_b))
1015#endif
1016
1017
1018#define MAKE_SUCCESS 0
1019#define MAKE_TROUBLE 1
1020#define MAKE_FAILURE 2
1021
1022/* Set up heap debugging library dmalloc. */
1023
1024#ifdef HAVE_DMALLOC_H
1025#include <dmalloc.h>
1026#endif
1027
1028#ifndef initialize_main
1029# ifdef __EMX__
1030# define initialize_main(pargc, pargv) \
1031 { _wildcard(pargc, pargv); _response(pargc, pargv); }
1032# else
1033# define initialize_main(pargc, pargv)
1034# endif
1035#endif
1036
1037#ifdef __EMX__
1038# if !defined chdir
1039# define chdir _chdir2
1040# endif
1041# if !defined getcwd
1042# define getcwd _getcwd2
1043# endif
1044
1045/* NO_CHDIR2 causes make not to use _chdir2() and _getcwd2() instead of
1046 chdir() and getcwd(). This avoids some error messages for the
1047 make testsuite but restricts the drive letter support. */
1048# ifdef NO_CHDIR2
1049# warning NO_CHDIR2: usage of drive letters restricted
1050# undef chdir
1051# undef getcwd
1052# endif
1053#endif
1054
1055#ifndef initialize_main
1056# define initialize_main(pargc, pargv)
1057#endif
1058
1059
1060/* Some systems (like Solaris, PTX, etc.) do not support the SA_RESTART flag
1061 properly according to POSIX. So, we try to wrap common system calls with
1062 checks for EINTR. Note that there are still plenty of system calls that
1063 can fail with EINTR but this, reportedly, gets the vast majority of
1064 failure cases. If you still experience failures you'll need to either get
1065 a system where SA_RESTART works, or you need to avoid -j. */
1066
1067#define EINTRLOOP(_v,_c) while (((_v)=_c)==-1 && errno==EINTR)
1068
1069/* While system calls that return integers are pretty consistent about
1070 returning -1 on failure and setting errno in that case, functions that
1071 return pointers are not always so well behaved. Sometimes they return
1072 NULL for expected behavior: one good example is readdir() which returns
1073 NULL at the end of the directory--and _doesn't_ reset errno. So, we have
1074 to do it ourselves here. */
1075
1076#define ENULLLOOP(_v,_c) do { errno = 0; (_v) = _c; } \
1077 while((_v)==0 && errno==EINTR)
1078
1079
1080#if defined(__EMX__) && defined(CONFIG_WITH_OPTIMIZATION_HACKS) /* bird: saves 40-100ms on libc. */
1081static inline void *__my_rawmemchr (const void *__s, int __c);
1082#undef strchr
1083#define strchr(s, c) \
1084 (__extension__ (__builtin_constant_p (c) \
1085 ? ((c) == '\0' \
1086 ? (char *) __my_rawmemchr ((s), (c)) \
1087 : __my_strchr_c ((s), ((c) & 0xff) << 8)) \
1088 : __my_strchr_g ((s), (c))))
1089static inline char *__my_strchr_c (const char *__s, int __c)
1090{
1091 register unsigned long int __d0;
1092 register char *__res;
1093 __asm__ __volatile__
1094 ("1:\n\t"
1095 "movb (%0),%%al\n\t"
1096 "cmpb %%ah,%%al\n\t"
1097 "je 2f\n\t"
1098 "leal 1(%0),%0\n\t"
1099 "testb %%al,%%al\n\t"
1100 "jne 1b\n\t"
1101 "xorl %0,%0\n"
1102 "2:"
1103 : "=r" (__res), "=&a" (__d0)
1104 : "0" (__s), "1" (__c),
1105 "m" ( *(struct { char __x[0xfffffff]; } *)__s)
1106 : "cc");
1107 return __res;
1108}
1109
1110static inline char *__my_strchr_g (__const char *__s, int __c)
1111{
1112 register unsigned long int __d0;
1113 register char *__res;
1114 __asm__ __volatile__
1115 ("movb %%al,%%ah\n"
1116 "1:\n\t"
1117 "movb (%0),%%al\n\t"
1118 "cmpb %%ah,%%al\n\t"
1119 "je 2f\n\t"
1120 "leal 1(%0),%0\n\t"
1121 "testb %%al,%%al\n\t"
1122 "jne 1b\n\t"
1123 "xorl %0,%0\n"
1124 "2:"
1125 : "=r" (__res), "=&a" (__d0)
1126 : "0" (__s), "1" (__c),
1127 "m" ( *(struct { char __x[0xfffffff]; } *)__s)
1128 : "cc");
1129 return __res;
1130}
1131
1132static inline void *__my_rawmemchr (const void *__s, int __c)
1133{
1134 register unsigned long int __d0;
1135 register unsigned char *__res;
1136 __asm__ __volatile__
1137 ("cld\n\t"
1138 "repne; scasb\n\t"
1139 : "=D" (__res), "=&c" (__d0)
1140 : "a" (__c), "0" (__s), "1" (0xffffffff),
1141 "m" ( *(struct { char __x[0xfffffff]; } *)__s)
1142 : "cc");
1143 return __res - 1;
1144}
1145
1146#undef memchr
1147#define memchr(a,b,c) __my_memchr((a),(b),(c))
1148static inline void *__my_memchr (__const void *__s, int __c, size_t __n)
1149{
1150 register unsigned long int __d0;
1151 register unsigned char *__res;
1152 if (__n == 0)
1153 return NULL;
1154 __asm__ __volatile__
1155 ("repne; scasb\n\t"
1156 "je 1f\n\t"
1157 "movl $1,%0\n"
1158 "1:"
1159 : "=D" (__res), "=&c" (__d0)
1160 : "a" (__c), "0" (__s), "1" (__n),
1161 "m" ( *(struct { __extension__ char __x[__n]; } *)__s)
1162 : "cc");
1163 return __res - 1;
1164}
1165
1166#endif /* __EMX__ (bird) */
1167
1168#ifdef CONFIG_WITH_IF_CONDITIONALS
1169extern int expr_eval_if_conditionals(const char *line, const floc *flocp);
1170extern char *expr_eval_to_string(char *o, const char *expr);
1171#endif
1172
1173#ifdef KMK
1174extern char *abspath(const char *name, char *apath);
1175extern char *func_breakpoint(char *o, char **argv, const char *funcname);
1176# ifdef KBUILD_OS_WINDOWS
1177extern void dir_cache_invalid_after_job (void);
1178extern void dir_cache_invalid_all (void);
1179extern void dir_cache_invalid_all_and_close_dirs (int including_root);
1180extern void dir_cache_invalid_missing (void);
1181extern int dir_cache_volatile_dir (const char *dir);
1182extern int dir_cache_deleted_directory(const char *pszDir);
1183# endif
1184#endif
1185
1186#if defined (CONFIG_WITH_NANOTS) || defined (CONFIG_WITH_PRINT_TIME_SWITCH) || defined(CONFIG_WITH_KMK_BUILTIN_STATS)
1187/* misc.c */
1188extern big_int nano_timestamp (void);
1189extern int format_elapsed_nano (char *buf, size_t size, big_int ts);
1190#endif
1191
1192#ifdef KMK
1193/* main.c */
1194extern mode_t g_fUMask;
1195#endif
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette