Home | History | Annotate | Download | only in talk
      1 # -*- Python -*-
      2 #
      3 #
      4 # All the helper functions are defined in:
      5 #  - site_scons/talk.py
      6 # Use 'import talk' in any .scons file to get access to it.
      7 # Add any new helper functions to it; unittest are available
      8 # in talk_unittest.py.
      9 #
     10 # Each 'component' that is built is defined in a .scons file.
     11 # See talk.Components(...) for further info on file naming convention.
     12 #
     13 # To add a new platform clone and modify the root_env object. Remember to add
     14 # the new environment object to the envs list otherwise it will not be included
     15 # in the build.
     16 #
     17 #
     18 #
     19 
     20 import talk
     21 import os
     22 import platform
     23 
     24 #-------------------------------------------------------------------------------
     25 # The build files/directories to 'build'.
     26 # If the name is the name of a directory then that directory shall contain a
     27 # .scons file with the same name as the directory itself:
     28 #  Ex: The directory session/phone contains a file called phone.scons
     29 # This list must be in order of library dependencies. e.g., if
     30 # session/phone/phone.scons defines a target that links to a library target
     31 # defined in sound/sound.scons, then 'sound' must come first.
     32 # When no particular order is imposed by library dependencies, try to keep in
     33 # mostly alphabetical order.
     34 #
     35 components = talk.Components("libjingle.scons")
     36 
     37 #-------------------------------------------------------------------------------
     38 # Build environments
     39 #
     40 
     41 # The list of build environments.
     42 envs = []
     43 
     44 # The root of all builds.
     45 root_env = Environment(
     46   tools = [
     47     'component_bits',
     48     'component_setup',
     49     'replace_strings',
     50     'talk_noops',
     51     #'talk_utils',
     52   ],
     53   BUILD_SCONSCRIPTS = components,
     54   DESTINATION_ROOT = '$MAIN_DIR/build',
     55   CPPPATH = [
     56     '$OBJ_ROOT',     # generated headers are relative to here
     57     '$MAIN_DIR/..',  # TODO(dape): how can we use GOOGLECLIENT instead?
     58   ],
     59   CPPDEFINES = [
     60     'LOGGING=1',
     61 
     62     # Feature selection
     63     'FEATURE_ENABLE_SSL',
     64     'FEATURE_ENABLE_VOICEMAIL',
     65     'FEATURE_ENABLE_PSTN',
     66     'HAVE_SRTP',
     67   ],
     68   # Ensure the os environment is captured for any scripts we call out to
     69   ENV = os.environ,
     70 )
     71 
     72 # This is where we set common environments
     73 #
     74 # Detect if building on 64-bit or 32-bit platform.
     75 DeclareBit('build_platform_64bit', 'Platform of the build machine is 64-bit')
     76 if platform.architecture()[0] == "64bit":
     77   root_env.SetBits('build_platform_64bit')
     78 
     79 # This bit denotes that an env is for 64-bit builds. When set, all build
     80 # artifacts will be 64-bit. When unset, all build artifacts will be 32-bit.
     81 DeclareBit('host_platform_64bit',
     82            'Platform of the host machine (where artifacts will execute) is '
     83                '64-bit')
     84 
     85 # This bit denotes that we are cross-compiling using a sysroot.
     86 DeclareBit('cross_compile',
     87            'Cross compiling using the SYSROOT environment variable')
     88 
     89 def CrossArch(env):
     90   """Return whether or not the host platform architecture differs from the build
     91      environment architecture."""
     92   if env.Bit('cross_compile'):
     93     # The architecture of the Python process may not match the architecture of
     94     # the sysroot, so we just assume it's not a cross-arch build or that it
     95     # doesn't matter. Currently it only matters if you try to build a cross-arch
     96     # Debian package, so just don't do that.
     97     return False
     98   else:
     99     return env.Bit('host_platform_64bit') != env.Bit('build_platform_64bit')
    100 root_env.AddMethod(CrossArch)
    101 
    102 DeclareBit('use_static_openssl', 'Build OpenSSL as a static library')
    103 
    104 DeclareBit('have_dbus_glib',
    105            'Whether the build system has the dbus-glib-1 package')
    106 DeclareBit('have_libpulse',
    107            'Whether the build system has the libpulse package')
    108 
    109 
    110 # List all the locales we localize to.
    111 root_env.AppendUnique(locales = [
    112     'af', 'am', 'ar', 'bg', 'bn', 'ca', 'cs', 'da', 'de', 'el', 'en', 'en-GB',
    113     'es', 'es-419', 'et', 'eu', 'fa', 'fi', 'fil', 'fr', 'fr-CA', 'gl', 'gu',
    114     'hi', 'hr', 'hu', 'id', 'is', 'it', 'iw', 'ja', 'kn', 'ko', 'lt', 'lv',
    115     'ml', 'mr', 'ms', 'nl', 'no', 'or', 'pl', 'pt-BR', 'pt-PT', 'ro', 'ru',
    116     'sk', 'sl', 'sr', 'sv', 'sw', 'ta', 'te', 'th', 'tl', 'tr', 'uk', 'ur',
    117     'vi', 'zh-CN', 'zh-HK', 'zh-TW', 'zu'])
    118 
    119 AddTargetGroup('all_breakpads', 'breakpad files can be built')
    120 
    121 AddTargetGroup('all_dsym', 'dsym debug packages can be built')
    122 
    123 #-------------------------------------------------------------------------------
    124 # W I N D O W S
    125 #
    126 win_env = root_env.Clone(
    127   tools = [
    128     'atlmfc_vc80',
    129     #'code_signing',
    130     'component_targets_msvs',
    131     'directx_9_0_c',
    132     #'grid_builder',
    133     'midl',
    134     'target_platform_windows'
    135   ],
    136   # Don't use default vc80 midl.exe.  It doesn't understand vista_sdk idl files.
    137   MIDL = '$PLATFORM_SDK_VISTA_6_0_DIR/Bin/midl.exe ',
    138   WIX_DIR = '$GOOGLECLIENT/third_party/wix/v3_0_2925/files',
    139   # Flags for debug and optimization are added to CCFLAGS instead
    140   CCPDBFLAGS = '',
    141   CCFLAGS_DEBUG = '',
    142   CCFLAGS_OPTIMIZED = '',
    143   # We force a x86 target even when building on x64 Windows platforms.
    144   TARGET_ARCH = 'x86',
    145 )
    146 
    147 
    148 win_env.Decider('MD5-timestamp')
    149 win_env.Append(
    150   COMPONENT_LIBRARY_PUBLISH = True,  # Put dlls in output dir too
    151   CCFLAGS = [
    152     '/Fd${TARGET}.pdb', # pdb per object allows --jobs=
    153     '/WX',          # warnings are errors
    154     '/Zc:forScope', # handle 'for (int i = 0 ...)' right
    155     '/EHs-c-',      # disable C++ EH
    156     '/GR-',         # disable RTTI
    157     '/Gy',          # enable function level linking
    158     '/wd4996',      # ignore POSIX deprecated warnings
    159 
    160     # promote certain level 4 warnings
    161     '/w14701',     # potentially uninitialized var
    162     '/w14702',     # unreachable code
    163     '/w14706',     # assignment within a conditional
    164     '/w14709',     # comma operator within array index
    165     '/w14063',     # case 'identifier' is not a valid value for switch of enum
    166     '/w14064',     # switch of incomplete enum 'enumeration'
    167     '/w14057',     # 'identifier1' indirection to slightly different base
    168                    #   types from 'identifier2'
    169     '/w14263',     # member function does not override any base class virtual
    170                    #   member function
    171     '/w14266',     # no override available for virtual memberfunction from base
    172                    #  'type'; function is hidden
    173     '/w14296',     # expression is always false
    174     '/w14355',     # 'this' : used in base member initializer list
    175   ],
    176   CPPDEFINES = [
    177     '_ATL_CSTRING_EXPLICIT_CONSTRUCTORS',
    178     # TODO(dape): encapsulate all string operations that are not based
    179     # on std::string/std::wstring and make sure we use the safest versions
    180     # available on all platforms.
    181     '_CRT_SECURE_NO_WARNINGS',
    182     '_USE_32BIT_TIME_T',
    183     '_UNICODE',
    184     'UNICODE',
    185     '_HAS_EXCEPTIONS=0',
    186     'WIN32',
    187     # TODO(dape): remove this from logging.cc and enable here instead.
    188     #'WIN32_LEAN_AND_MEAN',
    189 
    190     'WINVER=0x0500',
    191     '_WIN32_WINNT=0x0501',
    192     '_WIN32_IE=0x0501',
    193     # The Vista platform SDK 6.0 needs at least
    194     # this NTDDI version or else the headers
    195     # that LMI includes from it won't compile.
    196     'NTDDI_VERSION=NTDDI_WINXP',
    197 
    198     # npapi.h requires the following:
    199     '_WINDOWS',
    200   ],
    201   CPPPATH = [
    202     '$THIRD_PARTY/wtl_71/include',
    203     '$PLATFORM_SDK_VISTA_6_0_DIR/Include',
    204   ],
    205   LIBPATH = [
    206     '$PLATFORM_SDK_VISTA_6_0_DIR/Lib'
    207   ],
    208   LINKFLAGS = [
    209     '-manifest', # TODO(thaloun): Why do we need this?
    210     # Some of the third-party libraries we link in don't have public symbols, so
    211     # ignore that linker warning.
    212     '/ignore:4221',
    213     '/nxcompat',    # Binary was tested to be be compatible with Windows DEP.
    214     '/dynamicbase', # Use ASLR to dynamically rebase at load-time.
    215     '/fixed:no',    # Binary can be loaded at any base-address.
    216   ],
    217   MIDLFLAGS = [
    218     '/win32',
    219     '/I$PLATFORM_SDK_VISTA_6_0_DIR/include'
    220   ]
    221 )
    222 
    223 # TODO(dape): Figure out what this does; found it in
    224 # omaha/main.scons. This fixes the problem with redefinition
    225 # of OS_WINDOWS symbol.
    226 win_env.FilterOut(CPPDEFINES = ['OS_WINDOWS=OS_WINDOWS'])
    227 
    228 # Set up digital signing
    229 DeclareBit('test_signing', 'Sign binaries with the test certificate')
    230 win_env.SetBitFromOption('test_signing', False)
    231 if win_env.Bit('test_signing'):
    232    win_env.Replace(
    233      CERTIFICATE_PATH = win_env.File(
    234          '$GOOGLECLIENT/tools/test_key/testkey.pfx').abspath,
    235      CERTIFICATE_PASSWORD = 'test',
    236    )
    237 AddTargetGroup('signed_binaries', 'digitally signed binaries can be built')
    238 
    239 win_dbg_env = win_env.Clone(
    240   BUILD_TYPE = 'dbg',
    241   BUILD_TYPE_DESCRIPTION = 'Windows debug build',
    242   BUILD_GROUPS = ['default', 'all'],
    243   tools = ['target_debug'],
    244 )
    245 
    246 win_dbg_env.Prepend(
    247   CCFLAGS = [
    248     '/ZI',     # enable debugging
    249     '/Od',     # disable optimizations
    250     '/MTd',    # link with LIBCMTD.LIB debug lib
    251     '/RTC1',   # enable runtime checks
    252   ],
    253 )
    254 
    255 envs.append(win_dbg_env)
    256 
    257 win_dbg64_env = win_dbg_env.Clone(
    258   BUILD_TYPE = 'dbg64',
    259   BUILD_TYPE_DESCRIPTION = 'Windows debug 64bit build',
    260   BUILD_GROUPS = ['all'],
    261 )
    262 
    263 win_dbg64_env.FilterOut(CCFLAGS = ['/ZI'])
    264 
    265 win_dbg64_env.Append(
    266   CCFLAGS = [
    267     '/Zi',     # enable debugging that is 64 bit compatible.
    268     # TODO(fbarchard): fix warnings and remove these disables.
    269     '/wd4244', # disable cast warning
    270     '/wd4267', # disable cast warning
    271   ],
    272   ARFLAGS = [
    273     '/MACHINE:x64',
    274   ],
    275   CPPDEFINES = [
    276     'WIN64',
    277     'ARCH_CPU_64_BITS',
    278   ],
    279   LIBFLAGS = [
    280     '/MACHINE:x64',
    281   ],
    282   LINKFLAGS = [
    283     '/MACHINE:x64',
    284   ],
    285 )
    286 
    287 win_dbg64_env.FilterOut(CPPDEFINES = ['_USE_32BIT_TIME_T'])
    288 
    289 win_dbg64_env.Prepend(
    290   LIBPATH = [
    291       '$VC80_DIR/vc/lib/amd64',
    292       '$ATLMFC_VC80_DIR/lib/amd64',
    293       '$PLATFORM_SDK_VISTA_6_0_DIR/Lib/x64',
    294   ],
    295 )
    296 win_dbg64_env.PrependENVPath(
    297   'PATH',
    298   win_dbg64_env.Dir('$VC80_DIR/vc/bin/x86_amd64'))
    299 
    300 win_dbg64_env.SetBits('host_platform_64bit')
    301 
    302 envs.append(win_dbg64_env)
    303 
    304 win_coverage_env = win_dbg_env.Clone(
    305   tools = ['code_coverage'],
    306   BUILD_TYPE = 'coverage',
    307   BUILD_TYPE_DESCRIPTION = 'Windows code coverage build',
    308   BUILD_GROUPS = ['all'],
    309 )
    310 
    311 win_coverage_env.Append(
    312   CPPDEFINES = [
    313     'COVERAGE_ENABLED',
    314   ],
    315 )
    316 
    317 envs.append(win_coverage_env)
    318 
    319 win_opt_env = win_env.Clone(
    320   BUILD_TYPE = 'opt',
    321   BUILD_TYPE_DESCRIPTION = 'Windows opt build',
    322   BUILD_GROUPS = ['all'],
    323   tools = ['target_optimized'],
    324 )
    325 
    326 win_opt_env.Prepend(
    327   CCFLAGS=[
    328       '/Zi',       # enable debugging
    329       '/O1',       # optimize for size
    330       '/fp:fast',  # float faster but less precise
    331       '/MT',       # link with LIBCMT.LIB (multi-threaded, static linked crt)
    332       '/GS',       # enable security checks
    333   ],
    334   LINKFLAGS = [
    335     '/safeseh',     # protect against attacks against exception handlers
    336     '/opt:ref',     # Remove unused references (functions/data).
    337   ],
    338 )
    339 
    340 envs.append(win_opt_env)
    341 
    342 #-------------------------------------------------------------------------------
    343 # P O S I X
    344 #
    345 posix_env = root_env.Clone()
    346 posix_env.Append(
    347   CPPDEFINES = [
    348     'HASHNAMESPACE=__gnu_cxx',
    349     'HASH_NAMESPACE=__gnu_cxx',
    350     'POSIX',
    351     'DISABLE_DYNAMIC_CAST',
    352     # The POSIX standard says we have to define this.
    353     '_REENTRANT',
    354   ],
    355   CCFLAGS = [
    356     '-Wall',
    357     '-Werror',
    358     '-Wno-switch',
    359     '-fno-exceptions',
    360     # Needed for a clean ABI and for link-time dead-code removal to work
    361     # properly.
    362     '-fvisibility=hidden',
    363     # Generate debugging info in the DWARF2 format.
    364     '-gdwarf-2',
    365     # Generate maximal debugging information. (It is stripped from what we ship
    366     # to users, so we want it for both dbg and opt.)
    367     # Note that hammer automatically supplies "-g" for mac/linux dbg, so that
    368     # flag must be filtered out of linux_dbg and mac_dbg envs below.
    369     '-g3',
    370   ],
    371   CXXFLAGS = [
    372     '-Wno-non-virtual-dtor',
    373     '-Wno-ctor-dtor-privacy',
    374     '-fno-rtti',
    375   ],
    376 )
    377 
    378 # Switch-hit between NSS and OpenSSL
    379 if 'NSS_BUILD_PLATFORM' in root_env['ENV']:
    380    posix_env.AppendUnique(CPPDEFINES=['HAVE_NSS_SSL_H=1',
    381                                       'NSS_SSL_RELATIVE_PATH'])
    382 else:
    383    posix_env.AppendUnique(CPPDEFINES=['HAVE_OPENSSL_SSL_H=1'])
    384 
    385 
    386 #-------------------------------------------------------------------------------
    387 # M A C OSX
    388 #
    389 mac_env = posix_env.Clone(
    390   tools = [
    391     'target_platform_mac',
    392     #'talk_mac',
    393     #'fill_plist',
    394   ],
    395 )
    396 # Use static OpenSSL on mac so that we can use the latest APIs on all
    397 # supported mac platforms (10.5+).
    398 mac_env.SetBits('use_static_openssl')
    399 
    400 # For libjingle we don't specify a sysroot or minimum OS version.
    401 mac_osx_version_min_32 = ""
    402 mac_osx_version_min_64 = ""
    403 
    404 # Generic mac environment common to all targets
    405 mac_env.Append(
    406   CPPDEFINES = [
    407     'OSX',
    408   ],
    409   CCFLAGS = [
    410     '-arch', 'i386',
    411     '-fasm-blocks',
    412   ],
    413   LINKFLAGS = [
    414     '-Wl,-search_paths_first',
    415     # This flag makes all members of a static library be included in the
    416     # final exe - that increases the size of the exe, but without it
    417     # Obj-C categories aren't properly included in the exe.
    418     # TODO(thaloun): consider only defining for libs that actually have objc.
    419     '-ObjC',
    420     '-arch', 'i386',
    421     '-dead_strip',
    422   ],
    423   FRAMEWORKS = [
    424     'CoreServices',
    425     'Security',
    426     'SystemConfiguration',
    427     'OpenGL',
    428     'CoreAudio',
    429     'Quartz',
    430     'Cocoa',
    431     'QTKit',
    432   ]
    433 )
    434 
    435 if 'NSS_BUILD_PLATFORM' in root_env['ENV']:
    436   mac_env.AppendUnique(LINKFLAGS = ['-Lthird_party/mozilla/dist/' + root_env['ENV']['NSS_BUILD_PLATFORM'] + '/lib'])
    437 else:
    438   mac_env.AppendUnique(LINKFLAGS = ['-Lthird_party/openssl'])
    439 
    440 
    441 # add debug flags to environment
    442 def mac_debug_include(env):
    443   env.Append(
    444     CCFLAGS = [
    445       '-O0',
    446     ],
    447     CPPDEFINES = [
    448       'DEBUG=1',
    449     ],
    450   )
    451   # Remove -g set by hammer, which is not what we want (we have set -g3 above).
    452   env.FilterOut(CCFLAGS = ['-g'])
    453 
    454 # add 32/64 bit specific options to specified environment
    455 def mac_common_include_x86_32(env):
    456   env.Append(
    457     CCFLAGS = [
    458       '-m32',
    459     ],
    460     LINKFLAGS = [
    461       '-m32',
    462     ],
    463     FRAMEWORKS = [
    464       'Carbon',
    465       'QuickTime',
    466     ],
    467   )
    468   envs.append(env)
    469 
    470 def mac_common_include_x86_64(env):
    471   env.Append(
    472     CCFLAGS = [
    473       '-m64',
    474       '-fPIC',
    475     ],
    476     CPPDEFINES = [
    477       'ARCH_CPU_64_BITS',
    478       'CARBON_DEPRECATED',
    479     ],
    480     LINKFLAGS = [
    481       '-m64',
    482     ],
    483     FRAMEWORKS = [
    484       'AppKit',
    485     ],
    486   )
    487   env.SetBits('host_platform_64bit')
    488   envs.append(env)
    489 
    490 def mac_osx_version_min(env, ver):
    491   if ver != "":
    492     sdk_path = '/Developer/SDKs/MacOSX%s.sdk' % ver
    493     env.Append(
    494       CCFLAGS = [
    495         '-mmacosx-version-min=' + ver,
    496         '-isysroot', sdk_path,
    497       ],
    498       LINKFLAGS = [
    499         '-mmacosx-version-min=' + ver,
    500         '-isysroot', sdk_path,
    501       ],
    502       osx_sdk_path = sdk_path,
    503       osx_version_min = ver,
    504     )
    505 
    506 # Create all environments
    507 mac_dbg_env = mac_env.Clone(
    508   BUILD_TYPE = 'dbg',
    509   BUILD_TYPE_DESCRIPTION = 'Mac debug build',
    510   BUILD_GROUPS = ['default', 'all'],
    511   tools = ['target_debug'],
    512 )
    513 
    514 mac_opt_env = mac_env.Clone(
    515   BUILD_TYPE = 'opt',
    516   BUILD_TYPE_DESCRIPTION = 'Mac opt build',
    517   BUILD_GROUPS = ['all'],
    518   tools = ['target_optimized'],
    519 )
    520 
    521 mac_dbg64_env = mac_dbg_env.Clone(
    522   BUILD_TYPE = 'dbg64',
    523   BUILD_TYPE_DESCRIPTION = 'Mac debug 64bit build',
    524   BUILD_GROUPS = ['all'],
    525 )
    526 
    527 mac_opt64_env = mac_opt_env.Clone(
    528   BUILD_TYPE = 'opt64',
    529   BUILD_TYPE_DESCRIPTION = 'Mac opt 64bit build',
    530   BUILD_GROUPS = ['all'],
    531 )
    532 
    533 mac_debug_include(mac_dbg_env)
    534 mac_debug_include(mac_dbg64_env)
    535 mac_common_include_x86_32(mac_dbg_env)
    536 mac_common_include_x86_32(mac_opt_env)
    537 mac_common_include_x86_64(mac_dbg64_env)
    538 mac_common_include_x86_64(mac_opt64_env)
    539 mac_osx_version_min(mac_dbg_env, mac_osx_version_min_32)
    540 mac_osx_version_min(mac_opt_env, mac_osx_version_min_32)
    541 mac_osx_version_min(mac_dbg64_env, mac_osx_version_min_64)
    542 mac_osx_version_min(mac_opt64_env, mac_osx_version_min_64)
    543 
    544 
    545 #-------------------------------------------------------------------------------
    546 # L I N U X
    547 #
    548 linux_common_env = posix_env.Clone(
    549   tools = [
    550     'target_platform_linux',
    551     'talk_linux',
    552   ],
    553 )
    554 
    555 linux_common_env.Append(
    556   CPPDEFINES = [
    557     'LINUX',
    558   ],
    559   CCFLAGS = [
    560     # Needed for link-time dead-code removal to work properly.
    561     '-ffunction-sections',
    562     '-fdata-sections',
    563   ],
    564   LINKFLAGS = [
    565     # Enable dead-code removal.
    566     '-Wl,--gc-sections',
    567     # Elide dependencies on shared libraries that we're not actually using.
    568     '-Wl,--as-needed',
    569     '-Wl,--start-group',
    570   ],
    571   _LIBFLAGS = ['-Wl,--end-group'],
    572 )
    573 
    574 # Remove default rpath set by Hammer. Hammer sets it to LIB_DIR, which is wrong.
    575 # The rpath is the _run-time_ library search path for the resulting binary, i.e.
    576 # the one used by ld.so at load time. Setting it equal to the path to build
    577 # output on the build machine is nonsense.
    578 linux_common_env.Replace(
    579   RPATH = [],
    580 )
    581 
    582 # Enable the optional DBus-GLib code if the build machine has the required
    583 # dependency.
    584 linux_common_env.EnableFeatureWherePackagePresent('have_dbus_glib',
    585                                                   'HAVE_DBUS_GLIB',
    586                                                   'dbus-glib-1')
    587 
    588 def linux_common_include_x86_32(env):
    589   """Include x86-32 settings into an env based on linux_common."""
    590   env.Append(
    591     CCFLAGS = [
    592       '-m32',
    593     ],
    594     LINKFLAGS = [
    595       '-m32',
    596     ],
    597   )
    598 
    599 def linux_common_include_x86_64(env):
    600   """Include x86-64 settings into an env based on linux_common."""
    601   env.Append(
    602     CCFLAGS = [
    603       '-m64',
    604       '-fPIC',
    605     ],
    606     LINKFLAGS = [
    607       '-m64',
    608     ],
    609   )
    610   env.SetBits('host_platform_64bit')
    611 
    612 #-------------------------------------------------------------------------------
    613 # L I N U X -- C R O S S -- B U I L D
    614 
    615 # Cross build requires the following tool names be provided by the environment:
    616 linux_cross_common_env = linux_common_env.Clone(
    617   AR = os.environ.get("AR"),
    618   AS = os.environ.get("AS"),
    619   LD = os.environ.get("LD"),
    620   NM = os.environ.get("NM"),
    621   RANLIB = os.environ.get("RANLIB"),
    622   CC = str(os.environ.get("CC")) +
    623     ' --sysroot=' + str(os.environ.get("SYSROOT")),
    624   CXX = str(os.environ.get("CXX")) +
    625     ' --sysroot=' + str(os.environ.get("SYSROOT")),
    626 )
    627 linux_cross_common_env.SetBits('cross_compile')
    628 
    629 # The rest of these paths and flags are optional:
    630 if os.environ.get("CPPPATH"):
    631   linux_cross_common_env.Append(
    632     CPPPATH = os.environ.get("CPPPATH").split(':'),
    633   )
    634 if os.environ.get("LIBPATH"):
    635   linux_cross_common_env.Append(
    636     LIBPATH = os.environ.get("LIBPATH").split(':'),
    637   )
    638 if os.environ.get("CFLAGS"):
    639   linux_cross_common_env.Append(
    640     CFLAGS = os.environ.get("CFLAGS").split(' '),
    641   )
    642 if os.environ.get("CCFLAGS"):
    643   linux_cross_common_env.Append(
    644     CCFLAGS = os.environ.get("CCFLAGS").split(' '),
    645   )
    646 if os.environ.get("CXXFLAGS"):
    647   linux_cross_common_env.Append(
    648     CXXFLAGS = os.environ.get("CXXFLAGS").split(' '),
    649   )
    650 if os.environ.get("LIBFLAGS"):
    651   linux_cross_common_env.Append(
    652     _LIBFLAGS = os.environ.get("LIBFLAGS").split(' '),
    653   )
    654 if os.environ.get("LINKFLAGS"):
    655   linux_cross_common_env.Prepend(
    656     LINKFLAGS = os.environ.get("LINKFLAGS").split(' '),
    657   )
    658 
    659 #-------------------------------------------------------------------------------
    660 # L I N U X -- T R A D I T I O N A L -- X 8 6
    661 #
    662 # Settings that are specific to our desktop Linux x86 targets.
    663 def linux_common_include_traditional(env):
    664   """Include traditional Linux settings into an env based on linux_common."""
    665   # OpenSSL has infamously poor ABI stability, so that building against one
    666   # version and running against a different one often will not work. Since our
    667   # non-ChromeOS Linux builds are used on many different distros and distro
    668   # versions, this means we can't safely dynamically link to OpenSSL because the
    669   # product would end up being broken on any computer with a different version
    670   # installed. So instead we build it ourself and statically link to it.
    671   env.SetBits('use_static_openssl')
    672   # Enable the optional PulseAudio code if the build machine has the required
    673   # dependency.
    674   # TODO(?): This belongs in linux_common_env, but we can't safely move it there
    675   # yet because pkg-config is not being used properly with ChromeOS builds (see
    676   # TODO below).
    677   env.EnableFeatureWherePackagePresent('have_libpulse',
    678                                        'HAVE_LIBPULSE',
    679                                        'libpulse')
    680 
    681 def linux_traditional_include_dbg(env):
    682   """Include traditional Linux dbg settings into an env based on the above."""
    683   # Remove -g set by hammer, which is not what we want (we have set -g3 above).
    684   env.FilterOut(CCFLAGS = ['-g'])
    685 
    686 def linux_traditional_include_opt(env):
    687   """Include traditional Linux opt settings into an env based on the above."""
    688   # Remove -O2 set by hammer, which is not what we want.
    689   env.FilterOut(CCFLAGS = ['-O2'])
    690   env.Append(CCFLAGS = ['-Os'])
    691 
    692 def gen_linux_nonhermetic(linux_env, type_suffix, desc_suffix):
    693   groups = ['nonhermetic']
    694   if not linux_env.CrossArch():
    695     groups = groups + ['nonhermetic-native']
    696     # The non-hermetic, native-arch dbg build is the default.
    697     dbg_groups = groups + ['default']
    698     native_desc = ', native '
    699     # No suffix for native modes.
    700     type_suffix = ''
    701   else:
    702     groups = groups + ['nonhermetic-cross']
    703     dbg_groups = groups
    704     native_desc = ', cross-built for '
    705 
    706   linux_dbg_env = linux_env.Clone(
    707     BUILD_TYPE = 'dbg' + type_suffix,
    708     BUILD_TYPE_DESCRIPTION = 'Linux debug build%s%s' % (native_desc,
    709         desc_suffix),
    710     BUILD_GROUPS = dbg_groups,
    711     tools = ['target_debug'],
    712   )
    713   linux_traditional_include_dbg(linux_dbg_env)
    714   envs.append(linux_dbg_env)
    715 
    716   linux_opt_env = linux_env.Clone(
    717     BUILD_TYPE = 'opt' + type_suffix,
    718     BUILD_TYPE_DESCRIPTION = 'Linux optimized build%s%s' % (native_desc,
    719         desc_suffix),
    720     BUILD_GROUPS = groups,
    721     tools = ['target_optimized'],
    722   )
    723   linux_traditional_include_opt(linux_opt_env)
    724   envs.append(linux_opt_env)
    725 
    726 linux_nonhermetic_common_env = linux_common_env.Clone()
    727 linux_common_include_traditional(linux_nonhermetic_common_env)
    728 
    729 linux_nonhermetic_x86_32_env = linux_nonhermetic_common_env.Clone()
    730 linux_common_include_x86_32(linux_nonhermetic_x86_32_env)
    731 gen_linux_nonhermetic(linux_nonhermetic_x86_32_env, '32', '32-bit')
    732 
    733 linux_nonhermetic_x86_64_env = linux_nonhermetic_common_env.Clone()
    734 linux_common_include_x86_64(linux_nonhermetic_x86_64_env)
    735 gen_linux_nonhermetic(linux_nonhermetic_x86_64_env, '64', '64-bit')
    736 
    737 def gen_linux_hermetic(linux_env, type_suffix, desc):
    738   groups = ['hermetic']
    739 
    740   linux_dbg_env = linux_env.Clone(
    741     BUILD_TYPE = 'hermetic-dbg' + type_suffix,
    742     BUILD_TYPE_DESCRIPTION = 'Hermetic %s Linux debug build' % desc,
    743     BUILD_GROUPS = groups,
    744     tools = ['target_debug'],
    745   )
    746   linux_traditional_include_dbg(linux_dbg_env)
    747   envs.append(linux_dbg_env)
    748 
    749   linux_opt_env = linux_env.Clone(
    750     BUILD_TYPE = 'hermetic-opt' + type_suffix,
    751     BUILD_TYPE_DESCRIPTION = 'Hermetic %s Linux optimized build' % desc,
    752     BUILD_GROUPS = groups,
    753     tools = ['target_optimized'],
    754   )
    755   linux_traditional_include_opt(linux_opt_env)
    756   envs.append(linux_opt_env)
    757 
    758 linux_hermetic_common_env = linux_cross_common_env.Clone()
    759 linux_common_include_traditional(linux_hermetic_common_env)
    760 
    761 linux_hermetic_x86_32_env = linux_hermetic_common_env.Clone()
    762 linux_common_include_x86_32(linux_hermetic_x86_32_env)
    763 gen_linux_hermetic(linux_hermetic_x86_32_env, '32', '32-bit')
    764 
    765 linux_hermetic_x86_64_env = linux_hermetic_common_env.Clone()
    766 linux_common_include_x86_64(linux_hermetic_x86_64_env)
    767 gen_linux_hermetic(linux_hermetic_x86_64_env, '64', '64-bit')
    768 
    769 #-------------------------------------------------------------------------------
    770 # L I N U X -- C R O S S -- B U I L D -- A R M
    771 
    772 # TODO(noahric): All the following Linux builds are running against a sysroot
    773 # but improperly using the host machine's pkg-config environment. The ChromeOS
    774 # ones should probably be using
    775 # https://cs.corp.google.com/#chrome/src/build/linux/pkg-config-wrapper.
    776 
    777 linux_cross_arm_env = linux_cross_common_env.Clone()
    778 linux_cross_arm_env.Append(
    779   CPPDEFINES = [
    780     'NACL_BUILD_ARCH=arm',
    781     'DISABLE_EFFECTS=1',
    782   ],
    783   CCFLAGS = [
    784     '-fPIC',
    785   ],
    786 )
    787 DeclareBit('arm', 'ARM build')
    788 linux_cross_arm_env.SetBits('arm')
    789 
    790 # Detect NEON support from the -mfpu build flag.
    791 DeclareBit('arm_neon', 'ARM supporting neon')
    792 if '-mfpu=neon' in linux_cross_arm_env['CFLAGS'] or \
    793    '-mfpu=neon' in linux_cross_arm_env['CCFLAGS'] or \
    794    '-mfpu=neon' in linux_cross_arm_env['CXXFLAGS']:
    795   print "Building with ARM NEON support."
    796   linux_cross_arm_env.SetBits('arm_neon')
    797 
    798 # Detect hardfp from the -mfloat-abi build flag
    799 DeclareBit('arm_hardfp', 'ARM supporting hardfp')
    800 if '-mfloat-abi=hard' in linux_cross_arm_env['CFLAGS'] or \
    801    '-mfloat-abi=hard' in linux_cross_arm_env['CCFLAGS'] or \
    802    '-mfloat-abi=hard' in linux_cross_arm_env['CXXFLAGS']:
    803   print "Building with hard floating point support."
    804   linux_cross_arm_env.SetBits('arm_hardfp')
    805 
    806 linux_cross_arm_dbg_env = linux_cross_arm_env.Clone(
    807   BUILD_TYPE = 'arm-dbg',
    808   BUILD_TYPE_DESCRIPTION = 'Cross-compiled ARM debug build',
    809   BUILD_GROUPS = ['arm'],
    810   tools = ['target_debug'],
    811 )
    812 envs.append(linux_cross_arm_dbg_env)
    813 
    814 linux_cross_arm_opt_env = linux_cross_arm_env.Clone(
    815   BUILD_TYPE = 'arm-opt',
    816   BUILD_TYPE_DESCRIPTION = 'Cross-compiled ARM optimized build',
    817   BUILD_GROUPS = ['arm'],
    818   tools = ['target_optimized'],
    819 )
    820 envs.append(linux_cross_arm_opt_env)
    821 
    822 
    823 
    824 # Create a group for installers
    825 AddTargetGroup('all_installers', 'installers that can be built')
    826 
    827 # Parse child .scons files
    828 BuildEnvironments(envs)
    829 
    830 # Explicitly set which targets to build when not stated on commandline
    831 Default(None)
    832 # Build the following, which excludes unit test output (ie running them)
    833 # To run unittests, specify the test to run, or run_all_tests.  See -h option.
    834 Default(['all_libraries', 'all_programs', 'all_test_programs'])
    835 
    836 # .sln creation code lifted from googleclient/bar/main.scons.  Must be after
    837 # the call to BuildEnvironments for all_foo aliases to be defined.
    838 # Run 'hammer --mode=all --vsproj' to generate
    839 DeclareBit('vsproj', 'Generate Visual Studio projects and solution files.')
    840 win_env.SetBitFromOption('vsproj', False)
    841 
    842 if win_env.Bit('vsproj'):
    843   vs_env = win_env.Clone()
    844   vs_env.Append(
    845     COMPONENT_VS_SOURCE_SUFFIXES = [
    846       '.def',
    847       '.grd',
    848       '.html',
    849       '.idl',
    850       '.mk',
    851       '.txt',
    852       '.py',
    853       '.scons',
    854       '.wxs.template',
    855     ]
    856   )
    857 
    858   # Source project
    859   p = vs_env.ComponentVSDirProject(
    860     'flute_source',
    861     ['$MAIN_DIR',
    862     ],
    863     COMPONENT_VS_SOURCE_FOLDERS = [
    864       # Files are assigned to first matching folder. Folder names of None
    865       # are filters.
    866       (None, '$DESTINATION_ROOT'),
    867       ('flute', '$MAIN_DIR'),
    868       ('google3', '$GOOGLE3'),
    869       ('third_party', '$THIRD_PARTY'),
    870     ],
    871     # Force source project to main dir, so that Visual Studio can find the
    872     # source files corresponding to build errors.
    873     COMPONENT_VS_PROJECT_DIR = '$MAIN_DIR',
    874   )
    875   vs_env.AlwaysBuild(p)
    876 
    877   # Solution and target projects
    878   s = vs_env.ComponentVSSolution(
    879     # 'libjingle',  # Please uncomment this line if you build VS proj files.
    880     ['all_libraries', 'all_programs', 'all_test_programs'],
    881     projects = [p],
    882   )
    883 
    884   print '***Unfortunately the vsproj creator isn\'t smart enough to '
    885   print '***automatically get the correct output locations.  It is very easy'
    886   print '***though to change it in the properties pane to the following'
    887   print '***$(SolutionDir)/build/<foo>/staging/<bar>.exe'
    888   Default(None)
    889   Default([s])
    890