0
0
mirror of https://github.com/mongodb/mongo.git synced 2024-11-30 17:10:48 +01:00
mongodb/SConstruct

1240 lines
40 KiB
Python
Raw Normal View History

2009-07-27 23:30:41 +02:00
# -*- mode: python; -*-
2010-04-29 23:03:40 +02:00
# build file for MongoDB
# this requires scons
2009-01-06 00:19:56 +01:00
# you can get from http://www.scons.org
# then just type scons
2009-02-02 01:13:12 +01:00
# some common tasks
# build 64-bit mac and pushing to s3
2009-02-06 22:51:14 +01:00
# scons --64 s3dist
2009-02-11 03:37:18 +01:00
# scons --distname=0.8 s3dist
2009-02-12 15:10:11 +01:00
# all s3 pushes require settings.py and simples3
2009-02-02 01:13:12 +01:00
# This file, SConstruct, configures the build environment, and then delegates to
# several, subordinate SConscript files, which describe specific build rules.
EnsureSConsVersion( 1, 1, 0 )
2009-01-06 00:19:56 +01:00
import os
2009-01-27 19:08:44 +01:00
import sys
2009-11-19 18:40:23 +01:00
import imp
import types
2009-02-01 23:39:07 +01:00
import re
import shutil
2009-04-22 23:06:31 +02:00
import urllib
import urllib2
import buildscripts
2010-01-02 14:59:54 +01:00
import buildscripts.bb
2011-06-29 21:06:12 +02:00
import stat
from buildscripts import utils
2010-01-02 14:59:54 +01:00
import libdeps
def _rpartition(string, sep):
"""A replacement for str.rpartition which is missing in Python < 2.5
"""
idx = string.rfind(sep)
if idx == -1:
return '', '', string
return string[:idx], sep, string[idx + 1:]
2010-01-02 14:59:54 +01:00
buildscripts.bb.checkOk()
2009-01-06 00:19:56 +01:00
2010-12-21 17:54:46 +01:00
def findSettingsSetup():
sys.path.append( "." )
sys.path.append( ".." )
sys.path.append( "../../" )
def getThirdPartyShortNames():
lst = []
2011-12-24 21:33:26 +01:00
for x in os.listdir( "src/third_party" ):
if not x.endswith( ".py" ) or x.find( "#" ) >= 0:
continue
lst.append( _rpartition( x, "." )[0] )
return lst
2009-01-14 16:58:32 +01:00
# --- options ----
2010-11-30 04:34:42 +01:00
2010-11-30 04:48:31 +01:00
options = {}
2011-08-20 00:09:18 +02:00
options_topass = {}
def add_option( name, help , nargs , contributesToVariantDir , dest=None,
type="string", choices=None ):
2010-11-30 04:34:42 +01:00
if dest is None:
dest = name
AddOption( "--" + name ,
dest=dest,
type=type,
2010-11-30 04:34:42 +01:00
nargs=nargs,
action="store",
choices=choices,
2010-11-30 04:34:42 +01:00
help=help )
2010-11-30 04:48:31 +01:00
options[name] = { "help" : help ,
"nargs" : nargs ,
"contributesToVariantDir" : contributesToVariantDir ,
2010-11-30 04:48:31 +01:00
"dest" : dest }
2010-11-30 04:34:42 +01:00
def get_option( name ):
return GetOption( name )
2011-08-20 00:09:18 +02:00
def _has_option( name ):
2010-11-30 04:34:42 +01:00
x = get_option( name )
if x is None:
return False
2010-11-30 04:48:31 +01:00
if x == False:
return False
2010-12-01 15:52:37 +01:00
if x == "":
return False
2010-11-30 04:48:31 +01:00
return True
2011-08-20 00:09:18 +02:00
def has_option( name ):
x = _has_option(name)
2011-12-25 04:48:28 +01:00
if name not in options_topass:
# if someone already set this, don't overwrite
options_topass[name] = x
2011-08-20 00:09:18 +02:00
return x
2010-11-30 04:48:31 +01:00
def get_variant_dir():
a = []
for name in options:
o = options[name]
if not has_option( o["dest"] ):
continue
if not o["contributesToVariantDir"]:
2010-11-30 04:48:31 +01:00
continue
if o["nargs"] == 0:
a.append( name )
else:
2012-01-22 01:50:45 +01:00
x = get_option( name )
x = re.sub( "[,\\\\/]" , "_" , x )
a.append( name + "_" + x )
s = "#build/${PYSYSPLATFORM}/"
2010-11-30 04:48:31 +01:00
if len(a) > 0:
a.sort()
s += "/".join( a ) + "/"
2011-12-25 04:48:28 +01:00
else:
s += "normal/"
2010-11-30 04:48:31 +01:00
return s
2010-11-30 04:34:42 +01:00
# installation/packaging
add_option( "prefix" , "installation prefix" , 1 , False )
add_option( "distname" , "dist name (0.8.0)" , 1 , False )
add_option( "distmod", "additional piece for full dist name" , 1 , False )
add_option( "nostrip", "do not strip installed binaries" , 0 , False )
add_option( "sharedclient", "build a libmongoclient.so/.dll" , 0 , False )
add_option( "full", "include client and headers when doing scons install", 0 , False )
2010-12-01 15:52:37 +01:00
# linking options
add_option( "release" , "release build" , 0 , True )
add_option( "static" , "fully static build" , 0 , True )
2010-11-30 04:34:42 +01:00
# base compile flags
add_option( "64" , "whether to force 64 bit" , 0 , True , "force64" )
add_option( "32" , "whether to force 32 bit" , 0 , True , "force32" )
add_option( "cxx", "compiler to use" , 1 , True )
add_option( "cc", "compiler to use for c" , 1 , True )
2010-11-30 04:34:42 +01:00
add_option( "cpppath", "Include path if you have headers in a nonstandard directory" , 1 , True )
add_option( "libpath", "Library path if you have libraries in a nonstandard directory" , 1 , True )
add_option( "extrapath", "comma separated list of add'l paths (--extrapath /opt/foo/,/foo) static linking" , 1 , True )
add_option( "extrapathdyn", "comma separated list of add'l paths (--extrapath /opt/foo/,/foo) dynamic linking" , 1 , True )
add_option( "extralib", "comma separated list of libraries (--extralib js_static,readline" , 1 , True )
add_option( "staticlib", "comma separated list of libs to link statically (--staticlib js_static,boost_program_options-mt,..." , 1 , True )
add_option( "staticlibpath", "comma separated list of dirs to search for staticlib arguments" , 1 , True )
add_option( "boost-compiler", "compiler used for boost (gcc41)" , 1 , True , "boostCompiler" )
add_option( "boost-version", "boost version for linking(1_38)" , 1 , True , "boostVersion" )
2011-10-27 20:15:17 +02:00
add_option( "no-glibc-check" , "don't check for new versions of glibc" , 0 , False )
2010-11-30 04:34:42 +01:00
# experimental features
add_option( "mm", "use main memory instead of memory mapped files" , 0 , True )
add_option( "asio" , "Use Asynchronous IO (NOT READY YET)" , 0 , True )
add_option( "ssl" , "Enable SSL" , 0 , True )
2010-11-30 04:34:42 +01:00
# library choices
add_option( "usesm" , "use spider monkey for javascript" , 0 , True )
add_option( "usev8" , "use v8 for javascript" , 0 , True )
# mongo feature options
add_option( "noshell", "don't build shell" , 0 , True )
add_option( "safeshell", "don't let shell scripts run programs (still, don't run untrusted scripts)" , 0 , True )
add_option( "win2008plus", "use newer operating system API features" , 0 , False )
2010-11-30 04:34:42 +01:00
# dev options
2010-11-30 04:34:42 +01:00
add_option( "d", "debug build no optimization, etc..." , 0 , True , "debugBuild" )
add_option( "dd", "debug build no optimization, additional debug logging, etc..." , 0 , True , "debugBuildAndLogging" )
2011-01-07 16:41:54 +01:00
add_option( "durableDefaultOn" , "have durable default to on" , 0 , True )
2011-07-31 14:36:46 +02:00
add_option( "durableDefaultOff" , "have durable default to off" , 0 , True )
2010-11-30 04:34:42 +01:00
add_option( "pch" , "use precompiled headers to speed up the build (experimental)" , 0 , True , "usePCH" )
add_option( "distcc" , "use distcc for distributing builds" , 0 , False )
2011-03-11 23:06:41 +01:00
add_option( "clang" , "use clang++ rather than g++ (experimental)" , 0 , True )
2010-11-30 04:34:42 +01:00
# debugging/profiling help
2011-03-11 22:10:17 +01:00
add_option( "tcmalloc" , "link against tcmalloc" , 0 , False )
2010-11-30 04:34:42 +01:00
add_option( "gdbserver" , "build in gdb server support" , 0 , True )
add_option( "heapcheck", "link to heap-checking malloc-lib and look for memory leaks during tests" , 0 , False )
add_option( "gcov" , "compile with flags for gcov" , 0 , True )
2010-11-30 04:34:42 +01:00
add_option("smokedbprefix", "prefix to dbpath et al. for smoke tests", 1 , False )
add_option("smokeauth", "run smoke tests with --auth", 0 , False )
2010-11-29 08:36:54 +01:00
for shortName in getThirdPartyShortNames():
add_option( "use-system-" + shortName , "use system version of library " + shortName , 0 , True )
add_option( "use-system-pcre", "use system version of pcre library", 0, True )
add_option( "use-system-boost", "use system version of boost libraries", 0, True )
add_option( "use-system-all" , "use all system libraries", 0 , True )
add_option( "use-cpu-profiler",
"Link against the google-perftools profiler library",
0, True )
add_option("mongod-concurrency-level", "Concurrency level, \"global\" or \"db\"", 1, True,
type="choice", choices=["global", "db"])
# don't run configure if user calls --help
if GetOption('help'):
Return()
2009-01-14 16:58:32 +01:00
# --- environment setup ---
variantDir = get_variant_dir()
def removeIfInList( lst , thing ):
if thing in lst:
lst.remove( thing )
def printLocalInfo():
import sys, SCons
print( "scons version: " + SCons.__version__ )
print( "python version: " + " ".join( [ `i` for i in sys.version_info ] ) )
printLocalInfo()
2009-01-06 00:19:56 +01:00
boostLibs = [ "thread" , "filesystem" , "program_options" ]
onlyServer = len( COMMAND_LINE_TARGETS ) == 0 or ( len( COMMAND_LINE_TARGETS ) == 1 and str( COMMAND_LINE_TARGETS[0] ) in [ "mongod" , "mongos" , "test" ] )
nix = False
linux = False
linux64 = False
darwin = False
windows = False
freebsd = False
openbsd = False
2009-06-01 22:09:16 +02:00
solaris = False
force32 = has_option( "force32" )
2010-11-30 04:34:42 +01:00
force64 = has_option( "force64" )
if not force64 and not force32 and os.getcwd().endswith( "mongo-64" ):
force64 = True
print( "*** assuming you want a 64-bit build b/c of directory *** " )
2009-07-24 20:27:35 +02:00
msarch = None
if force32:
msarch = "x86"
elif force64:
2009-07-24 20:27:35 +02:00
msarch = "amd64"
2010-11-30 04:34:42 +01:00
release = has_option( "release" )
static = has_option( "static" )
2010-11-30 04:34:42 +01:00
debugBuild = has_option( "debugBuild" ) or has_option( "debugBuildAndLogging" )
debugLogging = has_option( "debugBuildAndLogging" )
noshell = has_option( "noshell" )
2010-11-30 04:34:42 +01:00
usesm = has_option( "usesm" )
usev8 = has_option( "usev8" )
2010-11-30 04:34:42 +01:00
asio = has_option( "asio" )
2009-12-14 18:38:53 +01:00
2010-11-30 04:34:42 +01:00
usePCH = has_option( "usePCH" )
2010-07-24 03:46:35 +02:00
justClientLib = (COMMAND_LINE_TARGETS == ['mongoclient'])
env = Environment( BUILD_DIR=variantDir,
MSVS_ARCH=msarch ,
TARGET_ARCH=msarch ,
tools=["default", "gch", "jsheader", "mergelib" ],
PYSYSPLATFORM=os.sys.platform,
PCRE_VERSION='8.30',
)
if has_option('mongod-concurrency-level'):
env.Append(CPPDEFINES=['MONGOD_CONCURRENCY_LEVEL=MONGOD_CONCURRENCY_LEVEL_%s' % get_option('mongod-concurrency-level').upper()])
libdeps.setup_environment( env )
if env['PYSYSPLATFORM'] == 'linux3':
env['PYSYSPLATFORM'] = 'linux2'
if os.sys.platform == 'win32':
env['OS_FAMILY'] = 'win'
else:
env['OS_FAMILY'] = 'posix'
2010-11-30 04:34:42 +01:00
if has_option( "cxx" ):
env["CC"] = get_option( "cxx" )
env["CXX"] = get_option( "cxx" )
2011-03-11 23:06:41 +01:00
elif has_option("clang"):
env["CC"] = 'clang'
env["CXX"] = 'clang++'
if has_option( "cc" ):
env["CC"] = get_option( "cc" )
if env['PYSYSPLATFORM'] == 'linux2':
env['LINK_LIBGROUP_START'] = '-Wl,--start-group'
env['LINK_LIBGROUP_END'] = '-Wl,--end-group'
env['RELOBJ_LIBDEPS_START'] = '--whole-archive'
env['RELOBJ_LIBDEPS_END'] = '--no-whole-archive'
env['RELOBJ_LIBDEPS_ITEM'] = ''
elif env['PYSYSPLATFORM'] == 'darwin':
env['RELOBJFLAGS'] = [ '-arch', '$PROCESSOR_ARCHITECTURE' ]
env['LINK_LIBGROUP_START'] = ''
env['LINK_LIBGROUP_END'] = ''
env['RELOBJ_LIBDEPS_START'] = '-all_load'
env['RELOBJ_LIBDEPS_END'] = ''
env['RELOBJ_LIBDEPS_ITEM'] = ''
2012-01-18 23:10:11 +01:00
elif env['PYSYSPLATFORM'].startswith('sunos'):
if force64:
env['RELOBJFLAGS'] = ['-64']
env['LINK_LIBGROUP_START'] = '-z rescan'
env['LINK_LIBGROUP_END'] = ''
2012-01-18 23:10:11 +01:00
env['RELOBJ_LIBDEPS_START'] = '-z allextract'
env['RELOBJ_LIBDEPS_END'] = '-z defaultextract'
env['RELOBJ_LIBDEPS_ITEM'] = ''
2009-07-24 20:27:35 +02:00
env["LIBPATH"] = []
2010-11-30 04:34:42 +01:00
if has_option( "libpath" ):
env["LIBPATH"] = [get_option( "libpath" )]
2010-11-30 04:34:42 +01:00
if has_option( "cpppath" ):
env["CPPPATH"] = [get_option( "cpppath" )]
env.Prepend( CPPDEFINES=[ "_SCONS" , "MONGO_EXPOSE_MACROS" , "BOOST_ENABLE_ASSERT_HANDLER" ],
CPPPATH=[ '$BUILD_DIR', "$BUILD_DIR/mongo" ] )
2009-07-24 20:27:35 +02:00
2010-11-30 04:34:42 +01:00
if has_option( "safeshell" ):
env.Append( CPPDEFINES=[ "MONGO_SAFE_SHELL" ] )
2009-07-24 20:27:35 +02:00
2011-01-07 16:41:54 +01:00
if has_option( "durableDefaultOn" ):
env.Append( CPPDEFINES=[ "_DURABLEDEFAULTON" ] )
2011-07-31 14:36:46 +02:00
if has_option( "durableDefaultOff" ):
env.Append( CPPDEFINES=[ "_DURABLEDEFAULTOFF" ] )
boostCompiler = GetOption( "boostCompiler" )
if boostCompiler is None:
boostCompiler = ""
else:
boostCompiler = "-" + boostCompiler
2009-08-31 20:56:49 +02:00
boostVersion = GetOption( "boostVersion" )
if boostVersion is None:
boostVersion = ""
else:
boostVersion = "-" + boostVersion
2010-05-23 18:33:34 +02:00
if ( not ( usesm or usev8 or justClientLib) ):
usesm = True
2011-08-20 00:09:18 +02:00
options_topass["usesm"] = True
2010-05-24 05:30:52 +02:00
distBuild = len( COMMAND_LINE_TARGETS ) == 1 and ( str( COMMAND_LINE_TARGETS[0] ) == "s3dist" or str( COMMAND_LINE_TARGETS[0] ) == "dist" )
2009-12-09 20:58:37 +01:00
extraLibPlaces = []
env['EXTRACPPPATH'] = []
env['EXTRALIBPATH'] = []
2009-12-09 21:16:28 +01:00
def addExtraLibs( s ):
2009-12-09 23:41:14 +01:00
for x in s.split(","):
env.Append( EXTRACPPPATH=[ x + "/include" ] )
env.Append( EXTRALIBPATH=[ x + "/lib" ] )
env.Append( EXTRALIBPATH=[ x + "/lib64" ] )
2009-12-09 23:34:18 +01:00
extraLibPlaces.append( x + "/lib" )
2009-12-09 21:16:28 +01:00
2010-11-30 04:34:42 +01:00
if has_option( "extrapath" ):
2009-12-09 21:16:28 +01:00
addExtraLibs( GetOption( "extrapath" ) )
2010-11-30 04:34:42 +01:00
release = True # this is so we force using .a
2009-07-22 19:42:21 +02:00
2010-11-30 04:34:42 +01:00
if has_option( "extrapathdyn" ):
2009-12-09 21:16:28 +01:00
addExtraLibs( GetOption( "extrapathdyn" ) )
2010-11-30 04:34:42 +01:00
if has_option( "extralib" ):
2009-10-16 08:20:08 +02:00
for x in GetOption( "extralib" ).split( "," ):
env.Append( LIBS=[ x ] )
2010-05-24 05:30:52 +02:00
class InstallSetup:
binaries = False
clientSrc = False
headers = False
bannerFiles = tuple()
2010-05-24 05:30:52 +02:00
headerRoot = "include"
2010-05-23 18:33:34 +02:00
2010-05-24 05:30:52 +02:00
def __init__(self):
self.default()
def default(self):
self.binaries = True
self.libraries = False
2010-05-24 05:30:52 +02:00
self.clientSrc = False
self.headers = False
self.bannerFiles = tuple()
2010-05-24 05:30:52 +02:00
self.headerRoot = "include"
2010-07-23 18:52:59 +02:00
self.clientTestsDir = None
2010-05-24 05:30:52 +02:00
def justClient(self):
self.binaries = False
self.libraries = False
2010-05-24 05:30:52 +02:00
self.clientSrc = True
self.headers = True
self.bannerFiles = [ "#distsrc/client/LICENSE.txt",
"#distsrc/client/SConstruct" ]
self.headerRoot = "mongo/"
self.clientTestsDir = "#src/mongo/client/examples/"
2010-05-24 05:30:52 +02:00
installSetup = InstallSetup()
if distBuild:
installSetup.bannerFiles = [ "#distsrc/GNU-AGPL-3.0",
"#distsrc/README",
"#distsrc/THIRD-PARTY-NOTICES", ]
2010-05-24 05:30:52 +02:00
2010-11-30 04:34:42 +01:00
if has_option( "full" ):
installSetup.headers = True
installSetup.libraries = True
# ---- other build setup -----
2009-01-20 16:22:09 +01:00
2009-02-06 16:48:39 +01:00
platform = os.sys.platform
if "uname" in dir(os):
processor = os.uname()[4]
else:
processor = "i386"
2009-02-06 16:48:39 +01:00
if force32:
processor = "i386"
if force64:
processor = "x86_64"
env['PROCESSOR_ARCHITECTURE'] = processor
2010-07-23 19:17:22 +02:00
DEFAULT_INSTALL_DIR = "/usr/local"
installDir = DEFAULT_INSTALL_DIR
2009-01-22 15:12:58 +01:00
nixLibPrefix = "lib"
2009-01-07 19:27:01 +01:00
2009-02-11 03:37:18 +01:00
distName = GetOption( "distname" )
dontReplacePackage = False
2009-02-11 03:37:18 +01:00
if distBuild:
release = True
2010-07-31 00:56:05 +02:00
def isDriverBuild():
return GetOption( "prefix" ) and GetOption( "prefix" ).find( "mongo-cxx-driver" ) >= 0
2010-11-30 04:34:42 +01:00
if has_option( "prefix" ):
installDir = GetOption( "prefix" )
2010-07-31 00:56:05 +02:00
if isDriverBuild():
installDir = '#' + installDir
2010-05-24 05:30:52 +02:00
installSetup.justClient()
def findVersion( root , choices ):
2010-05-03 23:29:49 +02:00
if not isinstance(root, list):
root = [root]
for r in root:
for c in choices:
if ( os.path.exists( r + c ) ):
return r + c
raise RuntimeError("can't find a version of [" + repr(root) + "] choices: " + repr(choices))
2009-04-12 03:19:29 +02:00
def choosePathExist( choices , default=None):
for c in choices:
2009-04-28 14:47:56 +02:00
if c != None and os.path.exists( c ):
2009-04-12 03:19:29 +02:00
return c
return default
2010-01-28 22:36:47 +01:00
def filterExists(paths):
return filter(os.path.exists, paths)
2009-01-06 00:19:56 +01:00
if "darwin" == os.sys.platform:
2009-01-28 23:27:12 +01:00
darwin = True
2009-02-06 16:48:39 +01:00
platform = "osx" # prettier than darwin
2009-01-28 23:27:12 +01:00
2009-10-16 08:20:08 +02:00
if env["CXX"] is None:
2010-11-29 08:36:54 +01:00
print( "YO" )
2009-10-16 08:20:08 +02:00
if os.path.exists( "/usr/bin/g++-4.2" ):
env["CXX"] = "g++-4.2"
2009-01-06 00:53:46 +01:00
2009-01-07 19:27:01 +01:00
nix = True
if force64:
env.Append( EXTRACPPPATH=["/usr/64/include"] )
env.Append( EXTRALIBPATH=["/usr/64/lib"] )
if installDir == DEFAULT_INSTALL_DIR and not distBuild:
installDir = "/usr/64/"
else:
env.Append( EXTRACPPPATH=filterExists(["/sw/include" , "/opt/local/include"]) )
env.Append( EXTRALIBPATH=filterExists(["/sw/lib/", "/opt/local/lib"]) )
2009-01-25 16:01:43 +01:00
2011-10-25 16:31:52 +02:00
elif os.sys.platform.startswith("linux"):
2009-03-25 18:22:09 +01:00
linux = True
2009-02-06 22:53:08 +01:00
platform = "linux"
2009-02-01 15:06:49 +01:00
env.Append( LIBS=['m'] )
2009-01-22 16:14:03 +01:00
if os.uname()[4] == "x86_64" and not force32:
linux64 = True
2009-01-22 15:12:58 +01:00
nixLibPrefix = "lib64"
env.Append( EXTRALIBPATH=["/usr/lib64" , "/lib64" ] )
2009-02-05 18:42:35 +01:00
env.Append( LIBS=["pthread"] )
2009-07-22 19:42:21 +02:00
force64 = False
2009-01-27 04:19:15 +01:00
if force32:
env.Append( EXTRALIBPATH=["/usr/lib32"] )
2009-01-27 04:19:15 +01:00
2009-01-07 19:27:01 +01:00
nix = True
2009-07-07 17:12:39 +02:00
if static:
env.Append( LINKFLAGS=" -static " )
2009-02-01 15:06:49 +01:00
elif "sunos5" == os.sys.platform:
nix = True
2009-06-01 22:09:16 +02:00
solaris = True
2010-04-27 21:48:38 +02:00
env.Append( CPPDEFINES=[ "__sunos__" ] )
2009-07-17 17:21:42 +02:00
env.Append( LIBS=["socket","resolv"] )
2009-02-01 15:06:49 +01:00
2009-11-02 02:19:00 +01:00
elif os.sys.platform.startswith( "freebsd" ):
nix = True
freebsd = True
env.Append( EXTRACPPPATH=[ "/usr/local/include" ] )
env.Append( EXTRALIBPATH=[ "/usr/local/lib" ] )
env.Append( CPPDEFINES=[ "__freebsd__" ] )
elif os.sys.platform.startswith( "openbsd" ):
nix = True
openbsd = True
env.Append( EXTRACPPPATH=[ "/usr/local/include" ] )
env.Append( EXTRALIBPATH=[ "/usr/local/lib" ] )
env.Append( CPPDEFINES=[ "__openbsd__" ] )
2009-01-07 21:51:42 +01:00
elif "win32" == os.sys.platform:
windows = True
2010-06-01 23:25:25 +02:00
#if force64:
# release = True
if has_option( "win2008plus" ):
env.Append( CPPDEFINES=[ "MONGO_USE_SRW_ON_WINDOWS" ] )
for pathdir in env['ENV']['PATH'].split(os.pathsep):
if os.path.exists(os.path.join(pathdir, 'cl.exe')):
2010-05-03 01:17:35 +02:00
print( "found visual studio at " + pathdir )
break
else:
#use current environment
env['ENV'] = dict(os.environ)
boostLibs = []
env.Append( CPPDEFINES=[ "_UNICODE" ] )
env.Append( CPPDEFINES=[ "UNICODE" ] )
2010-05-03 23:29:49 +02:00
winSDKHome = findVersion( [ "C:/Program Files/Microsoft SDKs/Windows/", "C:/Program Files (x86)/Microsoft SDKs/Windows/" ] ,
2011-02-22 20:23:07 +01:00
[ "v7.1", "v7.0A", "v7.0", "v6.1", "v6.0a", "v6.0" ] )
print( "Windows SDK Root '" + winSDKHome + "'" )
2009-01-07 21:51:42 +01:00
env.Append( EXTRACPPPATH=[ winSDKHome + "/Include" ] )
2009-01-07 21:51:42 +01:00
2010-06-01 23:25:25 +02:00
# consider adding /MP build with multiple processes option.
# /EHsc exception handling style for visual studio
# /W3 warning level
# /WX abort build on compiler warnings
env.Append( CPPFLAGS=" /EHsc /W3 " ) # /WX " )
2010-06-01 23:25:25 +02:00
# some warnings we don't like:
# c4355
# 'this' : used in base member initializer list
# The this pointer is valid only within nonstatic member functions. It cannot be used in the initializer list for a base class.
# c4800
# 'type' : forcing value to bool 'true' or 'false' (performance warning)
# This warning is generated when a value that is not bool is assigned or coerced into type bool.
# c4267
# 'var' : conversion from 'size_t' to 'type', possible loss of data
# When compiling with /Wp64, or when compiling on a 64-bit operating system, type is 32 bits but size_t is 64 bits when compiling for 64-bit targets. To fix this warning, use size_t instead of a type.
# c4244
# 'conversion' conversion from 'type1' to 'type2', possible loss of data
# An integer type is converted to a smaller integer type.
2010-06-01 23:25:25 +02:00
env.Append( CPPFLAGS=" /wd4355 /wd4800 /wd4267 /wd4244 " )
2010-06-02 00:40:31 +02:00
2011-05-30 06:30:10 +02:00
# PSAPI_VERSION relates to process api dll Psapi.dll.
env.Append( CPPDEFINES=["_CONSOLE","_CRT_SECURE_NO_WARNINGS","PSAPI_VERSION=1" ] )
2009-01-08 00:05:22 +01:00
2011-05-30 06:30:10 +02:00
# this would be for pre-compiled headers, could play with it later
#env.Append( CPPFLAGS=' /Yu"pch.h" ' )
2011-05-30 06:30:10 +02:00
# docs say don't use /FD from command line (minimal rebuild)
2012-03-07 21:43:50 +01:00
# /Gy function level linking (implicit when using /Z7)
# /Z7 debug info goes into each individual .obj file -- no .pdb created
env.Append( CPPFLAGS= " /Z7 /errorReport:none " );
2009-02-10 21:12:15 +01:00
if release:
2012-03-07 21:43:50 +01:00
# /MT: Causes your application to use the multithread, static version of the run-time library (LIBCMT.lib)
# /O2: optimize for speed (as opposed to size)
2009-02-10 21:12:15 +01:00
env.Append( CPPDEFINES=[ "NDEBUG" ] )
2012-03-07 21:43:50 +01:00
env.Append( CPPFLAGS= " /O2 /MT " )
# TODO: this has caused some linking problems :
2010-06-01 23:25:25 +02:00
# /GL whole program optimization
2010-06-03 20:29:11 +02:00
# /LTCG link time code generation
env.Append( CPPFLAGS= " /GL " )
env.Append( LINKFLAGS=" /LTCG " )
2012-03-07 21:43:50 +01:00
env.Append( ARFLAGS=" /LTCG " ) # for the Library Manager
# /DEBUG will tell the linker to create a .pdb file
# which WinDbg and Visual Studio will use to resolve
2012-03-07 21:43:50 +01:00
# symbols if you want to debug a release-mode image.
# Note that this means we can't do parallel links in the build.
env.Append( LINKFLAGS=" /DEBUG " )
2009-02-10 21:12:15 +01:00
else:
# /RTC1: - Enable Stack Frame Run-Time Error Checking; Reports when a variable is used without having been initialized
2012-03-07 21:43:50 +01:00
# (implies /Od: no optimizations)
# /MTd: Defines _DEBUG, _MT, and causes your application to use the
# debug multithread version of the run-time library (LIBCMTD.lib)
env.Append( CPPFLAGS=" /RTC1 /Od /MTd " )
if debugBuild:
2012-03-07 21:43:50 +01:00
# If you build without --d, no debug PDB will be generated, and
# linking will be faster. However, you won't be able to debug your code with the debugger.
env.Append( LINKFLAGS=" /debug " )
2012-03-07 21:43:50 +01:00
#if debugLogging:
# This is already implicit from /MDd...
#env.Append( CPPDEFINES=[ "_DEBUG" ] )
# This means --dd is always on unless you say --release
2009-01-07 21:51:42 +01:00
if force64:
env.Append( EXTRALIBPATH=[ winSDKHome + "/Lib/x64" ] )
2009-07-24 20:27:35 +02:00
else:
env.Append( EXTRALIBPATH=[ winSDKHome + "/Lib" ] )
2009-07-24 20:27:35 +02:00
2010-06-18 12:44:11 +02:00
if release:
2010-07-03 05:21:50 +02:00
#env.Append( LINKFLAGS=" /NODEFAULTLIB:MSVCPRT /NODEFAULTLIB:MSVCRTD " )
env.Append( LINKFLAGS=" /NODEFAULTLIB:MSVCPRT " )
2010-06-18 12:44:11 +02:00
else:
env.Append( LINKFLAGS=" /NODEFAULTLIB:MSVCPRT /NODEFAULTLIB:MSVCRT " )
2010-06-18 12:36:33 +02:00
winLibString = "ws2_32.lib kernel32.lib advapi32.lib Psapi.lib"
if force64:
2010-06-03 20:29:11 +02:00
winLibString += ""
#winLibString += " LIBCMT LIBCPMT "
else:
winLibString += " user32.lib gdi32.lib winspool.lib comdlg32.lib shell32.lib ole32.lib oleaut32.lib "
winLibString += " odbc32.lib odbccp32.lib uuid.lib "
# v8 calls timeGetTime()
if usev8:
2012-01-03 19:53:04 +01:00
winLibString += " winmm.lib "
2009-07-24 20:27:35 +02:00
env.Append( LIBS=Split(winLibString) )
2010-06-02 00:40:31 +02:00
# dm these should automatically be defined by the compiler. commenting out to see if works. jun2010
#if force64:
# env.Append( CPPDEFINES=["_AMD64_=1"] )
#else:
# env.Append( CPPDEFINES=["_X86_=1"] )
env.Append( EXTRACPPPATH=["#/../winpcap/Include"] )
env.Append( EXTRALIBPATH=["#/../winpcap/Lib"] )
2009-01-06 00:53:46 +01:00
else:
print( "No special config for [" + os.sys.platform + "] which probably means it won't work" )
2009-01-06 00:19:56 +01:00
env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
2009-01-07 19:27:01 +01:00
if nix:
2010-11-29 08:36:54 +01:00
2010-11-30 04:34:42 +01:00
if has_option( "distcc" ):
2010-11-29 08:36:54 +01:00
env["CXX"] = "distcc " + env["CXX"]
2011-07-01 23:57:34 +02:00
# -Winvalid-pch Warn if a precompiled header (see Precompiled Headers) is found in the search path but can't be used.
2010-11-30 04:09:07 +01:00
env.Append( CPPFLAGS="-fPIC -fno-strict-aliasing -ggdb -pthread -Wall -Wsign-compare -Wno-unknown-pragmas -Winvalid-pch" )
# env.Append( " -Wconversion" ) TODO: this doesn't really work yet
2010-07-29 04:37:09 +02:00
if linux:
env.Append( CPPFLAGS=" -Werror -pipe " )
if not has_option('clang'):
2011-03-11 23:06:41 +01:00
env.Append( CPPFLAGS=" -fno-builtin-memcmp " ) # glibc's memcmp is faster than gcc's
env.Append( CPPDEFINES="_FILE_OFFSET_BITS=64" )
env.Append( CXXFLAGS=" -Wnon-virtual-dtor -Woverloaded-virtual" )
env.Append( LINKFLAGS=" -fPIC -pthread -rdynamic" )
2009-02-17 18:24:47 +01:00
env.Append( LIBS=[] )
2009-01-08 00:05:22 +01:00
2010-09-11 00:59:29 +02:00
#make scons colorgcc friendly
env['ENV']['HOME'] = os.environ['HOME']
try:
env['ENV']['TERM'] = os.environ['TERM']
except KeyError:
pass
2010-09-11 00:59:29 +02:00
2010-11-30 04:34:42 +01:00
if linux and has_option( "sharedclient" ):
env.Append( LINKFLAGS=" -Wl,--as-needed -Wl,-zdefs " )
if linux and has_option( "gcov" ):
env.Append( CXXFLAGS=" -fprofile-arcs -ftest-coverage " )
env.Append( LINKFLAGS=" -fprofile-arcs -ftest-coverage " )
2009-02-18 05:29:28 +01:00
if debugBuild:
env.Append( CPPFLAGS=" -O0 -fstack-protector " );
env['ENV']['GLIBCXX_FORCE_NEW'] = 1; # play nice with valgrind
2009-01-30 16:29:07 +01:00
else:
2011-08-03 02:59:22 +02:00
env.Append( CPPFLAGS=" -O3 " )
#env.Append( CPPFLAGS=" -fprofile-generate" )
#env.Append( LINKFLAGS=" -fprofile-generate" )
# then:
#env.Append( CPPFLAGS=" -fprofile-use" )
#env.Append( LINKFLAGS=" -fprofile-use" )
if debugLogging:
env.Append( CPPFLAGS=" -D_DEBUG" );
2009-01-30 16:29:07 +01:00
2009-01-20 16:22:09 +01:00
if force64:
2009-01-30 16:29:07 +01:00
env.Append( CFLAGS="-m64" )
2009-01-20 16:22:09 +01:00
env.Append( CXXFLAGS="-m64" )
2009-01-22 16:14:03 +01:00
env.Append( LINKFLAGS="-m64" )
2009-01-20 16:22:09 +01:00
2009-01-22 15:12:58 +01:00
if force32:
2009-01-30 16:29:07 +01:00
env.Append( CFLAGS="-m32" )
2009-01-22 15:12:58 +01:00
env.Append( CXXFLAGS="-m32" )
2009-01-22 16:14:03 +01:00
env.Append( LINKFLAGS="-m32" )
2009-01-20 16:22:09 +01:00
2010-11-30 04:34:42 +01:00
if has_option( "gdbserver" ):
env.Append( CPPDEFINES=["USE_GDBSERVER"] )
2009-09-09 15:46:12 +02:00
# pre-compiled headers
2010-07-24 03:46:35 +02:00
if usePCH and 'Gch' in dir( env ):
2009-09-09 15:46:12 +02:00
print( "using precompiled headers" )
2011-03-11 23:06:41 +01:00
if has_option('clang'):
#env['GCHSUFFIX'] = '.pch' # clang++ uses pch.h.pch rather than pch.h.gch
#env.Prepend( CXXFLAGS=' -include pch.h ' ) # clang++ only uses pch from command line
print( "ERROR: clang pch is broken for now" )
Exit(1)
env['Gch'] = env.Gch( "$BUILD_DIR/mongo/pch.h$GCHSUFFIX",
"src/mongo/pch.h" )[0]
env['GchSh'] = env[ 'Gch' ]
elif os.path.exists( env.File("$BUILD_DIR/mongo/pch.h$GCHSUFFIX").abspath ):
2010-07-24 03:46:35 +02:00
print( "removing precompiled headers" )
os.unlink( env.File("$BUILD_DIR/mongo/pch.h.$GCHSUFFIX").abspath ) # gcc uses the file if it exists
2009-10-10 07:30:00 +02:00
if usev8:
env.Prepend( EXTRACPPPATH=["#/../v8/include/"] )
env.Prepend( EXTRALIBPATH=["#/../v8/"] )
2009-09-09 15:46:12 +02:00
2009-08-28 22:44:03 +02:00
if "uname" in dir(os):
hacks = buildscripts.findHacks( os.uname() )
if hacks is not None:
hacks.insert( env , { "linux64" : linux64 } )
if has_option( "ssl" ):
env.Append( CPPDEFINES=["MONGO_SSL"] )
env.Append( LIBS=["ssl"] )
2011-09-02 05:16:21 +02:00
if darwin:
env.Append( LIBS=["crypto"] )
2009-08-05 21:38:58 +02:00
try:
umask = os.umask(022)
except OSError:
pass
2011-06-29 21:06:12 +02:00
if not windows:
for keysuffix in [ "1" , "2" ]:
keyfile = "jstests/libs/key%s" % keysuffix
os.chmod( keyfile , stat.S_IWUSR|stat.S_IRUSR )
2011-10-11 16:30:10 +02:00
moduleFiles = {}
commonFiles = []
serverOnlyFiles = []
scriptingFiles = []
for shortName in getThirdPartyShortNames():
2011-12-24 21:33:26 +01:00
path = "src/third_party/%s.py" % shortName
myModule = imp.load_module( "src/third_party_%s" % shortName , open( path , "r" ) , path , ( ".py" , "r" , imp.PY_SOURCE ) )
2011-10-11 16:30:10 +02:00
fileLists = { "commonFiles" : commonFiles , "serverOnlyFiles" : serverOnlyFiles , "scriptingFiles" : scriptingFiles, "moduleFiles" : moduleFiles }
2011-08-20 00:09:18 +02:00
options_topass["windows"] = windows
options_topass["nix"] = nix
if has_option( "use-system-" + shortName ) or has_option( "use-system-all" ):
print( "using system version of: " + shortName )
myModule.configureSystem( env , fileLists , options_topass )
else:
myModule.configure( env , fileLists , options_topass )
2011-08-20 00:09:18 +02:00
if not has_option("use-system-all") and not has_option("use-system-pcre"):
env.Prepend(CPPPATH=[ '$BUILD_DIR/third_party/pcre-${PCRE_VERSION}' ])
2011-08-18 19:12:37 +02:00
if not has_option('use-system-all') and not has_option('use-system-boost'):
env.Prepend(CPPPATH=['$BUILD_DIR/third_party/boost'],
CPPDEFINES=['BOOST_ALL_NO_LIB'])
env.Append( CPPPATH=['$EXTRACPPPATH'],
LIBPATH=['$EXTRALIBPATH'] )
env['MONGO_COMMON_FILES'] = commonFiles
env['MONGO_SERVER_ONLY_FILES' ] = serverOnlyFiles
env['MONGO_SCRIPTING_FILES'] = scriptingFiles
env['MONGO_MODULE_FILES'] = moduleFiles
2011-12-25 04:48:28 +01:00
# --- check system ---
2009-03-18 19:15:52 +01:00
def getSysInfo():
if windows:
2009-03-19 13:51:04 +01:00
return "windows " + str( sys.getwindowsversion() )
2009-03-18 19:15:52 +01:00
else:
return " ".join( os.uname() )
def doConfigure( myenv , shell=False ):
2009-02-01 23:39:07 +01:00
conf = Configure(myenv)
2009-02-04 15:41:52 +01:00
myenv["LINKFLAGS_CLEAN"] = list( myenv["LINKFLAGS"] )
myenv["LIBS_CLEAN"] = list( myenv["LIBS"] )
2009-05-28 19:19:02 +02:00
if 'CheckCXX' in dir( conf ):
if not conf.CheckCXX():
2009-05-28 19:19:19 +02:00
print( "c++ compiler not installed!" )
2009-05-28 19:19:02 +02:00
Exit(1)
2009-05-28 19:16:03 +02:00
2009-02-17 18:24:47 +01:00
if nix and not shell:
if not conf.CheckLib( "stdc++" ):
print( "can't find stdc++ library which is needed" );
Exit(1)
2010-05-23 18:33:34 +02:00
def myCheckLib( poss , failIfNotFound=False , staticOnly=False):
2009-01-28 23:27:12 +01:00
2009-02-01 23:39:07 +01:00
if type( poss ) != types.ListType :
poss = [poss]
2009-01-28 23:27:12 +01:00
allPlaces = [];
2009-12-09 20:58:37 +01:00
allPlaces += extraLibPlaces
if nix and release:
allPlaces += myenv.subst( myenv["LIBPATH"] )
2009-02-01 23:39:07 +01:00
if not force64:
allPlaces += [ "/usr/lib" , "/usr/local/lib" ]
2009-02-01 23:39:07 +01:00
for p in poss:
for loc in allPlaces:
fullPath = loc + "/lib" + p + ".a"
if os.path.exists( fullPath ):
myenv.Append( _LIBFLAGS='${SLIBS}',
SLIBS=" " + fullPath + " " )
2009-02-01 23:39:07 +01:00
return True
2010-05-23 18:33:34 +02:00
if release and not windows and failIfNotFound:
print( "ERROR: can't find static version of: " + str( poss ) + " in: " + str( allPlaces ) )
Exit(1)
res = not staticOnly and conf.CheckLib( poss )
2009-02-04 15:21:39 +01:00
if res:
return True
if failIfNotFound:
2010-05-11 22:21:24 +02:00
print( "can't find or link against library " + str( poss ) + " in " + str( myenv["LIBPATH"] ) )
print( "see config.log for more information" )
if windows:
print( "use scons --64 when cl.exe is 64 bit compiler" )
2009-02-04 15:21:39 +01:00
Exit(1)
2009-02-04 15:21:39 +01:00
return False
2009-02-01 23:39:07 +01:00
if has_option('use-system-all') or has_option('use-system-boost'):
if not conf.CheckCXXHeader( "boost/filesystem/operations.hpp" ):
print( "can't find boost headers" )
if shell:
print( "\tshell might not compile" )
else:
Exit(1)
if asio:
if conf.CheckCXXHeader( "boost/asio.hpp" ):
myenv.Append( CPPDEFINES=[ "USE_ASIO" ] )
else:
print( "WARNING: old version of boost - you should consider upgrading" )
# this will add it if it exists and works
myCheckLib( [ "boost_system" + boostCompiler + "-mt" + boostVersion ,
"boost_system" + boostCompiler + boostVersion ] )
for b in boostLibs:
l = "boost_" + b
myCheckLib( [ l + boostCompiler + "-mt" + boostVersion ,
l + boostCompiler + boostVersion ] ,
release or not shell)
2009-08-12 20:54:53 +02:00
if not conf.CheckCXXHeader( "execinfo.h" ):
myenv.Append( CPPDEFINES=[ "NOEXECINFO" ] )
myenv["_HAVEPCAP"] = myCheckLib( ["pcap", "wpcap"] )
removeIfInList( myenv["LIBS"] , "pcap" )
removeIfInList( myenv["LIBS"] , "wpcap" )
2009-08-28 17:50:20 +02:00
if solaris:
conf.CheckLib( "rt" )
2009-08-28 17:50:20 +02:00
conf.CheckLib( "nsl" )
2009-10-10 07:30:00 +02:00
if usev8:
if debugBuild:
myCheckLib( [ "v8_g" , "v8" ] , True )
else:
myCheckLib( "v8" , True )
2009-10-10 07:30:00 +02:00
# requires ports devel/libexecinfo to be installed
if freebsd or openbsd:
myCheckLib( "execinfo", True )
env.Append( LIBS=[ "execinfo" ] )
# Handle staticlib,staticlibpath options.
staticlibfiles = []
2010-11-30 04:34:42 +01:00
if has_option( "staticlib" ):
# FIXME: probably this loop ought to do something clever
# depending on whether we want to use 32bit or 64bit
# libraries. For now, we sort of rely on the user supplying a
# sensible staticlibpath option. (myCheckLib implements an
# analogous search, but it also does other things I don't
# understand, so I'm not using it.)
2010-11-30 04:34:42 +01:00
if has_option ( "staticlibpath" ):
dirs = GetOption ( "staticlibpath" ).split( "," )
else:
dirs = [ "/usr/lib64", "/usr/lib" ]
for l in GetOption( "staticlib" ).split( "," ):
removeIfInList(myenv["LIBS"], l)
found = False
for d in dirs:
f= "%s/lib%s.a" % ( d, l )
if os.path.exists( f ):
staticlibfiles.append(f)
found = True
break
if not found:
raise RuntimeError("can't find a static %s" % l)
# 'tcmalloc' needs to be the last library linked. Please, add new libraries before this
# point.
2010-12-21 07:23:31 +01:00
if has_option( "heapcheck" ) and not shell:
if ( not debugBuild ) and ( not debugLogging ):
print( "--heapcheck needs --d or --dd" )
Exit( 1 )
if not conf.CheckCXXHeader( "google/heap-checker.h" ):
print( "--heapcheck neads header 'google/heap-checker.h'" )
Exit( 1 )
myCheckLib( "tcmalloc" , True ); # if successful, appedded 'tcmalloc' to myenv[ LIBS ]
myenv.Append( CPPDEFINES=[ "HEAP_CHECKING" ] )
myenv.Append( CPPFLAGS="-fno-omit-frame-pointer" )
# FIXME doConfigure() is being called twice, in the case of the shell. So if it is called
# with shell==True, it'd be on its second call and it would need to rearrange the libraries'
# order. The following removes tcmalloc from the LIB's list and reinserts it at the end.
2010-12-21 07:23:31 +01:00
if has_option( "heapcheck" ) and shell:
removeIfInList( myenv["LIBS"] , "tcmalloc" )
myenv.Append( LIBS="tcmalloc" )
myenv.Append(LINKCOM=" $STATICFILES")
myenv.Append(STATICFILES=staticlibfiles)
2011-03-11 22:10:17 +01:00
if has_option( "tcmalloc" ):
myCheckLib( "tcmalloc" , True ); # if successful, appedded 'tcmalloc' to myenv[ LIBS ]
2009-02-01 23:39:07 +01:00
return conf.Finish()
env = doConfigure( env )
2009-01-27 04:19:15 +01:00
testEnv = env.Clone()
testEnv.Append( CPPPATH=["../"] )
2009-02-01 23:39:07 +01:00
shellEnv = None
2009-02-09 20:30:45 +01:00
if noshell:
print( "not building shell" )
2009-02-12 03:05:28 +01:00
elif not onlyServer:
shellEnv = env.Clone();
if release and ( ( darwin and force64 ) or linux64 ):
shellEnv["LINKFLAGS"] = env["LINKFLAGS_CLEAN"]
shellEnv["LIBS"] = env["LIBS_CLEAN"]
shellEnv["SLIBS"] = ""
2009-02-02 00:41:25 +01:00
2009-02-12 03:05:28 +01:00
if windows:
shellEnv.Append( LIBS=["winmm.lib"] )
shellEnv = doConfigure( shellEnv , shell=True )
2009-02-02 00:26:18 +01:00
def checkErrorCodes():
import buildscripts.errorcodes as x
if x.checkErrorCodes() == False:
print( "next id to use:" + str( x.getNextCode() ) )
Exit(-1)
checkErrorCodes()
2010-07-14 19:50:39 +02:00
# ---- Docs ----
def build_docs(env, target, source):
from buildscripts import docs
docs.main()
env.Alias("docs", [], [build_docs])
env.AlwaysBuild("docs")
2010-12-29 08:04:19 +01:00
# ---- astyle ----
def doStyling( env , target , source ):
2011-01-04 07:52:48 +01:00
res = utils.execsys( "astyle --version" )
2011-01-04 07:56:07 +01:00
res = " ".join(res)
if res.count( "2." ) == 0:
print( "astyle 2.x needed, found:" + res )
2011-01-04 07:52:48 +01:00
Exit(-1)
2011-01-04 05:40:03 +01:00
files = utils.getAllSourceFiles()
files = filter( lambda x: not x.endswith( ".c" ) , files )
2011-01-26 00:22:24 +01:00
2011-01-04 05:40:03 +01:00
cmd = "astyle --options=mongo_astyle " + " ".join( files )
2010-12-29 08:04:19 +01:00
res = utils.execsys( cmd )
print( res[0] )
print( res[1] )
2011-01-04 05:40:03 +01:00
env.Alias( "style" , [] , [ doStyling ] )
env.AlwaysBuild( "style" )
2010-12-29 08:04:19 +01:00
2009-01-12 21:27:55 +01:00
# ---- INSTALL -------
def getSystemInstallName():
n = platform + "-" + processor
if static:
n += "-static"
2010-12-21 07:23:31 +01:00
if has_option("nostrip"):
2010-07-28 06:55:58 +02:00
n += "-debugsymbols"
2009-08-14 20:29:59 +02:00
if nix and os.uname()[2].startswith( "8." ):
n += "-tiger"
2009-11-20 19:47:22 +01:00
try:
2010-12-21 17:54:46 +01:00
findSettingsSetup()
2009-11-20 19:47:22 +01:00
import settings
if "distmod" in dir( settings ):
n = n + "-" + str( settings.distmod )
except:
pass
2010-01-29 16:43:02 +01:00
dn = GetOption( "distmod" )
if dn and len(dn) > 0:
n = n + "-" + dn
2009-11-20 19:47:22 +01:00
return n
def getCodeVersion():
2011-12-24 21:33:26 +01:00
fullSource = open( "src/mongo/util/version.cpp" , "r" ).read()
allMatches = re.findall( r"versionString.. = \"(.*?)\"" , fullSource );
if len(allMatches) != 1:
print( "can't find version # in code" )
return None
return allMatches[0]
2010-05-28 17:49:07 +02:00
if getCodeVersion() == None:
Exit(-1)
def getDistName( sofar ):
global distName
global dontReplacePackage
if distName is not None:
return distName
if str( COMMAND_LINE_TARGETS[0] ) == "s3dist":
version = getCodeVersion()
if not version.endswith( "+" ) and not version.endswith("-"):
print( "got real code version, doing release build for: " + version )
dontReplacePackage = True
distName = version
return version
2009-12-05 17:54:36 +01:00
2010-07-19 21:37:19 +02:00
return utils.getGitBranchString( "" , "-" ) + today.strftime( "%Y-%m-%d" )
2009-12-05 17:54:36 +01:00
2009-02-06 16:48:39 +01:00
if distBuild:
2010-07-31 00:56:05 +02:00
if isDriverBuild():
installDir = GetOption( "prefix" )
else:
from datetime import date
today = date.today()
installDir = "#mongodb-" + getSystemInstallName() + "-"
2010-07-31 00:56:05 +02:00
installDir += getDistName( installDir )
print "going to make dist: " + installDir[1:]
2009-01-12 21:27:55 +01:00
env['NIX_LIB_DIR'] = nixLibPrefix
env['INSTALL_DIR'] = installDir
if testEnv is not None:
testEnv['INSTALL_DIR'] = installDir
if shellEnv is not None:
shellEnv['INSTALL_DIR'] = installDir
# ---- CONVENIENCE ----
def tabs( env, target, source ):
from subprocess import Popen, PIPE
from re import search, match
diff = Popen( [ "git", "diff", "-U0", "origin", "master" ], stdout=PIPE ).communicate()[ 0 ]
sourceFile = False
for line in diff.split( "\n" ):
if match( "diff --git", line ):
2009-01-18 16:23:57 +01:00
sourceFile = not not search( "\.(h|hpp|c|cpp)\s*$", line )
2009-01-17 16:33:43 +01:00
if sourceFile and match( "\+ *\t", line ):
return True
return False
env.Alias( "checkSource", [], [ tabs ] )
env.AlwaysBuild( "checkSource" )
def gitPush( env, target, source ):
import subprocess
return subprocess.call( [ "git", "push" ] )
env.Alias( "push", [ ".", "smoke", "checkSource" ], gitPush )
env.AlwaysBuild( "push" )
2009-01-27 19:08:44 +01:00
# ---- deploying ---
2009-02-11 03:37:18 +01:00
def s3push( localName , remoteName=None , remotePrefix=None , fixName=True , platformDir=True ):
localName = str( localName )
2009-02-11 03:37:18 +01:00
if remotePrefix is None:
if distName is None:
2010-07-19 21:37:19 +02:00
remotePrefix = utils.getGitBranchString( "-" ) + "-latest"
2009-02-11 03:37:18 +01:00
else:
remotePrefix = "-" + distName
2010-12-21 17:54:46 +01:00
findSettingsSetup()
2009-01-27 19:08:44 +01:00
import simples3
import settings
2009-01-27 19:08:44 +01:00
s = simples3.S3Bucket( settings.bucket , settings.id , settings.key )
2009-01-27 19:08:44 +01:00
if remoteName is None:
2009-01-27 19:08:44 +01:00
remoteName = localName
2009-02-02 04:11:26 +01:00
if fixName:
(root,dot,suffix) = _rpartition( localName, "." )
name = remoteName + "-" + getSystemInstallName()
2009-07-07 17:12:39 +02:00
name += remotePrefix
if dot == "." :
name += "." + suffix
2009-02-02 04:11:26 +01:00
name = name.lower()
else:
name = remoteName
2010-07-31 00:56:05 +02:00
if isDriverBuild():
name = "cxx-driver/" + name
elif platformDir:
2009-02-06 16:48:39 +01:00
name = platform + "/" + name
print( "uploading " + localName + " to http://s3.amazonaws.com/" + s.name + "/" + name )
if dontReplacePackage:
for ( key , modify , etag , size ) in s.listdir( prefix=name ):
print( "error: already a file with that name, not uploading" )
Exit(2)
s.put( name , open( localName , "rb" ).read() , acl="public-read" );
2009-02-11 03:37:18 +01:00
print( " done uploading!" )
2009-01-27 19:08:44 +01:00
def s3shellpush( env , target , source ):
s3push( "mongo" , "mongo-shell" )
env.Alias( "s3shell" , [ "mongo" ] , [ s3shellpush ] )
env.AlwaysBuild( "s3shell" )
2009-02-02 00:27:04 +01:00
def s3dist( env , target , source ):
2009-02-11 16:53:51 +01:00
s3push( distFile , "mongodb" )
env.Append( TARFLAGS=" -z " )
2009-02-02 00:27:04 +01:00
2010-05-05 16:56:44 +02:00
if installDir[-1] != "/":
if windows:
distFile = env.Zip( installDir + ".zip", installDir )[0]
2010-05-05 16:56:44 +02:00
else:
distFile = env.Tar( installDir + '.tgz', installDir )[0]
2010-05-05 16:56:44 +02:00
env.Alias( "dist" , distFile )
env.Alias( "s3dist" , [ distFile ] , [ s3dist ] )
2010-05-05 16:56:44 +02:00
env.AlwaysBuild( "s3dist" )
2009-02-02 00:27:04 +01:00
# --- an uninstall target ---
if len(COMMAND_LINE_TARGETS) > 0 and 'uninstall' in COMMAND_LINE_TARGETS:
SetOption("clean", 1)
# By inspection, changing COMMAND_LINE_TARGETS here doesn't do
# what we want, but changing BUILD_TARGETS does.
BUILD_TARGETS.remove("uninstall")
BUILD_TARGETS.append("install")
# The following symbols are exported for use in subordinate SConscript files.
# Ideally, the SConscript files would be purely declarative. They would only
# import build environment objects, and would contain few or no conditional
# statements or branches.
#
# Currently, however, the SConscript files do need some predicates for
# conditional decision making that hasn't been moved up to this SConstruct file,
# and they are exported here, as well.
Export("env")
Export("shellEnv")
Export("testEnv")
Export("has_option")
Export("installSetup getSysInfo")
Export("usesm usev8")
Export("darwin windows solaris linux nix")
env.SConscript( 'src/SConscript', variant_dir=variantDir, duplicate=False )
env.SConscript( 'SConscript.smoke' )
2012-01-21 08:03:12 +01:00
def clean_old_dist_builds(env, target, source):
prefix = "mongodb-%s-%s" % (platform, processor)
filenames = sorted(os.listdir("."))
filenames = [x for x in filenames if x.startswith(prefix)]
to_keep = [x for x in filenames if x.endswith(".tgz") or x.endswith(".zip")][-2:]
for filename in [x for x in filenames if x not in to_keep]:
print "removing %s" % filename
try:
shutil.rmtree(filename)
except:
os.remove(filename)
env.Alias("dist_clean", [], [clean_old_dist_builds])
env.AlwaysBuild("dist_clean")