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