henrike@webrtc.org | 28e2075 | 2013-07-10 00:45:36 +0000 | [diff] [blame] | 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]) |