1 # -*- Python -*- 2 # 3 # All the helper functions are defined in: 4 # - site_scons/talk.py 5 # Use 'import talk' in any .scons file to get access to it. 6 # Add any new helper functions to it; unittest are available 7 # in talk_unittest.py. 8 # 9 # Each 'component' that is built is defined in a .scons file. 10 # See talk.Components(...) for further info on file naming convention. 11 # 12 # To add a new platform clone and modify the root_env object. Remember to add 13 # the new environment object to the envs list otherwise it will not be included 14 # in the build. 15 # 16 # 17 # 18 import talk 19 import os 20 import platform 21 22 #------------------------------------------------------------------------------- 23 # The build files/directories to 'build'. 24 # If the name is the name of a directory then that directory shall contain a 25 # .scons file with the same name as the directory itself: 26 # Ex: The directory session/phone contains a file called phone.scons 27 # 28 components = talk.Components("libjingle.scons") 29 30 #------------------------------------------------------------------------------- 31 # Build environments 32 # 33 34 # The list of build environments. 35 envs = [] 36 37 # The root of all builds. 38 root_env = Environment( 39 tools = [ 40 'component_bits', 41 'component_setup', 42 'replace_strings', 43 'talk_noops', 44 #'talk_linux', 45 ], 46 BUILD_SCONSCRIPTS = components, 47 DESTINATION_ROOT = '$MAIN_DIR/build', 48 CPPPATH = [ 49 '$OBJ_ROOT', # generated headers are relative to here 50 '$MAIN_DIR/..', # TODO: how can we use GOOGLECLIENT instead? 51 ], 52 CPPDEFINES = [ 53 # Temp flag while porting to hammer. 54 'HAMMER_TIME=1', 55 'LOGGING=1', 56 57 # Feature selection 58 'FEATURE_ENABLE_SSL', 59 'FEATURE_ENABLE_VOICEMAIL', 60 'FEATURE_ENABLE_PSTN', 61 'HAVE_SRTP', 62 ] 63 ) 64 65 # This is where we set common environments 66 # 67 # Detect if running on 64 bit or 32 bit host. 68 DeclareBit('platform_arch_64bit', 'Host Platform is 64 Bit') 69 if platform.architecture()[0] == "64bit": 70 root_env.SetBits('platform_arch_64bit') 71 72 DeclareBit('use_static_openssl', 'Build OpenSSL as a static library') 73 74 75 #------------------------------------------------------------------------------- 76 # W I N D O W S 77 # 78 win_env = root_env.Clone( 79 tools = [ 80 'atlmfc_vc80', 81 #'code_signing', 82 'component_targets_msvs', 83 'directx_9_0_c', 84 #'grid_builder', 85 'midl', 86 'target_platform_windows', 87 ], 88 # Don't use default vc80 midl.exe. It doesn't understand vista_sdk idl files. 89 MIDL = '$PLATFORM_SDK_VISTA_6_0_DIR/Bin/midl.exe ', 90 WIX_DIR = '$GOOGLECLIENT/third_party/wix/v3_0_2925/files', 91 # Flags for debug and optimization are added to CCFLAGS instead 92 CCPDBFLAGS = '', 93 CCFLAGS_DEBUG = '', 94 CCFLAGS_OPTIMIZED = '', 95 # We force a x86 target even when building on x64 Windows platforms. 96 TARGET_ARCH = 'x86', 97 ) 98 99 win_env.Append( 100 COMPONENT_LIBRARY_PUBLISH = True, # Put dlls in output dir too 101 CCFLAGS = [ 102 '/Fd${TARGET}.pdb', # pdb per object allows --jobs= 103 '/WX', # warnings are errors 104 '/Zc:forScope', # handle 'for (int i = 0 ...)' right 105 '/EHs-c-', # disable C++ EH 106 '/GR-', # disable RTTI 107 '/wd4996', # ignore POSIX deprecated warnings 108 109 # promote certain level 4 warnings 110 '/w14701', # potentially uninitialized var 111 '/w14702', # unreachable code 112 '/w14706', # assignment within a conditional 113 '/w14709', # comma operator within array index 114 '/w14063', # case 'identifier' is not a valid value for switch of enum 115 '/w14064', # switch of incomplete enum 'enumeration' 116 '/w14057', # 'identifier1' indirection to slightly different base 117 # types from 'identifier2' 118 '/w14263', # member function does not override any base class virtual 119 # member function 120 '/w14266', # no override available for virtual memberfunction from base 121 # 'type'; function is hidden 122 '/w14296', # expression is always false 123 '/w14355', # 'this' : used in base member initializer list 124 ], 125 CPPDEFINES = [ 126 '_ATL_CSTRING_EXPLICIT_CONSTRUCTORS', 127 # TODO: encapsulate all string operations that are not based 128 # on std::string/std::wstring and make sure we use the safest versions 129 # available on all platforms. 130 '_CRT_SECURE_NO_WARNINGS', 131 '_SCL_SECURE_NO_WARNINGS', 132 '_USE_32BIT_TIME_T', 133 '_UNICODE', 134 'UNICODE', 135 '_HAS_EXCEPTIONS=0', 136 'WIN32', 137 # TODO: remove this from logging.cc and enable here instead. 138 #'WIN32_LEAN_AND_MEAN', 139 140 'WINVER=0x0500', 141 '_WIN32_WINNT=0x0501', 142 '_WIN32_IE=0x0501', 143 # The Vista platform SDK 6.0 needs at least 144 # this NTDDI version or else the headers 145 # that LMI includes from it won't compile. 146 'NTDDI_VERSION=NTDDI_WINXP', 147 148 # npapi.h requires the following: 149 '_WINDOWS', 150 ], 151 CPPPATH = [ 152 '$THIRD_PARTY/wtl_71/include', 153 '$PLATFORM_SDK_VISTA_6_0_DIR/Include', 154 ], 155 LIBPATH = [ 156 '$PLATFORM_SDK_VISTA_6_0_DIR/Lib' 157 ], 158 LINKFLAGS = [ 159 '-manifest' # TODO: Why do we need this? 160 ], 161 MIDLFLAGS = [ 162 '/win32', 163 '/I$PLATFORM_SDK_VISTA_6_0_DIR/include' 164 ] 165 ) 166 167 # TODO: Figure out what this does; found it in 168 # omaha/main.scons. This fixes the problem with redefinition 169 # of OS_WINDOWS symbol. 170 win_env.FilterOut(CPPDEFINES = ['OS_WINDOWS=OS_WINDOWS']) 171 172 # Set up digital signing 173 DeclareBit('test_signing', 'Sign binaries with the test certificate') 174 win_env.SetBitFromOption('test_signing', False) 175 if win_env.Bit('test_signing'): 176 win_env.Replace( 177 CERTIFICATE_PATH = win_env.File( 178 '$GOOGLECLIENT/tools/test_key/testkey.pfx').abspath, 179 CERTIFICATE_PASSWORD = 'test', 180 ) 181 AddTargetGroup('signed_binaries', 'digitally signed binaries can be built') 182 183 win_dbg_env = win_env.Clone( 184 BUILD_TYPE = 'dbg', 185 BUILD_TYPE_DESCRIPTION = 'Windows debug build', 186 BUILD_GROUPS = ['default', 'all'], 187 tools = ['target_debug'], 188 ) 189 190 win_dbg_env.Prepend( 191 CCFLAGS = [ 192 '/ZI', # enable debugging 193 '/Od', # disable optimizations 194 '/MTd', # link with LIBCMTD.LIB debug lib 195 '/RTC1', # enable runtime checks 196 ], 197 ) 198 199 envs.append(win_dbg_env) 200 201 win_coverage_env = win_dbg_env.Clone( 202 tools = ['code_coverage'], 203 BUILD_TYPE = 'coverage', 204 BUILD_TYPE_DESCRIPTION = 'Windows code coverage build', 205 BUILD_GROUPS = ['all'], 206 ) 207 208 win_coverage_env.Append( 209 CPPDEFINES = [ 210 'COVERAGE_ENABLED', 211 ], 212 ) 213 214 envs.append(win_coverage_env) 215 216 win_opt_env = win_env.Clone( 217 BUILD_TYPE = 'opt', 218 BUILD_TYPE_DESCRIPTION = 'Windows opt build', 219 BUILD_GROUPS = ['all'], 220 tools = ['target_optimized'], 221 ) 222 223 win_opt_env.Prepend( 224 CCFLAGS=[ 225 '/Zi', # enable debugging 226 '/O1', # optimize for size 227 '/MT', # link with LIBCMT.LIB (multi-threaded, static linked crt) 228 '/GS', # enable security checks 229 ], 230 LINKFLAGS = [ 231 '/safeseh', 232 ], 233 ) 234 235 envs.append(win_opt_env) 236 237 238 #------------------------------------------------------------------------------- 239 # P O S I X 240 # 241 posix_env = root_env.Clone() 242 posix_env.Append( 243 CPPDEFINES = [ 244 'HASHNAMESPACE=__gnu_cxx', 245 'HASH_NAMESPACE=__gnu_cxx', 246 'POSIX', 247 'DISABLE_DYNAMIC_CAST', 248 'HAVE_OPENSSL_SSL_H=1', 249 # The POSIX standard says we have to define this. 250 '_REENTRANT', 251 ], 252 CCFLAGS = [ 253 '-Wall', 254 '-Werror', 255 '-Wno-switch', 256 '-fno-exceptions', 257 ], 258 CXXFLAGS = [ 259 '-Wno-non-virtual-dtor', 260 '-Wno-ctor-dtor-privacy', 261 '-fno-rtti', 262 ], 263 ) 264 265 #------------------------------------------------------------------------------- 266 # M A C OSX 267 # 268 mac_env = posix_env.Clone( 269 tools = [ 270 'target_platform_mac', 271 #'talk_mac', 272 #'fill_plist', 273 ], 274 ) 275 mac_env.Append( 276 CPPDEFINES = [ 277 'OSX', 278 'MAC_OS_X_VERSION_MIN_REQUIRED=1040', 279 ], 280 CCFLAGS = [ 281 '-m32', 282 '-arch', 'i386', 283 '-isysroot', '/Developer/SDKs/MacOSX10.5.sdk', 284 '-fasm-blocks', 285 ], 286 LINKFLAGS = [ 287 '-Wl,-search_paths_first', 288 # This flag makes all members of a static library be included in the 289 # final exe - that increases the size of the exe, but without it 290 # Obj-C categories aren't properly included in the exe. 291 # TODO: consider only defining for libs that actually have objc. 292 '-ObjC', 293 '-arch', 'i386', 294 '-m32', 295 ], 296 FRAMEWORKS = [ 297 'CoreServices', 298 'Carbon', 299 'Security', 300 'SystemConfiguration', 301 'OpenGL', 302 'CoreAudio', 303 'Quartz', 304 'QuickTime', 305 'Cocoa', 306 'QTKit', 307 ] 308 ) 309 310 mac_dbg_env = mac_env.Clone( 311 BUILD_TYPE = 'dbg', 312 BUILD_TYPE_DESCRIPTION = 'Mac debug build', 313 BUILD_GROUPS = ['default', 'all'], 314 tools = ['target_debug'], 315 ) 316 mac_dbg_env.Append( 317 CCFLAGS = [ 318 '-O0', 319 ] 320 ) 321 envs.append(mac_dbg_env) 322 323 mac_opt_env = mac_env.Clone( 324 BUILD_TYPE = 'opt', 325 BUILD_TYPE_DESCRIPTION = 'Mac opt build', 326 BUILD_GROUPS = ['all'], 327 tools = ['target_optimized'], 328 ) 329 mac_opt_env.Append( 330 CCFLAGS = [ 331 # TODO: Figure out how mk can compile without 332 # this flag, then remove. Confirmed asserts are preprocessed 333 # out. Maybe it's a different version of gcc? 334 '-Wno-unused-variable', 335 ], 336 ) 337 envs.append(mac_opt_env) 338 339 #------------------------------------------------------------------------------- 340 # L I N U X 341 # 342 linux_common_env = posix_env.Clone( 343 tools = [ 344 'target_platform_linux', 345 #'talk_linux', 346 ], 347 ) 348 349 linux_common_env.Append( 350 CPPDEFINES = [ 351 'LINUX', 352 'HAVE_GLIB', 353 # 'HAVE_DBUS_GLIB', 354 ], 355 CCFLAGS = [ 356 # TODO: Some or all of this may be desirable for Mac too. 357 # Needed for link-time dead-code removal to work properly. 358 '-ffunction-sections', 359 '-fdata-sections', 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 '-g3', 368 ], 369 LINKFLAGS = [ 370 # Enable dead-code removal. 371 '-Wl,--gc-sections', 372 '-Wl,--start-group', 373 ], 374 _LIBFLAGS = ['-Wl,--end-group'], 375 ) 376 377 # Remove default rpath set by Hammer. Hammer sets it to LIB_DIR, which is wrong. 378 # The rpath is the _run-time_ library search path for the resulting binary, i.e. 379 # the one used by ld.so at load time. Setting it equal to the path to build 380 # output on the build machine is nonsense. 381 linux_common_env.Replace( 382 RPATH = [], 383 ) 384 385 #------------------------------------------------------------------------------- 386 # L I N U X -- T R A D I T I O N A L 387 # 388 # Settings that are specific to our desktop Linux targets. 389 linux_env = linux_common_env.Clone() 390 # OpenSSL has infamously poor ABI stability, so that building against one 391 # version and running against a different one often will not work. Since our 392 # non-ChromeOS Linux builds are used on many different distros and distro 393 # versions, this means we can't safely dynamically link to OpenSSL because the 394 # product would end up being broken on any computer with a different version 395 # installed. So instead we build it ourself and statically link to it. 396 linux_env.SetBits('use_static_openssl') 397 linux_env.Append( 398 CCFLAGS = [ 399 '-m32', 400 ], 401 LINKFLAGS = [ 402 '-m32', 403 ], 404 ) 405 406 linux_dbg_env = linux_env.Clone( 407 BUILD_TYPE = 'dbg', 408 BUILD_TYPE_DESCRIPTION = 'Linux debug build', 409 BUILD_GROUPS = ['default', 'all'], 410 tools = ['target_debug'], 411 ) 412 # Remove -g set by hammer, which is not what we want (we have set -g3 above). 413 linux_dbg_env.FilterOut(CCFLAGS = ['-g']) 414 envs.append(linux_dbg_env) 415 416 linux_opt_env = linux_env.Clone( 417 BUILD_TYPE = 'opt', 418 BUILD_TYPE_DESCRIPTION = 'Linux optimized build', 419 BUILD_GROUPS = ['all'], 420 tools = ['target_optimized'], 421 ) 422 # Remove -O2 set by hammer, which is not what we want. 423 linux_opt_env.FilterOut(CCFLAGS = ['-O2']) 424 linux_opt_env.Append(CCFLAGS = ['-Os']) 425 envs.append(linux_opt_env) 426 427 428 429 # TODO(): Clone linux envs for 64bit. See 'variant' documentation. 430 431 # Create a group for installers 432 AddTargetGroup('all_installers', 'installers that can be built') 433 434 # Parse child .scons files 435 BuildEnvironments(envs) 436 437 # Explicitly set which targets to build when not stated on commandline 438 Default(None) 439 # Build the following, which excludes unit test output (ie running them) 440 # To run unittests, specify the test to run, or run_all_tests. See -h option. 441 Default(['all_libraries', 'all_programs', 'all_test_programs']) 442 443 # .sln creation code lifted from googleclient/bar/main.scons. Must be after 444 # the call to BuildEnvironments for all_foo aliases to be defined. 445 # Run 'hammer --mode=all --vsproj' to generate 446 DeclareBit('vsproj', 'Generate Visual Studio projects and solution files.') 447 win_env.SetBitFromOption('vsproj', False) 448 449 if win_env.Bit('vsproj'): 450 vs_env = win_env.Clone() 451 vs_env.Append( 452 COMPONENT_VS_SOURCE_SUFFIXES = [ 453 '.def', 454 '.grd', 455 '.html', 456 '.idl', 457 '.mk', 458 '.txt', 459 '.py', 460 '.scons', 461 '.wxs.template', 462 ] 463 ) 464 465 # Source project 466 p = vs_env.ComponentVSDirProject( 467 'flute_source', 468 ['$MAIN_DIR', 469 '$THIRD_PARTY'], 470 COMPONENT_VS_SOURCE_FOLDERS = [ 471 # Files are assigned to first matching folder. Folder names of None 472 # are filters. 473 (None, '$DESTINATION_ROOT'), 474 ('flute', '$MAIN_DIR'), 475 ('google3', '$GOOGLE3'), 476 ('third_party', '$THIRD_PARTY'), 477 ], 478 # Force source project to main dir, so that Visual Studio can find the 479 # source files corresponding to build errors. 480 COMPONENT_VS_PROJECT_DIR = '$MAIN_DIR', 481 ) 482 vs_env.AlwaysBuild(p) 483 484 # Solution and target projects 485 s = vs_env.ComponentVSSolution( 486 # 'libjingle', # Please uncomment this line if you build VS proj files. 487 ['all_libraries', 'all_programs', 'all_test_programs'], 488 projects = [p], 489 ) 490 491 print '***Unfortunately the vsproj creator isn\'t smart enough to ' 492 print '***automatically get the correct output locations. It is very easy' 493 print '***though to change it in the properties pane to the following' 494 print '***($SolutionDir)/build/<foo>/staging/<bar>.exe' 495 Default(None) 496 Default([s]) 497