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