blob: 76b24af6413f2ec561c27f2f98e0437af6970407 [file] [log] [blame]
# -*- Python -*-
#
#
# All the helper functions are defined in:
# - site_scons/talk.py
# Use 'import talk' in any .scons file to get access to it.
# Add any new helper functions to it; unittest are available
# in talk_unittest.py.
#
# Each 'component' that is built is defined in a .scons file.
# See talk.Components(...) for further info on file naming convention.
#
# To add a new platform clone and modify the root_env object. Remember to add
# the new environment object to the envs list otherwise it will not be included
# in the build.
#
#
#
import talk
import os
import platform
#-------------------------------------------------------------------------------
# The build files/directories to 'build'.
# If the name is the name of a directory then that directory shall contain a
# .scons file with the same name as the directory itself:
# Ex: The directory session/phone contains a file called phone.scons
# This list must be in order of library dependencies. e.g., if
# session/phone/phone.scons defines a target that links to a library target
# defined in sound/sound.scons, then 'sound' must come first.
# When no particular order is imposed by library dependencies, try to keep in
# mostly alphabetical order.
#
components = talk.Components("libjingle.scons")
#-------------------------------------------------------------------------------
# Build environments
#
# The list of build environments.
envs = []
# The root of all builds.
root_env = Environment(
tools = [
'component_bits',
'component_setup',
'replace_strings',
'talk_noops',
#'talk_utils',
],
BUILD_SCONSCRIPTS = components,
DESTINATION_ROOT = '$MAIN_DIR/build',
CPPPATH = [
'$OBJ_ROOT', # generated headers are relative to here
'$MAIN_DIR/..', # TODO(dape): how can we use GOOGLECLIENT instead?
],
CPPDEFINES = [
'LOGGING=1',
# Feature selection
'FEATURE_ENABLE_SSL',
'FEATURE_ENABLE_VOICEMAIL',
'FEATURE_ENABLE_PSTN',
'HAVE_SRTP',
],
# Ensure the os environment is captured for any scripts we call out to
ENV = os.environ,
)
# This is where we set common environments
#
# Detect if building on 64-bit or 32-bit platform.
DeclareBit('build_platform_64bit', 'Platform of the build machine is 64-bit')
if platform.architecture()[0] == "64bit":
root_env.SetBits('build_platform_64bit')
# This bit denotes that an env is for 64-bit builds. When set, all build
# artifacts will be 64-bit. When unset, all build artifacts will be 32-bit.
DeclareBit('host_platform_64bit',
'Platform of the host machine (where artifacts will execute) is '
'64-bit')
# This bit denotes that we are cross-compiling using a sysroot.
DeclareBit('cross_compile',
'Cross compiling using the SYSROOT environment variable')
def CrossArch(env):
"""Return whether or not the host platform architecture differs from the build
environment architecture."""
if env.Bit('cross_compile'):
# The architecture of the Python process may not match the architecture of
# the sysroot, so we just assume it's not a cross-arch build or that it
# doesn't matter. Currently it only matters if you try to build a cross-arch
# Debian package, so just don't do that.
return False
else:
return env.Bit('host_platform_64bit') != env.Bit('build_platform_64bit')
root_env.AddMethod(CrossArch)
DeclareBit('use_static_openssl', 'Build OpenSSL as a static library')
DeclareBit('have_dbus_glib',
'Whether the build system has the dbus-glib-1 package')
DeclareBit('have_libpulse',
'Whether the build system has the libpulse package')
# List all the locales we localize to.
root_env.AppendUnique(locales = [
'af', 'am', 'ar', 'bg', 'bn', 'ca', 'cs', 'da', 'de', 'el', 'en', 'en-GB',
'es', 'es-419', 'et', 'eu', 'fa', 'fi', 'fil', 'fr', 'fr-CA', 'gl', 'gu',
'hi', 'hr', 'hu', 'id', 'is', 'it', 'iw', 'ja', 'kn', 'ko', 'lt', 'lv',
'ml', 'mr', 'ms', 'nl', 'no', 'or', 'pl', 'pt-BR', 'pt-PT', 'ro', 'ru',
'sk', 'sl', 'sr', 'sv', 'sw', 'ta', 'te', 'th', 'tl', 'tr', 'uk', 'ur',
'vi', 'zh-CN', 'zh-HK', 'zh-TW', 'zu'])
AddTargetGroup('all_breakpads', 'breakpad files can be built')
AddTargetGroup('all_dsym', 'dsym debug packages can be built')
#-------------------------------------------------------------------------------
# W I N D O W S
#
win_env = root_env.Clone(
tools = [
'atlmfc_vc80',
#'code_signing',
'component_targets_msvs',
'directx_9_0_c',
#'grid_builder',
'midl',
'target_platform_windows'
],
# Don't use default vc80 midl.exe. It doesn't understand vista_sdk idl files.
MIDL = '$PLATFORM_SDK_VISTA_6_0_DIR/Bin/midl.exe ',
WIX_DIR = '$GOOGLECLIENT/third_party/wix/v3_0_2925/files',
# Flags for debug and optimization are added to CCFLAGS instead
CCPDBFLAGS = '',
CCFLAGS_DEBUG = '',
CCFLAGS_OPTIMIZED = '',
# We force a x86 target even when building on x64 Windows platforms.
TARGET_ARCH = 'x86',
)
win_env.Decider('MD5-timestamp')
win_env.Append(
COMPONENT_LIBRARY_PUBLISH = True, # Put dlls in output dir too
CCFLAGS = [
'/Fd${TARGET}.pdb', # pdb per object allows --jobs=
'/WX', # warnings are errors
'/Zc:forScope', # handle 'for (int i = 0 ...)' right
'/EHs-c-', # disable C++ EH
'/GR-', # disable RTTI
'/Gy', # enable function level linking
'/wd4996', # ignore POSIX deprecated warnings
# promote certain level 4 warnings
'/w14701', # potentially uninitialized var
'/w14702', # unreachable code
'/w14706', # assignment within a conditional
'/w14709', # comma operator within array index
'/w14063', # case 'identifier' is not a valid value for switch of enum
'/w14064', # switch of incomplete enum 'enumeration'
'/w14057', # 'identifier1' indirection to slightly different base
# types from 'identifier2'
'/w14263', # member function does not override any base class virtual
# member function
'/w14266', # no override available for virtual memberfunction from base
# 'type'; function is hidden
'/w14296', # expression is always false
'/w14355', # 'this' : used in base member initializer list
],
CPPDEFINES = [
'_ATL_CSTRING_EXPLICIT_CONSTRUCTORS',
# TODO(dape): encapsulate all string operations that are not based
# on std::string/std::wstring and make sure we use the safest versions
# available on all platforms.
'_CRT_SECURE_NO_WARNINGS',
'_USE_32BIT_TIME_T',
'_UNICODE',
'UNICODE',
'_HAS_EXCEPTIONS=0',
'WIN32',
# TODO(dape): remove this from logging.cc and enable here instead.
#'WIN32_LEAN_AND_MEAN',
'WINVER=0x0500',
'_WIN32_WINNT=0x0501',
'_WIN32_IE=0x0501',
# The Vista platform SDK 6.0 needs at least
# this NTDDI version or else the headers
# that LMI includes from it won't compile.
'NTDDI_VERSION=NTDDI_WINXP',
# npapi.h requires the following:
'_WINDOWS',
],
CPPPATH = [
'$THIRD_PARTY/wtl_71/include',
'$PLATFORM_SDK_VISTA_6_0_DIR/Include',
],
LIBPATH = [
'$PLATFORM_SDK_VISTA_6_0_DIR/Lib'
],
LINKFLAGS = [
'-manifest', # TODO(thaloun): Why do we need this?
# Some of the third-party libraries we link in don't have public symbols, so
# ignore that linker warning.
'/ignore:4221',
'/nxcompat', # Binary was tested to be be compatible with Windows DEP.
'/dynamicbase', # Use ASLR to dynamically rebase at load-time.
'/fixed:no', # Binary can be loaded at any base-address.
],
MIDLFLAGS = [
'/win32',
'/I$PLATFORM_SDK_VISTA_6_0_DIR/include'
]
)
# TODO(dape): Figure out what this does; found it in
# omaha/main.scons. This fixes the problem with redefinition
# of OS_WINDOWS symbol.
win_env.FilterOut(CPPDEFINES = ['OS_WINDOWS=OS_WINDOWS'])
# Set up digital signing
DeclareBit('test_signing', 'Sign binaries with the test certificate')
win_env.SetBitFromOption('test_signing', False)
if win_env.Bit('test_signing'):
win_env.Replace(
CERTIFICATE_PATH = win_env.File(
'$GOOGLECLIENT/tools/test_key/testkey.pfx').abspath,
CERTIFICATE_PASSWORD = 'test',
)
AddTargetGroup('signed_binaries', 'digitally signed binaries can be built')
win_dbg_env = win_env.Clone(
BUILD_TYPE = 'dbg',
BUILD_TYPE_DESCRIPTION = 'Windows debug build',
BUILD_GROUPS = ['default', 'all'],
tools = ['target_debug'],
)
win_dbg_env.Prepend(
CCFLAGS = [
'/ZI', # enable debugging
'/Od', # disable optimizations
'/MTd', # link with LIBCMTD.LIB debug lib
'/RTC1', # enable runtime checks
],
)
envs.append(win_dbg_env)
win_dbg64_env = win_dbg_env.Clone(
BUILD_TYPE = 'dbg64',
BUILD_TYPE_DESCRIPTION = 'Windows debug 64bit build',
BUILD_GROUPS = ['all'],
)
win_dbg64_env.FilterOut(CCFLAGS = ['/ZI'])
win_dbg64_env.Append(
CCFLAGS = [
'/Zi', # enable debugging that is 64 bit compatible.
# TODO(fbarchard): fix warnings and remove these disables.
'/wd4244', # disable cast warning
'/wd4267', # disable cast warning
],
ARFLAGS = [
'/MACHINE:x64',
],
CPPDEFINES = [
'WIN64',
'ARCH_CPU_64_BITS',
],
LIBFLAGS = [
'/MACHINE:x64',
],
LINKFLAGS = [
'/MACHINE:x64',
],
)
win_dbg64_env.FilterOut(CPPDEFINES = ['_USE_32BIT_TIME_T'])
win_dbg64_env.Prepend(
LIBPATH = [
'$VC80_DIR/vc/lib/amd64',
'$ATLMFC_VC80_DIR/lib/amd64',
'$PLATFORM_SDK_VISTA_6_0_DIR/Lib/x64',
],
)
win_dbg64_env.PrependENVPath(
'PATH',
win_dbg64_env.Dir('$VC80_DIR/vc/bin/x86_amd64'))
win_dbg64_env.SetBits('host_platform_64bit')
envs.append(win_dbg64_env)
win_coverage_env = win_dbg_env.Clone(
tools = ['code_coverage'],
BUILD_TYPE = 'coverage',
BUILD_TYPE_DESCRIPTION = 'Windows code coverage build',
BUILD_GROUPS = ['all'],
)
win_coverage_env.Append(
CPPDEFINES = [
'COVERAGE_ENABLED',
],
)
envs.append(win_coverage_env)
win_opt_env = win_env.Clone(
BUILD_TYPE = 'opt',
BUILD_TYPE_DESCRIPTION = 'Windows opt build',
BUILD_GROUPS = ['all'],
tools = ['target_optimized'],
)
win_opt_env.Prepend(
CCFLAGS=[
'/Zi', # enable debugging
'/O1', # optimize for size
'/fp:fast', # float faster but less precise
'/MT', # link with LIBCMT.LIB (multi-threaded, static linked crt)
'/GS', # enable security checks
],
LINKFLAGS = [
'/safeseh', # protect against attacks against exception handlers
'/opt:ref', # Remove unused references (functions/data).
],
)
envs.append(win_opt_env)
#-------------------------------------------------------------------------------
# P O S I X
#
posix_env = root_env.Clone()
posix_env.Append(
CPPDEFINES = [
'HASHNAMESPACE=__gnu_cxx',
'HASH_NAMESPACE=__gnu_cxx',
'POSIX',
'DISABLE_DYNAMIC_CAST',
# The POSIX standard says we have to define this.
'_REENTRANT',
],
CCFLAGS = [
'-Wall',
'-Werror',
'-Wno-switch',
'-fno-exceptions',
# Needed for a clean ABI and for link-time dead-code removal to work
# properly.
'-fvisibility=hidden',
# Generate debugging info in the DWARF2 format.
'-gdwarf-2',
# Generate maximal debugging information. (It is stripped from what we ship
# to users, so we want it for both dbg and opt.)
# Note that hammer automatically supplies "-g" for mac/linux dbg, so that
# flag must be filtered out of linux_dbg and mac_dbg envs below.
'-g3',
],
CXXFLAGS = [
'-Wno-non-virtual-dtor',
'-Wno-ctor-dtor-privacy',
'-fno-rtti',
],
)
# Switch-hit between NSS and OpenSSL
if 'NSS_BUILD_PLATFORM' in root_env['ENV']:
posix_env.AppendUnique(CPPDEFINES=['HAVE_NSS_SSL_H=1',
'NSS_SSL_RELATIVE_PATH'])
else:
posix_env.AppendUnique(CPPDEFINES=['HAVE_OPENSSL_SSL_H=1'])
#-------------------------------------------------------------------------------
# M A C OSX
#
mac_env = posix_env.Clone(
tools = [
'target_platform_mac',
#'talk_mac',
#'fill_plist',
],
)
# Use static OpenSSL on mac so that we can use the latest APIs on all
# supported mac platforms (10.5+).
mac_env.SetBits('use_static_openssl')
# For libjingle we don't specify a sysroot or minimum OS version.
mac_osx_version_min_32 = ""
mac_osx_version_min_64 = ""
# Generic mac environment common to all targets
mac_env.Append(
CPPDEFINES = [
'OSX',
],
CCFLAGS = [
'-arch', 'i386',
'-fasm-blocks',
],
LINKFLAGS = [
'-Wl,-search_paths_first',
# This flag makes all members of a static library be included in the
# final exe - that increases the size of the exe, but without it
# Obj-C categories aren't properly included in the exe.
# TODO(thaloun): consider only defining for libs that actually have objc.
'-ObjC',
'-arch', 'i386',
'-dead_strip',
],
FRAMEWORKS = [
'CoreServices',
'Security',
'SystemConfiguration',
'OpenGL',
'CoreAudio',
'Quartz',
'Cocoa',
'QTKit',
]
)
if 'NSS_BUILD_PLATFORM' in root_env['ENV']:
mac_env.AppendUnique(LINKFLAGS = ['-Lthird_party/mozilla/dist/' + root_env['ENV']['NSS_BUILD_PLATFORM'] + '/lib'])
else:
mac_env.AppendUnique(LINKFLAGS = ['-Lthird_party/openssl'])
# add debug flags to environment
def mac_debug_include(env):
env.Append(
CCFLAGS = [
'-O0',
],
CPPDEFINES = [
'DEBUG=1',
],
)
# Remove -g set by hammer, which is not what we want (we have set -g3 above).
env.FilterOut(CCFLAGS = ['-g'])
# add 32/64 bit specific options to specified environment
def mac_common_include_x86_32(env):
env.Append(
CCFLAGS = [
'-m32',
],
LINKFLAGS = [
'-m32',
],
FRAMEWORKS = [
'Carbon',
'QuickTime',
],
)
envs.append(env)
def mac_common_include_x86_64(env):
env.Append(
CCFLAGS = [
'-m64',
'-fPIC',
],
CPPDEFINES = [
'ARCH_CPU_64_BITS',
'CARBON_DEPRECATED',
],
LINKFLAGS = [
'-m64',
],
FRAMEWORKS = [
'AppKit',
],
)
env.SetBits('host_platform_64bit')
envs.append(env)
def mac_osx_version_min(env, ver):
if ver != "":
sdk_path = '/Developer/SDKs/MacOSX%s.sdk' % ver
env.Append(
CCFLAGS = [
'-mmacosx-version-min=' + ver,
'-isysroot', sdk_path,
],
LINKFLAGS = [
'-mmacosx-version-min=' + ver,
'-isysroot', sdk_path,
],
osx_sdk_path = sdk_path,
osx_version_min = ver,
)
# Create all environments
mac_dbg_env = mac_env.Clone(
BUILD_TYPE = 'dbg',
BUILD_TYPE_DESCRIPTION = 'Mac debug build',
BUILD_GROUPS = ['default', 'all'],
tools = ['target_debug'],
)
mac_opt_env = mac_env.Clone(
BUILD_TYPE = 'opt',
BUILD_TYPE_DESCRIPTION = 'Mac opt build',
BUILD_GROUPS = ['all'],
tools = ['target_optimized'],
)
mac_dbg64_env = mac_dbg_env.Clone(
BUILD_TYPE = 'dbg64',
BUILD_TYPE_DESCRIPTION = 'Mac debug 64bit build',
BUILD_GROUPS = ['all'],
)
mac_opt64_env = mac_opt_env.Clone(
BUILD_TYPE = 'opt64',
BUILD_TYPE_DESCRIPTION = 'Mac opt 64bit build',
BUILD_GROUPS = ['all'],
)
mac_debug_include(mac_dbg_env)
mac_debug_include(mac_dbg64_env)
mac_common_include_x86_32(mac_dbg_env)
mac_common_include_x86_32(mac_opt_env)
mac_common_include_x86_64(mac_dbg64_env)
mac_common_include_x86_64(mac_opt64_env)
mac_osx_version_min(mac_dbg_env, mac_osx_version_min_32)
mac_osx_version_min(mac_opt_env, mac_osx_version_min_32)
mac_osx_version_min(mac_dbg64_env, mac_osx_version_min_64)
mac_osx_version_min(mac_opt64_env, mac_osx_version_min_64)
#-------------------------------------------------------------------------------
# L I N U X
#
linux_common_env = posix_env.Clone(
tools = [
'target_platform_linux',
'talk_linux',
],
)
linux_common_env.Append(
CPPDEFINES = [
'LINUX',
],
CCFLAGS = [
# Needed for link-time dead-code removal to work properly.
'-ffunction-sections',
'-fdata-sections',
],
LINKFLAGS = [
# Enable dead-code removal.
'-Wl,--gc-sections',
# Elide dependencies on shared libraries that we're not actually using.
'-Wl,--as-needed',
'-Wl,--start-group',
],
_LIBFLAGS = ['-Wl,--end-group'],
)
# Remove default rpath set by Hammer. Hammer sets it to LIB_DIR, which is wrong.
# The rpath is the _run-time_ library search path for the resulting binary, i.e.
# the one used by ld.so at load time. Setting it equal to the path to build
# output on the build machine is nonsense.
linux_common_env.Replace(
RPATH = [],
)
# Enable the optional DBus-GLib code if the build machine has the required
# dependency.
linux_common_env.EnableFeatureWherePackagePresent('have_dbus_glib',
'HAVE_DBUS_GLIB',
'dbus-glib-1')
def linux_common_include_x86_32(env):
"""Include x86-32 settings into an env based on linux_common."""
env.Append(
CCFLAGS = [
'-m32',
],
LINKFLAGS = [
'-m32',
],
)
def linux_common_include_x86_64(env):
"""Include x86-64 settings into an env based on linux_common."""
env.Append(
CCFLAGS = [
'-m64',
'-fPIC',
],
LINKFLAGS = [
'-m64',
],
)
env.SetBits('host_platform_64bit')
#-------------------------------------------------------------------------------
# L I N U X -- C R O S S -- B U I L D
# Cross build requires the following tool names be provided by the environment:
linux_cross_common_env = linux_common_env.Clone(
AR = os.environ.get("AR"),
AS = os.environ.get("AS"),
LD = os.environ.get("LD"),
NM = os.environ.get("NM"),
RANLIB = os.environ.get("RANLIB"),
CC = str(os.environ.get("CC")) +
' --sysroot=' + str(os.environ.get("SYSROOT")),
CXX = str(os.environ.get("CXX")) +
' --sysroot=' + str(os.environ.get("SYSROOT")),
)
linux_cross_common_env.SetBits('cross_compile')
# The rest of these paths and flags are optional:
if os.environ.get("CPPPATH"):
linux_cross_common_env.Append(
CPPPATH = os.environ.get("CPPPATH").split(':'),
)
if os.environ.get("LIBPATH"):
linux_cross_common_env.Append(
LIBPATH = os.environ.get("LIBPATH").split(':'),
)
if os.environ.get("CFLAGS"):
linux_cross_common_env.Append(
CFLAGS = os.environ.get("CFLAGS").split(' '),
)
if os.environ.get("CCFLAGS"):
linux_cross_common_env.Append(
CCFLAGS = os.environ.get("CCFLAGS").split(' '),
)
if os.environ.get("CXXFLAGS"):
linux_cross_common_env.Append(
CXXFLAGS = os.environ.get("CXXFLAGS").split(' '),
)
if os.environ.get("LIBFLAGS"):
linux_cross_common_env.Append(
_LIBFLAGS = os.environ.get("LIBFLAGS").split(' '),
)
if os.environ.get("LINKFLAGS"):
linux_cross_common_env.Prepend(
LINKFLAGS = os.environ.get("LINKFLAGS").split(' '),
)
#-------------------------------------------------------------------------------
# L I N U X -- T R A D I T I O N A L -- X 8 6
#
# Settings that are specific to our desktop Linux x86 targets.
def linux_common_include_traditional(env):
"""Include traditional Linux settings into an env based on linux_common."""
# OpenSSL has infamously poor ABI stability, so that building against one
# version and running against a different one often will not work. Since our
# non-ChromeOS Linux builds are used on many different distros and distro
# versions, this means we can't safely dynamically link to OpenSSL because the
# product would end up being broken on any computer with a different version
# installed. So instead we build it ourself and statically link to it.
env.SetBits('use_static_openssl')
# Enable the optional PulseAudio code if the build machine has the required
# dependency.
# TODO(?): This belongs in linux_common_env, but we can't safely move it there
# yet because pkg-config is not being used properly with ChromeOS builds (see
# TODO below).
env.EnableFeatureWherePackagePresent('have_libpulse',
'HAVE_LIBPULSE',
'libpulse')
def linux_traditional_include_dbg(env):
"""Include traditional Linux dbg settings into an env based on the above."""
# Remove -g set by hammer, which is not what we want (we have set -g3 above).
env.FilterOut(CCFLAGS = ['-g'])
def linux_traditional_include_opt(env):
"""Include traditional Linux opt settings into an env based on the above."""
# Remove -O2 set by hammer, which is not what we want.
env.FilterOut(CCFLAGS = ['-O2'])
env.Append(CCFLAGS = ['-Os'])
def gen_linux_nonhermetic(linux_env, type_suffix, desc_suffix):
groups = ['nonhermetic']
if not linux_env.CrossArch():
groups = groups + ['nonhermetic-native']
# The non-hermetic, native-arch dbg build is the default.
dbg_groups = groups + ['default']
native_desc = ', native '
# No suffix for native modes.
type_suffix = ''
else:
groups = groups + ['nonhermetic-cross']
dbg_groups = groups
native_desc = ', cross-built for '
linux_dbg_env = linux_env.Clone(
BUILD_TYPE = 'dbg' + type_suffix,
BUILD_TYPE_DESCRIPTION = 'Linux debug build%s%s' % (native_desc,
desc_suffix),
BUILD_GROUPS = dbg_groups,
tools = ['target_debug'],
)
linux_traditional_include_dbg(linux_dbg_env)
envs.append(linux_dbg_env)
linux_opt_env = linux_env.Clone(
BUILD_TYPE = 'opt' + type_suffix,
BUILD_TYPE_DESCRIPTION = 'Linux optimized build%s%s' % (native_desc,
desc_suffix),
BUILD_GROUPS = groups,
tools = ['target_optimized'],
)
linux_traditional_include_opt(linux_opt_env)
envs.append(linux_opt_env)
linux_nonhermetic_common_env = linux_common_env.Clone()
linux_common_include_traditional(linux_nonhermetic_common_env)
linux_nonhermetic_x86_32_env = linux_nonhermetic_common_env.Clone()
linux_common_include_x86_32(linux_nonhermetic_x86_32_env)
gen_linux_nonhermetic(linux_nonhermetic_x86_32_env, '32', '32-bit')
linux_nonhermetic_x86_64_env = linux_nonhermetic_common_env.Clone()
linux_common_include_x86_64(linux_nonhermetic_x86_64_env)
gen_linux_nonhermetic(linux_nonhermetic_x86_64_env, '64', '64-bit')
def gen_linux_hermetic(linux_env, type_suffix, desc):
groups = ['hermetic']
linux_dbg_env = linux_env.Clone(
BUILD_TYPE = 'hermetic-dbg' + type_suffix,
BUILD_TYPE_DESCRIPTION = 'Hermetic %s Linux debug build' % desc,
BUILD_GROUPS = groups,
tools = ['target_debug'],
)
linux_traditional_include_dbg(linux_dbg_env)
envs.append(linux_dbg_env)
linux_opt_env = linux_env.Clone(
BUILD_TYPE = 'hermetic-opt' + type_suffix,
BUILD_TYPE_DESCRIPTION = 'Hermetic %s Linux optimized build' % desc,
BUILD_GROUPS = groups,
tools = ['target_optimized'],
)
linux_traditional_include_opt(linux_opt_env)
envs.append(linux_opt_env)
linux_hermetic_common_env = linux_cross_common_env.Clone()
linux_common_include_traditional(linux_hermetic_common_env)
linux_hermetic_x86_32_env = linux_hermetic_common_env.Clone()
linux_common_include_x86_32(linux_hermetic_x86_32_env)
gen_linux_hermetic(linux_hermetic_x86_32_env, '32', '32-bit')
linux_hermetic_x86_64_env = linux_hermetic_common_env.Clone()
linux_common_include_x86_64(linux_hermetic_x86_64_env)
gen_linux_hermetic(linux_hermetic_x86_64_env, '64', '64-bit')
#-------------------------------------------------------------------------------
# L I N U X -- C R O S S -- B U I L D -- A R M
# TODO(noahric): All the following Linux builds are running against a sysroot
# but improperly using the host machine's pkg-config environment. The ChromeOS
# ones should probably be using
# https://cs.corp.google.com/#chrome/src/build/linux/pkg-config-wrapper.
linux_cross_arm_env = linux_cross_common_env.Clone()
linux_cross_arm_env.Append(
CPPDEFINES = [
'NACL_BUILD_ARCH=arm',
'DISABLE_EFFECTS=1',
],
CCFLAGS = [
'-fPIC',
],
)
DeclareBit('arm', 'ARM build')
linux_cross_arm_env.SetBits('arm')
# Detect NEON support from the -mfpu build flag.
DeclareBit('arm_neon', 'ARM supporting neon')
if '-mfpu=neon' in linux_cross_arm_env['CFLAGS'] or \
'-mfpu=neon' in linux_cross_arm_env['CCFLAGS'] or \
'-mfpu=neon' in linux_cross_arm_env['CXXFLAGS']:
print "Building with ARM NEON support."
linux_cross_arm_env.SetBits('arm_neon')
# Detect hardfp from the -mfloat-abi build flag
DeclareBit('arm_hardfp', 'ARM supporting hardfp')
if '-mfloat-abi=hard' in linux_cross_arm_env['CFLAGS'] or \
'-mfloat-abi=hard' in linux_cross_arm_env['CCFLAGS'] or \
'-mfloat-abi=hard' in linux_cross_arm_env['CXXFLAGS']:
print "Building with hard floating point support."
linux_cross_arm_env.SetBits('arm_hardfp')
linux_cross_arm_dbg_env = linux_cross_arm_env.Clone(
BUILD_TYPE = 'arm-dbg',
BUILD_TYPE_DESCRIPTION = 'Cross-compiled ARM debug build',
BUILD_GROUPS = ['arm'],
tools = ['target_debug'],
)
envs.append(linux_cross_arm_dbg_env)
linux_cross_arm_opt_env = linux_cross_arm_env.Clone(
BUILD_TYPE = 'arm-opt',
BUILD_TYPE_DESCRIPTION = 'Cross-compiled ARM optimized build',
BUILD_GROUPS = ['arm'],
tools = ['target_optimized'],
)
envs.append(linux_cross_arm_opt_env)
# Create a group for installers
AddTargetGroup('all_installers', 'installers that can be built')
# Parse child .scons files
BuildEnvironments(envs)
# Explicitly set which targets to build when not stated on commandline
Default(None)
# Build the following, which excludes unit test output (ie running them)
# To run unittests, specify the test to run, or run_all_tests. See -h option.
Default(['all_libraries', 'all_programs', 'all_test_programs'])
# .sln creation code lifted from googleclient/bar/main.scons. Must be after
# the call to BuildEnvironments for all_foo aliases to be defined.
# Run 'hammer --mode=all --vsproj' to generate
DeclareBit('vsproj', 'Generate Visual Studio projects and solution files.')
win_env.SetBitFromOption('vsproj', False)
if win_env.Bit('vsproj'):
vs_env = win_env.Clone()
vs_env.Append(
COMPONENT_VS_SOURCE_SUFFIXES = [
'.def',
'.grd',
'.html',
'.idl',
'.mk',
'.txt',
'.py',
'.scons',
'.wxs.template',
]
)
# Source project
p = vs_env.ComponentVSDirProject(
'flute_source',
['$MAIN_DIR',
],
COMPONENT_VS_SOURCE_FOLDERS = [
# Files are assigned to first matching folder. Folder names of None
# are filters.
(None, '$DESTINATION_ROOT'),
('flute', '$MAIN_DIR'),
('google3', '$GOOGLE3'),
('third_party', '$THIRD_PARTY'),
],
# Force source project to main dir, so that Visual Studio can find the
# source files corresponding to build errors.
COMPONENT_VS_PROJECT_DIR = '$MAIN_DIR',
)
vs_env.AlwaysBuild(p)
# Solution and target projects
s = vs_env.ComponentVSSolution(
# 'libjingle', # Please uncomment this line if you build VS proj files.
['all_libraries', 'all_programs', 'all_test_programs'],
projects = [p],
)
print '***Unfortunately the vsproj creator isn\'t smart enough to '
print '***automatically get the correct output locations. It is very easy'
print '***though to change it in the properties pane to the following'
print '***$(SolutionDir)/build/<foo>/staging/<bar>.exe'
Default(None)
Default([s])