1/* Machine/OS specific configuration information for GNUstep
2
3   Please NOTE - GSConfig.h is generated by the configure script from the
4   file GSConfig.h.in - changes/fixes need to be made to the original file,
5   not to the GSConfig.h generated from it.
6
7   Copyright (C) 1998-2010 Free Software Foundation, Inc.
8
9   Written by:  Richard frith-Macdonald <richard@brainstorm.co.uk>
10
11   This file is part of the GNUstep Base Library.
12
13   This library is free software; you can redistribute it and/or
14   modify it under the terms of the GNU Lesser General Public
15   License as published by the Free Software Foundation; either
16   version 2 of the License, or (at your option) any later version.
17
18   This library is distributed in the hope that it will be useful,
19   but WITHOUT ANY WARRANTY; without even the implied warranty of
20   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21   Library General Public License for more details.
22
23   You should have received a copy of the GNU Lesser General Public
24   License along with this library; if not, write to the Free
25   Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
26   Boston, MA 02111 USA.
27   */
28
29#ifndef	included_GSConfig_h
30#define	included_GSConfig_h
31
32/* Check the compiler to see if we are building on/for ms-windows.
33 * Whatever the compiler uses, we want a standard setting of _WIN64
34 * to indicate 64bit AND _WIN32 to indicate ms-windows.
35 * These are defined by gcc, clang, and microsoft compilers anyway.
36 */
37#if     defined(__WIN32__) \
38	|| defined(__MS_WIN32__) \
39	|| defined(__MINGW32__)
40#  if	!defined(_WIN32)
41#    define _WIN32
42#  endif
43#endif
44#if     defined(__WIN64__) \
45	|| defined(__MS_WIN64__) \
46	|| defined(__MINGW64__)
47#  if	!defined(__WIN64__)
48#    define __WIN64__
49#  endif
50#  if	!defined(_WIN32)
51#    define _WIN32
52#  endif
53#endif
54
55/* Check to see if this is a MINGW build (all we currently support)
56 */
57#if	defined(__MINGW32__) || defined(__MINGW64__)
58#  if	!defined(__MINGW__)
59#    define __MINGW__
60#  endif
61#endif
62
63// Make sure we expose the constants that we use in ObjC++ mode
64#ifndef __STDC_CONSTANT_MACROS
65#define __STDC_CONSTANT_MACROS 1
66#endif
67#ifndef __STDC_LIMIT_MACROS
68#define __STDC_LIMIT_MACROS 1
69#endif
70
71#if !defined(NeXT_Foundation_LIBRARY)
72
73/* An alternate to GS_FAKE_MAIN which forces the user to call the
74   NSProcessInfo initialization in 'main', GS_FAKE_MAIN must also
75   be undefined. */
76#if @GS_PASS_ARGUMENTS@
77#define GS_PASS_ARGUMENTS @GS_PASS_ARGUMENTS@
78#endif
79
80#define GS_FAKE_MAIN	@GS_FAKE_MAIN@
81#if	GS_FAKE_MAIN
82
83/*
84 * NOTE - if GS_FAKE_MAIN (above) is set to 1, this hack applies - and you
85 * must make sure that this file is included in any file that implements
86 * the 'main()' function and links with the GNUstep base libarary.
87 * You should NOT include this file in a program that does not link with
88 * the base library.
89 * This file is included automatically in NSObject.h and Foundation.h
90 *
91 * The Foundation classe NSProcessInfo need access to the argc, argv,
92 * and env variables of the main() function. The purpose of this (ugly hack)
93 * definition is to give the gstep-base library the opportunity to implement
94 * its own main function with private access to the global vars. The private
95 * main() implementation (in NSProcessInfo.m) will then call the user defined
96 * gnustep_base_user_main() function.
97 *
98 * The original hack was -
99 ** Written by:  Georg Tuparev, EMBL & Academia Naturalis,
100 **              Heidelberg, Germany
101 **              Tuparev@EMBL-Heidelberg.de
102 **
103 **  NOTE! This is very dirty and dangerous trick. I spend several hours
104 ** on thinking and man pages browsing, but couldn't find better solution.
105 ** I know that I will spend 666 years in the Computer Hell for writing
106 ** this hack, and the master devil (Bully Boy) will send me to write
107 ** Windowz software.
108 ** BTW, for writing this hack I got personal congratulations from Dennis
109 ** Ritchie and Bjarne Stroustrup sent me a bunch of flowers and asked me
110 ** to participate in the standardization committee for C-- v.6.0 as
111 ** responsible for the new Tab-Overriding-Operator and Scope-Sensitive-
112 ** Comments ... but this makes my situation even worse ;-)
113 ** - Georg
114 *
115 * On some systems, there are other relatively clean workarounds, if this
116 * applies to the system you are running on, your configuration script
117 * should have set GS_FAKE_MAIN to zero, so that this define hack will
118 * not be used.
119 */
120
121#define main gnustep_base_user_main
122
123#endif	/* GS_FAKE_MAIN */
124#endif
125
126/*
127 * Definition to specify if your processor stores words with the most
128 * significant byte first (like Motorola and SPARC, unlike Intel and VAX).
129 */
130#define GS_WORDS_BIGENDIAN	@GS_WORDS_BIGENDIAN@
131
132/*
133 *	Size definitions for standard types
134 */
135#define	GS_SIZEOF_SHORT		@ac_cv_sizeof_short@
136#define	GS_SIZEOF_INT		@ac_cv_sizeof_int@
137#define	GS_SIZEOF_LONG		@ac_cv_sizeof_long@
138#define	GS_SIZEOF_LONG_LONG	@ac_cv_sizeof_long_long@
139#define	GS_SIZEOF_FLOAT		@ac_cv_sizeof_float@
140#define	GS_SIZEOF_DOUBLE	@ac_cv_sizeof_double@
141#define	GS_SIZEOF_VOIDP		@ac_cv_sizeof_voidp@
142
143/*
144 *	Size information to be places in bits 5 and 6 of type encoding bytes
145 *	in archives (bits 0 to 4 are used for basic type info and bit 7 is
146 *	used to mark cross-references to previously encoded objects).
147 */
148#define	_GSC_S_SHT	@_GSC_S_SHT@
149#define	_GSC_S_INT	@_GSC_S_INT@
150#define	_GSC_S_LNG	@_GSC_S_LNG@
151#define	_GSC_S_LNG_LNG	@_GSC_S_LNG_LNG@
152
153/*
154 * Type definitions for types with known sizes.
155 */
156typedef @GS_SINT8@ gss8;
157typedef @GS_UINT8@ gsu8;
158typedef @GS_SINT16@ gss16;
159typedef @GS_UINT16@ gsu16;
160typedef @GS_SINT32@ gss32;
161typedef @GS_UINT32@ gsu32;
162typedef @GS_SINT64@ gss64;
163typedef @GS_UINT64@ gsu64;
164typedef @GS_SINT128@ gss128;
165typedef @GS_UINT128@ gsu128;
166typedef @GS_FLT32@ gsf32;
167typedef @GS_FLT64@ gsf64;
168
169/*
170 * Integer type with same size as a pointer
171 */
172typedef	@GS_UADDR@ gsuaddr;
173typedef	@GS_SADDR@ gssaddr;
174typedef	gsuaddr gsaddr;
175
176/*
177 *	Do we have real 64-bit and 128-bit integers or are we just pretending.
178 */
179#define GS_HAVE_I64	@GS_HAVE_I64@
180#define GS_HAVE_I128	@GS_HAVE_I128@
181
182/*
183 * Ensure some standard types are defined.
184 */
185@INCLUDE_INTTYPES@
186@DEFINE_INT8_T@
187@DEFINE_UINT8_T@
188@DEFINE_INT16_T@
189@DEFINE_UINT16_T@
190@DEFINE_INT32_T@
191@DEFINE_UINT32_T@
192@DEFINE_INT64_T@
193@DEFINE_UINT64_T@
194@DEFINE_INTPTR_T@
195@DEFINE_UINTPTR_T@
196
197/*
198 * PTR Limit information replacements for buggy headers
199 */
200#if @BUGGY_PTR_LIMITS@
201#undef INTPTR_MAX
202#define INTPTR_MAX @GS_INTPTR_MAX@
203#undef INTPTR_MIN
204#define INTPTR_MIN @GS_INTPTR_MIN@
205#undef UINTPTR_MAX
206#define UINTPTR_MAX @GS_UINTPTR_MAX@
207#endif
208
209
210/*
211 *	Do we have zlib for file handle compression?
212 */
213#define USE_ZLIB	@USE_ZLIB@
214
215/*
216 *	Do we have the GNU Multiple-precision library for NSDecimal?
217 */
218//#define USE_GMP	@USE_GMP@
219#define USE_GMP	0
220
221#ifdef	GS_WITH_GC
222#undef  GS_WITH_GC
223#endif
224#define	GS_WITH_GC	0
225
226/*
227 * Define to say if we use NXConstantString or NSConstantString
228 */
229#define NXConstantString	@NX_CONST_STRING_CLASS@
230
231
232/*
233 * Wide unicode character type.
234 */
235#ifndef	UTF32Char
236#define	UTF32Char	uint32_t
237#endif
238
239/*
240 * Native character type for use in systemcalls etc.
241 */
242
243#if	defined(__MINGW__)
244#  define	GSNativeChar	uint16_t
245#else
246#  define	GSNativeChar	char
247#endif
248
249/*
250 * Types used to avoid exposing pthread header in NSLock.h
251 * NB. These types should *never* be used except to provide enough space
252 * in a class layout for the type of data actually used by the pthread
253 * implementation of the current platform.
254 */
255typedef	struct {
256  uint8_t	dummy[@GS_SIZEOF_COND_T@];
257} gs_cond_t	__attribute__((aligned (@GS_ALIGNOF_COND_T@)));
258typedef	struct {
259  uint8_t	dummy[@GS_SIZEOF_MUTEX_T@];
260} gs_mutex_t	__attribute__((aligned (@GS_ALIGNOF_MUTEX_T@)));
261
262#define	OBJC2RUNTIME @OBJC2RUNTIME@
263#define BASE_NATIVE_OBJC_EXCEPTIONS     @BASE_NATIVE_OBJC_EXCEPTIONS@
264#define GS_NONFRAGILE     @GS_NONFRAGILE@
265#define GS_MIXEDABI     @GS_MIXEDABI@
266#define GS_USE_LIBXML @HAVE_LIBXML@
267#define GS_USE_GNUTLS @HAVE_GNUTLS@
268#define GS_USE_AVAHI @HAVE_AVAHI@
269#define GS_USE_MDNS @HAVE_MDNS@
270#define GS_USE_ICU @HAVE_ICU@
271#define GS_USE_LIBDISPATCH @HAVE_LIBDISPATCH@
272#define GS_USE_LIBDISPATCH_RUNLOOP @HAVE_LIBDISPATCH_RUNLOOP@
273#define GS_HAVE_OBJC_ROOT_CLASS_ATTR @GS_HAVE_OBJC_ROOT_CLASS_ATTR@
274
275#ifndef __has_include
276#  define __has_include(x) 0
277#endif
278#ifndef __has_feature
279#  define __has_feature(x) 0
280#endif
281#ifndef __has_builtin
282#  define __has_builtin(x) 0
283#endif
284
285/*
286 * __has_extension has slightly different semantics from __has_feature.
287 * It evaluates to true if the feature is supported by by clang for the
288 * current compilation unit (language and -f switches), regardless of
289 * whether it is part of the language standard or just a (non-standard)
290 * extension.
291 */
292#ifndef __has_extension
293#  define __has_extension(x) __has_feature(x)
294#endif
295
296#if defined(_WIN32)
297#define BOOL WinBOOL
298#define __OBJC_BOOL 1
299#include <w32api.h>
300#ifndef _WIN32_WINNT
301#define _WIN32_WINNT Windows2000
302#endif
303#if	!defined(WINVER)
304#define WINVER Windows2000
305#elif (WINVER < Windows2000)
306#undef	WINVER
307#define WINVER Windows2000
308#endif
309
310#if defined(__WIN64__)
311#include <winsock2.h>
312#include <windows.h>
313#else
314#include <windows.h>
315#include <winsock2.h>
316#endif
317
318#undef __OBJC_BOOL
319#undef  BOOL
320#endif
321
322/* Include the blocks runtime header if it's available (It shouldn't matter
323 * that this doesn't work on compilers that don't support __has_include(),
324 * because they also don't support blocks).
325 */
326#if __has_include(<objc/block_runtime.h>)
327#  include <objc/block_runtime.h>
328#endif
329
330#ifndef _WIN32
331#include <sys/param.h> /* Hack to get rid of warning in GNU libc 2.0.3. */
332#endif
333
334/* The following group of lines maintained by the gstep-base configure */
335#define GNUSTEP_BASE_VERSION            @VERSION@
336#define GNUSTEP_BASE_MAJOR_VERSION      @MAJOR_VERSION@
337#define GNUSTEP_BASE_MINOR_VERSION      @MINOR_VERSION@
338#define GNUSTEP_BASE_SUBMINOR_VERSION   @SUBMINOR_VERSION@
339#define GNUSTEP_BASE_GCC_VERSION        @GCC_VERSION@
340
341/* Do not use the following macros!
342 */
343#define OBJC_DEP(M) \
344  ({ static BOOL beenHere = NO; if (beenHere == NO) {\
345    beenHere = YES; fprintf(stderr, "%s:%d %s", __FILE__, __LINE__, (M));}})
346
347#define OBJC_MALLOC(VAR, TYPE, NUM) \
348   (OBJC_DEP("OBJC_MALLOC is deprecated ... use malloc\n"),(VAR) = (TYPE *) malloc ((unsigned)(NUM)*sizeof(TYPE)))
349#define OBJC_VALLOC(VAR, TYPE, NUM) \
350   (OBJC_DEP("OBJC_VALLOC is deprecated\n"),(VAR) = (TYPE *) valloc ((unsigned)(NUM)*sizeof(TYPE)))
351#define OBJC_ATOMIC_MALLOC(VAR, TYPE, NUM) \
352   (OBJC_DEP("OBJC_ATOMIC_MALLOC is deprecated\n"),(VAR) = (TYPE *) malloc ((unsigned)(NUM)*sizeof(TYPE)))
353#define OBJC_REALLOC(VAR, TYPE, NUM) \
354   (OBJC_DEP("OBJC_REALLOC is deprecated ... use realloc\n"),(VAR) = (TYPE *) realloc ((VAR), (unsigned)(NUM)*sizeof(TYPE)))
355#define OBJC_CALLOC(VAR, TYPE, NUM) \
356   (OBJC_DEP("OBJC_CALLOC is deprecated ... use calloc\n"),(VAR) = (TYPE *) calloc ((unsigned)(NUM), sizeof(TYPE)))
357#define OBJC_FREE(PTR) (OBJC_DEP("OBJC_FREE is deprecated ... use free\n"), free (PTR))
358
359#ifndef MAX
360#define MAX(a,b) \
361       ({__typeof__(a) _MAX_a = (a); __typeof__(b) _MAX_b = (b);  \
362         _MAX_a > _MAX_b ? _MAX_a : _MAX_b; })
363#endif
364
365#ifndef MIN
366#define MIN(a,b) \
367       ({__typeof__(a) _MIN_a = (a); __typeof__(b) _MIN_b = (b);  \
368         _MIN_a < _MIN_b ? _MIN_a : _MIN_b; })
369#endif
370
371#ifndef ABS
372#define ABS(a) \
373       ({__typeof__(a) _ABS_a = (a); \
374         _ABS_a < 0 ? -_ABS_a : _ABS_a; })
375#endif
376
377#ifndef STRINGIFY
378#define STRINGIFY(s) XSTRINGIFY(s)
379#define XSTRINGIFY(s) #s
380#endif
381
382#ifndef OBJC_STRINGIFY
383#define OBJC_STRINGIFY(s) OBJC_XSTRINGIFY(s)
384#define OBJC_XSTRINGIFY(s) @#s
385#endif
386
387#ifndef PTR2LONG
388#define PTR2LONG(P) (((char*)(P))-(char*)0)
389#endif
390#ifndef LONG2PTR
391#define LONG2PTR(L) (((char*)0)+(L))
392#endif
393
394#if VSPRINTF_RETURNS_LENGTH
395#define VSPRINTF_LENGTH(VSPF_CALL) (VSPF_CALL)
396#else
397#define VSPRINTF_LENGTH(VSPF_CALL) strlen((VSPF_CALL))
398#endif /* VSPRINTF_RETURNS_LENGTH */
399
400#if VASPRINTF_RETURNS_LENGTH
401#define VASPRINTF_LENGTH(VASPF_CALL) (VASPF_CALL)
402#else
403#define VASPRINTF_LENGTH(VASPF_CALL) strlen((VASPF_CALL))
404#endif /* VSPRINTF_RETURNS_LENGTH */
405
406/* Evil hack to stop gcc-4.1 complaining about a dealloc method which
407 * does not call the superclass implementation.
408 */
409#define	GSNOSUPERDEALLOC	if (0) [super dealloc]
410
411#ifndef CF_EXCLUDE_CSTD_HEADERS
412#include <sys/types.h>
413#include <stdarg.h>
414#include <assert.h>
415#include <ctype.h>
416#include <errno.h>
417#include <float.h>
418#include <limits.h>
419#include <locale.h>
420#include <math.h>
421#include <setjmp.h>
422#include <signal.h>
423#include <stddef.h>
424#include <stdio.h>
425#include <stdlib.h>
426#include <string.h>
427#include <time.h>
428#include <stdbool.h>
429#endif
430
431#if !__has_feature(objc_arc)
432// NetBSD > 6 defines __weak in cdefs_elf.h
433#ifdef __NetBSD__
434#undef __weak
435#endif
436#  if !defined(__weak)
437#    define __weak
438#  endif
439#  if !defined(__strong)
440#    define __strong
441#  endif
442#endif
443
444#ifndef __unsafe_unretained
445#  if !__has_feature(objc_arc)
446#    define __unsafe_unretained
447#  endif
448#endif
449#ifndef __bridge
450#  if !__has_feature(objc_arc)
451#    define __bridge
452#  endif
453#endif
454
455#if __has_builtin(__builtin_unreachable)
456#  define GS_UNREACHABLE() __builtin_unreachable()
457#else
458#  define GS_UNREACHABLE() abort()
459#endif
460
461#endif	/* included_GSConfig_h */
462
463