1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // This file adds defines about the platform we're currently building on.
6 //  Operating System:
7 //    OS_WIN / OS_MACOSX / OS_LINUX / OS_POSIX (MACOSX or LINUX) /
8 //    OS_NACL (NACL_SFI or NACL_NONSFI) / OS_NACL_SFI / OS_NACL_NONSFI
9 //  Compiler:
10 //    COMPILER_MSVC / COMPILER_GCC
11 //  Processor:
12 //    ARCH_CPU_X86 / ARCH_CPU_X86_64 / ARCH_CPU_X86_FAMILY (X86 or X86_64)
13 //    ARCH_CPU_32_BITS / ARCH_CPU_64_BITS
14 
15 #ifndef BUILD_BUILD_CONFIG_H_
16 #define BUILD_BUILD_CONFIG_H_
17 
18 // A brief primer on #defines:
19 //
20 // - __ANDROID__ is automatically defined by the Android toolchain (see
21 //   https://goo.gl/v61lXa). It's not defined when building host code.
22 // - __ANDROID_HOST__ is defined via -D by Android.mk when building host code
23 //   within an Android checkout.
24 // - ANDROID is defined via -D when building code for either Android targets or
25 //   hosts. Use __ANDROID__ and __ANDROID_HOST__ instead.
26 // - OS_ANDROID is a Chrome-specific define used to build Chrome for Android
27 //   within the NDK.
28 
29 // Android targets and hosts don't use tcmalloc.
30 #if defined(__ANDROID__) || defined(__ANDROID_HOST__)
31 #define NO_TCMALLOC
32 #endif  // defined(__ANDROID__) || defined(__ANDROID_HOST__)
33 
34 // Use the Chrome OS version of the code for both Android targets and Chrome OS builds.
35 #if !defined(__ANDROID_HOST__)
36 #define OS_CHROMEOS 1
37 #endif  // !defined(__ANDROID_HOST__)
38 
39 #if defined(__ANDROID__)  // Android targets
40 
41 #define __linux__ 1
42 #if defined(__BIONIC__)
43 #define __UCLIBC__ 1
44 #endif  // defined(__BIONIC__)
45 
46 #elif !defined(__ANDROID_HOST__)  // Chrome OS
47 
48 // TODO: Remove these once the GLib MessageLoopForUI isn't being used:
49 // https://crbug.com/361635
50 #define USE_GLIB 1
51 #define USE_OZONE 1
52 
53 #endif  // defined(__ANDROID__)
54 
55 // A set of macros to use for platform detection.
56 #if defined(__native_client__)
57 // __native_client__ must be first, so that other OS_ defines are not set.
58 #define OS_NACL 1
59 // OS_NACL comes in two sandboxing technology flavors, SFI or Non-SFI.
60 // PNaCl toolchain defines __native_client_nonsfi__ macro in Non-SFI build
61 // mode, while it does not in SFI build mode.
62 #if defined(__native_client_nonsfi__)
63 #define OS_NACL_NONSFI
64 #else
65 #define OS_NACL_SFI
66 #endif
67 // Don't set OS_ANDROID; it's only used when building Chrome for Android.
68 #elif defined(__APPLE__)
69 // only include TargetConditions after testing ANDROID as some android builds
70 // on mac don't have this header available and it's not needed unless the target
71 // is really mac/ios.
72 #include <TargetConditionals.h>
73 #define OS_MACOSX 1
74 #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
75 #define OS_IOS 1
76 #endif  // defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
77 #elif defined(__linux__)
78 #define OS_LINUX 1
79 // include a system header to pull in features.h for glibc/uclibc macros.
80 #include <unistd.h>
81 #if defined(__GLIBC__) && !defined(__UCLIBC__)
82 // we really are using glibc, not uClibc pretending to be glibc
83 #define LIBC_GLIBC 1
84 #endif
85 #elif defined(_WIN32)
86 #define OS_WIN 1
87 #define TOOLKIT_VIEWS 1
88 #elif defined(__FreeBSD__)
89 #define OS_FREEBSD 1
90 #elif defined(__OpenBSD__)
91 #define OS_OPENBSD 1
92 #elif defined(__sun)
93 #define OS_SOLARIS 1
94 #elif defined(__QNXNTO__)
95 #define OS_QNX 1
96 #else
97 #error Please add support for your platform in build/build_config.h
98 #endif
99 
100 #if defined(USE_OPENSSL_CERTS) && defined(USE_NSS_CERTS)
101 #error Cannot use both OpenSSL and NSS for certificates
102 #endif
103 
104 // For access to standard BSD features, use OS_BSD instead of a
105 // more specific macro.
106 #if defined(OS_FREEBSD) || defined(OS_OPENBSD)
107 #define OS_BSD 1
108 #endif
109 
110 // For access to standard POSIXish features, use OS_POSIX instead of a
111 // more specific macro.
112 #if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_FREEBSD) ||     \
113     defined(OS_OPENBSD) || defined(OS_SOLARIS) || defined(OS_ANDROID) ||  \
114     defined(OS_NACL) || defined(OS_QNX)
115 #define OS_POSIX 1
116 #endif
117 
118 // Use tcmalloc
119 #if (defined(OS_WIN) || defined(OS_LINUX) || defined(OS_ANDROID)) && \
120     !defined(NO_TCMALLOC)
121 #define USE_TCMALLOC 1
122 #endif
123 
124 // Compiler detection.
125 #if defined(__GNUC__)
126 #define COMPILER_GCC 1
127 #elif defined(_MSC_VER)
128 #define COMPILER_MSVC 1
129 #else
130 #error Please add support for your compiler in build/build_config.h
131 #endif
132 
133 // Processor architecture detection.  For more info on what's defined, see:
134 //   http://msdn.microsoft.com/en-us/library/b0084kay.aspx
135 //   http://www.agner.org/optimize/calling_conventions.pdf
136 //   or with gcc, run: "echo | gcc -E -dM -"
137 #if defined(_M_X64) || defined(__x86_64__)
138 #define ARCH_CPU_X86_FAMILY 1
139 #define ARCH_CPU_X86_64 1
140 #define ARCH_CPU_64_BITS 1
141 #define ARCH_CPU_LITTLE_ENDIAN 1
142 #elif defined(_M_IX86) || defined(__i386__)
143 #define ARCH_CPU_X86_FAMILY 1
144 #define ARCH_CPU_X86 1
145 #define ARCH_CPU_32_BITS 1
146 #define ARCH_CPU_LITTLE_ENDIAN 1
147 #elif defined(__ARMEL__)
148 #define ARCH_CPU_ARM_FAMILY 1
149 #define ARCH_CPU_ARMEL 1
150 #define ARCH_CPU_32_BITS 1
151 #define ARCH_CPU_LITTLE_ENDIAN 1
152 #elif defined(__aarch64__)
153 #define ARCH_CPU_ARM_FAMILY 1
154 #define ARCH_CPU_ARM64 1
155 #define ARCH_CPU_64_BITS 1
156 #define ARCH_CPU_LITTLE_ENDIAN 1
157 #elif defined(__pnacl__)
158 #define ARCH_CPU_32_BITS 1
159 #define ARCH_CPU_LITTLE_ENDIAN 1
160 #elif defined(__MIPSEL__)
161 #if defined(__LP64__)
162 #define ARCH_CPU_MIPS64_FAMILY 1
163 #define ARCH_CPU_MIPS64EL 1
164 #define ARCH_CPU_64_BITS 1
165 #define ARCH_CPU_LITTLE_ENDIAN 1
166 #else
167 #define ARCH_CPU_MIPS_FAMILY 1
168 #define ARCH_CPU_MIPSEL 1
169 #define ARCH_CPU_32_BITS 1
170 #define ARCH_CPU_LITTLE_ENDIAN 1
171 #endif
172 #else
173 #error Please add support for your architecture in build/build_config.h
174 #endif
175 
176 // Type detection for wchar_t.
177 #if defined(OS_WIN)
178 #define WCHAR_T_IS_UTF16
179 #elif defined(OS_POSIX) && defined(COMPILER_GCC) && \
180     defined(__WCHAR_MAX__) && \
181     (__WCHAR_MAX__ == 0x7fffffff || __WCHAR_MAX__ == 0xffffffff)
182 #define WCHAR_T_IS_UTF32
183 #elif defined(OS_POSIX) && defined(COMPILER_GCC) && \
184     defined(__WCHAR_MAX__) && \
185     (__WCHAR_MAX__ == 0x7fff || __WCHAR_MAX__ == 0xffff)
186 // On Posix, we'll detect short wchar_t, but projects aren't guaranteed to
187 // compile in this mode (in particular, Chrome doesn't). This is intended for
188 // other projects using base who manage their own dependencies and make sure
189 // short wchar works for them.
190 #define WCHAR_T_IS_UTF16
191 #else
192 #error Please add support for your compiler in build/build_config.h
193 #endif
194 
195 #if defined(OS_ANDROID)
196 // The compiler thinks std::string::const_iterator and "const char*" are
197 // equivalent types.
198 #define STD_STRING_ITERATOR_IS_CHAR_POINTER
199 // The compiler thinks base::string16::const_iterator and "char16*" are
200 // equivalent types.
201 #define BASE_STRING16_ITERATOR_IS_CHAR16_POINTER
202 #endif
203 
204 #endif  // BUILD_BUILD_CONFIG_H_
205