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

1544 lines
46 KiB
Python
Raw Normal View History

2009-07-27 23:30:41 +02:00
# -*- mode: python; -*-
2009-01-06 00:19:56 +01:00
# build file for 10gen db
# this request scons
# 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
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
buildscripts.bb.checkOk()
2009-01-06 00:19:56 +01:00
2009-01-14 16:58:32 +01:00
# --- options ----
AddOption('--prefix',
dest='prefix',
type='string',
nargs=1,
action='store',
metavar='DIR',
help='installation prefix')
2009-02-11 03:37:18 +01:00
AddOption('--distname',
dest='distname',
type='string',
nargs=1,
action='store',
metavar='DIR',
help='dist name (0.8.0)')
2009-01-20 16:22:09 +01:00
AddOption( "--64",
dest="force64",
type="string",
nargs=0,
action="store",
help="whether to force 64 bit" )
2009-01-14 16:58:32 +01:00
2009-01-22 15:12:58 +01:00
AddOption( "--32",
dest="force32",
type="string",
nargs=0,
action="store",
help="whether to force 32 bit" )
AddOption( "--mm",
dest="mm",
type="string",
nargs=0,
action="store",
help="use main memory instead of memory mapped files" )
2009-01-27 04:19:15 +01:00
AddOption( "--release",
dest="release",
type="string",
nargs=0,
action="store",
help="relase build")
2009-01-22 15:12:58 +01:00
2009-07-07 17:12:39 +02:00
AddOption( "--static",
dest="static",
type="string",
nargs=0,
action="store",
help="fully static build")
2009-01-19 19:02:41 +01:00
AddOption('--java',
dest='javaHome',
type='string',
default="/opt/java/",
nargs=1,
action='store',
metavar='DIR',
help='java home')
2009-04-15 16:45:15 +02:00
AddOption('--nojni',
dest='nojni',
type="string",
nargs=0,
action="store",
help="turn off jni support" )
2009-04-23 23:40:43 +02:00
AddOption('--usesm',
dest='usesm',
type="string",
nargs=0,
action="store",
help="use spider monkey for javascript" )
2009-10-10 07:30:00 +02:00
AddOption('--usev8',
dest='usev8',
type="string",
nargs=0,
action="store",
help="use v8 for javascript" )
AddOption('--usejvm',
dest='usejvm',
type="string",
nargs=0,
action="store",
help="use java for javascript" )
2009-12-14 18:38:53 +01:00
AddOption('--asio',
dest='asio',
type="string",
nargs=0,
action="store",
help="Use Asynchronous IO (NOT READY YET)" )
2009-02-18 05:29:28 +01:00
AddOption( "--d",
dest="debugBuild",
2009-01-30 16:29:07 +01:00
type="string",
nargs=0,
action="store",
2009-02-18 05:29:28 +01:00
help="debug build no optimization, etc..." )
2009-01-30 16:29:07 +01:00
AddOption( "--dd",
dest="debugBuildAndLogging",
type="string",
nargs=0,
action="store",
help="debug build no optimization, additional debug logging, etc..." )
2009-02-04 21:08:55 +01:00
AddOption( "--recstore",
dest="recstore",
type="string",
nargs=0,
action="store",
help="use new recstore" )
2009-02-09 20:30:45 +01:00
AddOption( "--noshell",
dest="noshell",
type="string",
nargs=0,
action="store",
help="don't build shell" )
2009-02-04 21:08:55 +01:00
2009-06-30 22:08:42 +02:00
AddOption( "--extrapath",
dest="extrapath",
type="string",
nargs=1,
action="store",
2009-12-09 21:16:28 +01:00
help="comma seperated list of add'l paths (--extrapath /opt/foo/,/foo) static linking" )
AddOption( "--extrapathdyn",
dest="extrapathdyn",
type="string",
nargs=1,
action="store",
help="comma seperated list of add'l paths (--extrapath /opt/foo/,/foo) dynamic linking" )
2009-06-30 22:08:42 +02:00
2009-10-16 08:20:08 +02:00
AddOption( "--extralib",
dest="extralib",
type="string",
nargs=1,
action="store",
help="comma seperated list of libraries (--extralib js_static,readline" )
2009-08-28 17:14:26 +02:00
AddOption( "--cxx",
dest="cxx",
type="string",
nargs=1,
action="store",
help="compiler to use" )
AddOption( "--boost-compiler",
dest="boostCompiler",
type="string",
nargs=1,
action="store",
help="compiler used for boost (gcc41)" )
2009-08-31 20:56:49 +02:00
AddOption( "--boost-version",
dest="boostVersion",
type="string",
nargs=1,
action="store",
help="boost version for linking(1_38)" )
2009-12-08 23:00:17 +01:00
#
# to use CPUPROFILE=/tmp/profile
2009-12-21 20:45:18 +01:00
# to view pprof -gv mongod /tmp/profile
2009-12-08 23:00:17 +01:00
#
2009-07-29 20:19:55 +02:00
AddOption( "--pg",
dest="profile",
type="string",
nargs=0,
action="store" )
2009-01-14 16:58:32 +01:00
# --- environment setup ---
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
useJavaHome = False
linux = False
linux64 = False
darwin = False
windows = False
freebsd = False
2009-06-01 22:09:16 +02:00
solaris = False
2009-07-22 19:42:21 +02:00
force64 = not GetOption( "force64" ) is None
if not force64 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 force64:
msarch = "amd64"
force32 = not GetOption( "force32" ) is None
release = not GetOption( "release" ) is None
2009-07-07 17:12:39 +02:00
static = not GetOption( "static" ) is None
debugBuild = ( not GetOption( "debugBuild" ) is None ) or ( not GetOption( "debugBuildAndLogging" ) is None )
debugLogging = not GetOption( "debugBuildAndLogging" ) is None
noshell = not GetOption( "noshell" ) is None
nojni = not GetOption( "nojni" ) is None
2009-04-23 23:40:43 +02:00
usesm = not GetOption( "usesm" ) is None
2009-10-10 07:30:00 +02:00
usev8 = not GetOption( "usev8" ) is None
usejvm = not GetOption( "usejvm" ) is None
2009-12-14 18:38:53 +01:00
asio = not GetOption( "asio" ) is None
2009-09-09 15:46:12 +02:00
env = Environment( MSVS_ARCH=msarch , tools = ["default", "gch"], toolpath = '.' )
2009-08-28 17:14:26 +02:00
if GetOption( "cxx" ) is not None:
2009-08-28 17:58:38 +02:00
env["CC"] = GetOption( "cxx" )
2009-08-28 17:14:26 +02:00
env["CXX"] = GetOption( "cxx" )
2009-07-24 20:27:35 +02:00
env["LIBPATH"] = []
if GetOption( "recstore" ) != None:
env.Append( CPPDEFINES=[ "_RECSTORE" ] )
env.Append( CPPDEFINES=[ "_SCONS" ] )
env.Append( CPPPATH=[ "." ] )
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
if ( usesm and usejvm ):
print( "can't say usesm and usejvm at the same time" )
Exit(1)
2009-10-10 07:30:00 +02:00
if ( not ( usesm or usejvm or usev8 ) ):
usesm = True
2009-12-09 20:58:37 +01:00
extraLibPlaces = []
2009-12-09 21:16:28 +01:00
def addExtraLibs( s ):
2009-12-09 23:41:14 +01:00
for x in s.split(","):
2009-06-30 22:08:42 +02:00
env.Append( CPPPATH=[ x + "/include" ] )
env.Append( LIBPATH=[ x + "/lib" ] )
2010-01-14 22:45:03 +01:00
env.Append( LIBPATH=[ x + "/lib64" ] )
2009-12-09 23:34:18 +01:00
extraLibPlaces.append( x + "/lib" )
2009-12-09 21:16:28 +01:00
if GetOption( "extrapath" ) is not None:
addExtraLibs( GetOption( "extrapath" ) )
2009-06-30 22:08:42 +02:00
release = True
2009-07-22 19:42:21 +02:00
2009-12-09 21:16:28 +01:00
if GetOption( "extrapathdyn" ) is not None:
addExtraLibs( GetOption( "extrapathdyn" ) )
2009-10-16 08:20:08 +02:00
if GetOption( "extralib" ) is not None:
for x in GetOption( "extralib" ).split( "," ):
env.Append( LIBS=[ x ] )
# ------ SOURCE FILE SETUP -----------
2009-09-16 21:34:38 +02:00
commonFiles = Split( "stdafx.cpp buildinfo.cpp db/jsobj.cpp db/json.cpp db/commands.cpp db/lasterror.cpp db/nonce.cpp db/queryutil.cpp shell/mongo.cpp" )
2009-12-26 04:06:07 +01:00
commonFiles += [ "util/background.cpp" , "util/mmap.cpp" , "util/sock.cpp" , "util/util.cpp" , "util/top.cpp" , "util/message.cpp" ,
"util/assert_util.cpp" , "util/httpclient.cpp" , "util/md5main.cpp" , "util/base64.cpp", "util/debug_util.cpp",
"util/thread_pool.cpp" ]
2009-05-04 17:49:18 +02:00
commonFiles += Glob( "util/*.c" )
2010-01-19 23:36:01 +01:00
commonFiles += Split( "client/connpool.cpp client/dbclient.cpp client/model.cpp client/parallel.cpp client/syncclusterconnection.cpp" )
2010-01-28 18:21:56 +01:00
commonFiles += [ "scripting/engine.cpp" , "scripting/utils.cpp" ]
2009-01-06 00:19:56 +01:00
2009-01-30 04:21:33 +01:00
#mmap stuff
if GetOption( "mm" ) != None:
commonFiles += [ "util/mmap_mm.cpp" ]
elif os.sys.platform == "win32":
2009-01-30 04:21:33 +01:00
commonFiles += [ "util/mmap_win.cpp" ]
else:
commonFiles += [ "util/mmap_posix.cpp" ]
if os.path.exists( "util/processinfo_" + os.sys.platform + ".cpp" ):
commonFiles += [ "util/processinfo_" + os.sys.platform + ".cpp" ]
else:
commonFiles += [ "util/processinfo_none.cpp" ]
coreDbFiles = []
coreServerFiles = [ "util/message_server_port.cpp" , "util/message_server_asio.cpp" ]
2010-01-16 06:50:02 +01:00
serverOnlyFiles = Split( "db/query.cpp db/update.cpp db/introspect.cpp db/btree.cpp db/clientcursor.cpp db/tests.cpp db/repl.cpp db/btreecursor.cpp db/cloner.cpp db/namespace.cpp db/matcher.cpp db/dbeval.cpp db/dbwebserver.cpp db/dbhelpers.cpp db/instance.cpp db/dbstats.cpp db/database.cpp db/pdfile.cpp db/index.cpp db/cursor.cpp db/security_commands.cpp db/client.cpp db/security.cpp util/miniwebserver.cpp db/storage.cpp db/reccache.cpp db/queryoptimizer.cpp db/extsort.cpp db/mr.cpp s/d_util.cpp" )
2009-11-11 19:30:11 +01:00
serverOnlyFiles += Glob( "db/dbcommands*.cpp" )
2009-04-23 23:40:43 +02:00
if usesm:
commonFiles += [ "scripting/engine_spidermonkey.cpp" ]
2009-04-28 14:47:56 +02:00
nojni = True
2009-10-10 07:30:00 +02:00
elif usev8:
commonFiles += [ Glob( "scripting/*v8*.cpp" ) ]
nojni = True
2009-04-23 23:40:43 +02:00
elif not nojni:
commonFiles += [ "scripting/engine_java.cpp" ]
else:
commonFiles += [ "scripting/engine_none.cpp" ]
nojni = True
2009-03-11 22:28:49 +01:00
coreShardFiles = []
2009-12-04 02:49:49 +01:00
shardServerFiles = coreShardFiles + Glob( "s/strategy*.cpp" ) + [ "s/commands_admin.cpp" , "s/commands_public.cpp" , "s/request.cpp" , "s/cursors.cpp" , "s/server.cpp" , "s/chunk.cpp" , "s/shardkey.cpp" , "s/config.cpp" , "s/s_only.cpp" ]
2009-03-17 22:25:10 +01:00
serverOnlyFiles += coreShardFiles + [ "s/d_logic.cpp" ]
2009-03-11 22:28:49 +01:00
2009-11-18 18:53:56 +01:00
serverOnlyFiles += [ "db/module.cpp" ] + Glob( "db/modules/*.cpp" )
2009-11-19 18:40:23 +01:00
modules = []
2009-11-18 23:19:26 +01:00
for x in os.listdir( "db/modules/" ):
if x.find( "." ) >= 0:
continue
2009-11-19 18:40:23 +01:00
print( "adding module: " + x )
modRoot = "db/modules/" + x + "/"
serverOnlyFiles += Glob( modRoot + "src/*.cpp" )
modBuildFile = modRoot + "build.py"
if os.path.exists( modBuildFile ):
modules += [ imp.load_module( "module_" + x , open( modBuildFile , "r" ) , modBuildFile , ( ".py" , "r" , imp.PY_SOURCE ) ) ]
2009-11-18 18:53:56 +01:00
2009-11-03 18:17:51 +01:00
allClientFiles = commonFiles + coreDbFiles + [ "client/clientOnly.cpp" , "client/gridfs.cpp" , "s/d_util.cpp" ];
2009-01-06 00:19:56 +01:00
2009-09-09 15:46:12 +02:00
allCXXFiles = allClientFiles + coreShardFiles + shardServerFiles + serverOnlyFiles;
# ---- 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"
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
2009-01-19 20:25:50 +01:00
javaHome = GetOption( "javaHome" )
2009-02-01 15:06:49 +01:00
javaVersion = "i386";
2009-01-27 17:38:41 +01:00
javaLibs = []
2009-01-19 19:02:41 +01:00
2009-02-06 16:48:39 +01:00
distBuild = len( COMMAND_LINE_TARGETS ) == 1 and ( str( COMMAND_LINE_TARGETS[0] ) == "s3dist" or str( COMMAND_LINE_TARGETS[0] ) == "dist" )
if distBuild:
release = True
if GetOption( "prefix" ):
installDir = GetOption( "prefix" )
def findVersion( root , choices ):
for c in choices:
if ( os.path.exists( root + c ) ):
return root + c
raise "can't find a version of [" + root + "] choices: " + 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-11-04 04:47:14 +01:00
if usejvm:
env.Append( CPPPATH=[ "-I/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Headers/" ] )
2009-01-06 00:19:56 +01:00
2009-04-15 16:45:15 +02:00
if not nojni:
env.Append( FRAMEWORKS=["JavaVM"] )
2009-01-06 00:19:56 +01:00
2009-10-16 08:20:08 +02:00
if env["CXX"] is None:
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
2009-01-25 16:01:43 +01:00
if force64:
env.Append( CPPPATH=["/usr/64/include"] )
env.Append( LIBPATH=["/usr/64/lib"] )
2009-02-06 16:48:39 +01:00
if installDir == DEFAULT_INSTALl_DIR and not distBuild:
installDir = "/usr/64/"
2009-01-25 16:01:43 +01:00
else:
2010-01-28 22:36:47 +01:00
env.Append( CPPPATH=filterExists(["/sw/include" , "/opt/local/include"]) )
env.Append( LIBPATH=filterExists(["/sw/lib/", "/opt/local/lib"]) )
2009-01-25 16:01:43 +01:00
2009-01-06 00:53:46 +01:00
elif "linux2" == os.sys.platform:
2009-03-25 18:22:09 +01:00
linux = True
2009-02-01 15:06:49 +01:00
useJavaHome = True
javaOS = "linux"
2009-02-06 22:53:08 +01:00
platform = "linux"
2009-02-01 15:06:49 +01:00
2009-04-12 03:19:29 +02:00
javaHome = choosePathExist( [ javaHome , "/usr/lib/jvm/java/" , os.environ.get( "JAVA_HOME" ) ] , "/usr/lib/jvm/java/" )
2009-01-06 00:53:46 +01:00
2009-01-22 16:14:03 +01:00
if os.uname()[4] == "x86_64" and not force32:
linux64 = True
2009-01-06 00:53:46 +01:00
javaVersion = "amd64"
2009-01-22 15:12:58 +01:00
nixLibPrefix = "lib64"
2009-04-01 04:08:55 +02:00
env.Append( LIBPATH=["/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:
2009-01-27 14:57:15 +01:00
env.Append( LIBPATH=["/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
2009-02-01 15:06:49 +01:00
useJavaHome = True
javaHome = "/usr/lib/jvm/java-6-sun/"
javaOS = "solaris"
2009-03-26 19:55:00 +01:00
env.Append( CPPDEFINES=[ "__linux__" , "__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( CPPPATH=[ "/usr/local/include" ] )
env.Append( LIBPATH=[ "/usr/local/lib" ] )
env.Append( CPPDEFINES=[ "__freebsd__" ] )
2009-01-07 21:51:42 +01:00
elif "win32" == os.sys.platform:
windows = True
if force64:
release = True
for pathdir in env['ENV']['PATH'].split(os.pathsep):
if os.path.exists(os.path.join(pathdir, 'cl.exe')):
break
else:
#use current environment
env['ENV'] = dict(os.environ)
2009-12-29 18:12:47 +01:00
def find_boost():
for bv in reversed( range(33,50) ):
for extra in ('', '_0', '_1'):
boostDir = "C:/Program Files/Boost/boost_1_" + str(bv) + extra
if os.path.exists( boostDir ):
return boostDir
return None
boostDir = find_boost()
if boostDir is None:
print( "can't find boost" )
Exit(1)
2009-12-29 18:12:47 +01:00
serverOnlyFiles += [ "util/ntservice.cpp" ]
boostLibs = []
if usesm:
env.Append( CPPPATH=[ "js/src/" ] )
env.Append(CPPPATH=["../js/src/"])
env.Append(LIBPATH=["../js/src"])
env.Append( CPPDEFINES=[ "OLDJS" ] )
else:
javaHome = findVersion( "C:/Program Files/java/" ,
[ "jdk" , "jdk1.6.0_10" ] )
env.Append( CPPPATH=[ javaHome + "/include" , javaHome + "/include/win32" ] )
env.Append( LIBPATH=[ javaHome + "/Lib" ] )
javaLibs += [ "jvm" ];
winSDKHome = findVersion( "C:/Program Files/Microsoft SDKs/Windows/" ,
[ "v6.0" , "v6.0a" , "v6.1" ] )
2009-01-07 21:51:42 +01:00
env.Append( CPPPATH=[ boostDir , "pcre-7.4" , winSDKHome + "/Include" ] )
2009-01-07 21:51:42 +01:00
2009-02-10 21:12:15 +01:00
env.Append( CPPFLAGS=" /EHsc /W3 " )
2009-07-02 20:55:05 +02:00
env.Append( CPPFLAGS=" /wd4355 /wd4800 " ) #some warnings we don't like
env.Append( CPPDEFINES=["WIN32","_CONSOLE","_CRT_SECURE_NO_WARNINGS","HAVE_CONFIG_H","PCRE_STATIC","_UNICODE","UNICODE","SUPPORT_UCP","SUPPORT_UTF8,PSAPI_VERSION=1" ] )
2009-01-08 00:05:22 +01:00
#env.Append( CPPFLAGS=' /Yu"stdafx.h" ' ) # this would be for pre-compiled headers, could play with it later
2009-02-10 21:12:15 +01:00
if release:
env.Append( CPPDEFINES=[ "NDEBUG" ] )
2009-07-28 07:02:41 +02:00
env.Append( CPPFLAGS= " /O2 /Oi /FD /MT /Gy /nologo /Zi /TP /errorReport:prompt /Gm " )
#env.Append( CPPFLAGS= " /GL " ) # TODO: this has caused some linking problems
2009-02-10 21:12:15 +01:00
else:
env.Append( CPPDEFINES=[ "_DEBUG" ] )
env.Append( CPPFLAGS=" /Od /Gm /RTC1 /MDd /ZI " )
env.Append( CPPFLAGS=' /Fd"mongod.pdb" ' )
2009-01-07 21:51:42 +01:00
2009-07-24 20:27:35 +02:00
env.Append( LIBPATH=[ boostDir + "/Lib" ] )
if force64:
2009-07-24 20:27:35 +02:00
env.Append( LIBPATH=[ winSDKHome + "/Lib/x64" ] )
env.Append( LINKFLAGS=" /NODEFAULTLIB:MSVCPRT /NODEFAULTLIB:MSVCRT " )
2009-07-24 20:27:35 +02:00
else:
env.Append( LIBPATH=[ winSDKHome + "/Lib" ] )
2009-01-08 15:53:46 +01:00
def pcreFilter(x):
name = x.name
if x.name.endswith( "dftables.c" ):
return False
if x.name.endswith( "pcredemo.c" ):
return False
if x.name.endswith( "pcretest.c" ):
return False
if x.name.endswith( "unittest.cc" ):
return False
if x.name.endswith( "pcregrep.c" ):
return False
return True
pcreFiles = []
pcreFiles += filter( pcreFilter , Glob( "pcre-7.4/*.c" ) )
pcreFiles += filter( pcreFilter , Glob( "pcre-7.4/*.cc" ) )
commonFiles += pcreFiles
allClientFiles += pcreFiles
winLibString = "ws2_32.lib kernel32.lib advapi32.lib Psapi.lib"
if force64:
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 "
2009-07-24 20:27:35 +02:00
env.Append( LIBS=Split(winLibString) )
2009-07-24 20:27:35 +02:00
if force64:
env.Append( CPPDEFINES=["_AMD64_=1"] )
else:
env.Append( CPPDEFINES=["_X86_=1"] )
env.Append( CPPPATH=["../winpcap/Include"] )
env.Append( LIBPATH=["../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
if not nojni and useJavaHome:
2009-02-01 15:06:49 +01:00
env.Append( CPPPATH=[ javaHome + "include" , javaHome + "include/" + javaOS ] )
env.Append( LIBPATH=[ javaHome + "jre/lib/" + javaVersion + "/server" , javaHome + "jre/lib/" + javaVersion ] )
2009-04-15 16:45:15 +02:00
if not nojni:
javaLibs += [ "java" , "jvm" ]
2009-02-01 15:06:49 +01:00
env.Append( LINKFLAGS="-Xlinker -rpath -Xlinker " + javaHome + "jre/lib/" + javaVersion + "/server" )
env.Append( LINKFLAGS="-Xlinker -rpath -Xlinker " + javaHome + "jre/lib/" + javaVersion )
2009-01-07 19:27:01 +01:00
if nix:
2009-09-09 15:46:12 +02:00
env.Append( CPPFLAGS="-fPIC -fno-strict-aliasing -ggdb -pthread -Wall -Wsign-compare -Wno-unknown-pragmas -Winvalid-pch" )
2009-04-06 22:10:31 +02:00
env.Append( CXXFLAGS=" -Wnon-virtual-dtor " )
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
2009-02-18 05:29:28 +01:00
if debugBuild:
env.Append( CPPFLAGS=" -O0 -fstack-protector -fstack-check" );
2009-01-30 16:29:07 +01:00
else:
env.Append( CPPFLAGS=" -O3" )
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
2009-07-29 20:19:55 +02:00
if GetOption( "profile" ) is not None:
2009-11-24 19:08:36 +01:00
env.Append( LIBS=[ "profiler" ] )
2009-01-20 16:22:09 +01:00
2009-09-09 15:46:12 +02:00
# pre-compiled headers
2009-09-09 16:58:59 +02:00
if False and 'Gch' in dir( env ):
2009-09-09 15:46:12 +02:00
print( "using precompiled headers" )
env['Gch'] = env.Gch( [ "stdafx.h" ] )[0]
#Depends( "stdafx.o" , "stdafx.h.gch" )
#SideEffect( "dummyGCHSideEffect" , "stdafx.h.gch" )
2009-10-10 07:30:00 +02:00
if usev8:
env.Append( CPPPATH=["../v8/include/"] )
env.Append( LIBPATH=["../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 } )
2009-08-05 21:38:58 +02:00
try:
umask = os.umask(022)
except OSError:
pass
# --- check system ---
2009-12-05 17:54:36 +01:00
def getGitBranch():
if not os.path.exists( ".git" ):
return None
version = open( ".git/HEAD" ,'r' ).read().strip()
if not version.startswith( "ref: " ):
return version
version = version.split( "/" )
version = version[len(version)-1]
return version
def getGitBranchString( prefix="" , postfix="" ):
2009-12-07 01:18:30 +01:00
t = re.compile( '[/\\\]' ).split( os.getcwd() )
if len(t) > 2 and t[len(t)-1] == "mongo":
t = re.compile( ".*_([vV]\d+\.\d+)$" ).match( t[len(t)-2] )
if t is not None:
2009-12-07 01:49:54 +01:00
return prefix + t.group(1).lower() + postfix
2009-12-07 01:18:30 +01:00
2009-12-05 17:54:36 +01:00
b = getGitBranch()
if b == None or b == "master":
return ""
return prefix + b + postfix
2009-03-17 15:22:26 +01:00
def getGitVersion():
if not os.path.exists( ".git" ):
return "nogitversion"
version = open( ".git/HEAD" ,'r' ).read().strip()
if not version.startswith( "ref: " ):
return version
version = version[5:]
f = ".git/" + version
if not os.path.exists( f ):
return version
return open( f , 'r' ).read().strip()
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() )
2009-10-01 18:06:04 +02:00
def add_exe(target):
if windows:
return target + ".exe"
return target
2009-03-18 19:29:14 +01:00
def setupBuildInfoFile( outFile ):
2009-03-17 15:22:26 +01:00
version = getGitVersion()
2009-03-18 19:15:52 +01:00
sysInfo = getSysInfo()
2009-11-24 17:13:13 +01:00
contents = '\n'.join([
'#include "stdafx.h"',
'#include <iostream>',
'#include <boost/version.hpp>',
'namespace mongo { const char * gitVersion(){ return "' + version + '"; } }',
'namespace mongo { const char * sysInfo(){ return "' + sysInfo + ' BOOST_LIB_VERSION=" BOOST_LIB_VERSION ; } }',
])
2009-11-30 16:42:50 +01:00
contents += '\n';
2009-03-17 15:22:26 +01:00
if os.path.exists( outFile ) and open( outFile ).read().strip() == contents.strip():
return
2009-11-30 16:42:50 +01:00
contents += '\n';
2009-03-17 15:22:26 +01:00
out = open( outFile , 'w' )
out.write( contents )
2009-03-18 19:15:52 +01:00
out.close()
2009-03-17 15:22:26 +01:00
2009-03-18 19:29:14 +01:00
setupBuildInfoFile( "buildinfo.cpp" )
2009-03-17 15:22:26 +01:00
2009-04-28 14:47:56 +02:00
def bigLibString( myenv ):
s = str( myenv["LIBS"] )
if 'SLIBS' in myenv._dict:
s += str( myenv["SLIBS"] )
return s
2009-04-28 14:47:56 +02:00
def doConfigure( myenv , needJava=True , needPcre=True , 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)
def myCheckLib( poss , failIfNotFound=False , java=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:
2009-02-01 23:39:07 +01:00
allPlaces += myenv["LIBPATH"]
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['_LIBFLAGS']='${_stripixes(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, LIBPREFIXES, LIBSUFFIXES, __env__)} $SLIBS'
myenv.Append( SLIBS=" " + fullPath + " " )
2009-02-01 23:39:07 +01:00
return True
2009-02-04 15:21:39 +01:00
if release and not java 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:
2009-11-20 17:44:10 +01:00
print( "can't find library " + str( poss ) + " in " + str( myenv["LIBPATH"] ) )
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 needPcre and not conf.CheckCXXHeader( 'pcrecpp.h' ):
2009-02-01 23:39:07 +01:00
print( "can't find pcre" )
Exit(1)
2009-01-25 16:01:43 +01:00
2009-02-01 23:39:07 +01:00
if not conf.CheckCXXHeader( "boost/filesystem/operations.hpp" ):
print( "can't find boost headers" )
2009-02-03 23:19:00 +01:00
if shell:
print( "\tshell might not compile" )
else:
Exit(1)
2009-01-27 17:38:41 +01:00
2009-12-30 20:58:42 +01:00
if asio:
if conf.CheckCXXHeader( "boost/asio.hpp" ):
myenv.Append( CPPDEFINES=[ "USE_ASIO" ] )
else:
print( "WARNING: old version of boost - you should consider upgrading" )
2009-12-17 16:23:23 +01:00
# this will add it iff it exists and works
myCheckLib( [ "boost_system" + boostCompiler + "-mt" + boostVersion ,
"boost_system" + boostCompiler + boostVersion ] )
2009-02-01 23:39:07 +01:00
for b in boostLibs:
l = "boost_" + b
myCheckLib( [ l + boostCompiler + "-mt" + boostVersion ,
l + boostCompiler + boostVersion ] ,
2009-08-31 20:56:49 +02:00
release or not shell)
2009-08-12 20:54:53 +02:00
if not conf.CheckCXXHeader( "execinfo.h" ):
myenv.Append( CPPDEFINES=[ "NOEXECINFO" ] )
if needJava:
2009-02-02 00:41:25 +01:00
for j in javaLibs:
myCheckLib( j , True , True )
2009-01-28 23:27:12 +01:00
if nix and needPcre:
2009-02-01 23:39:07 +01:00
myCheckLib( "pcrecpp" , True )
myCheckLib( "pcre" , True )
myenv["_HAVEPCAP"] = myCheckLib( ["pcap", "wpcap"] )
removeIfInList( myenv["LIBS"] , "pcap" )
removeIfInList( myenv["LIBS"] , "wpcap" )
2009-11-19 18:40:23 +01:00
for m in modules:
m.configure( conf , myenv )
2009-11-03 23:15:14 +01:00
# this is outside of usesm block so don't have to rebuild for java
if windows:
myenv.Append( CPPDEFINES=[ "XP_WIN" ] )
else:
myenv.Append( CPPDEFINES=[ "XP_UNIX" ] )
2009-08-28 17:50:20 +02:00
if solaris:
conf.CheckLib( "nsl" )
2009-04-23 23:40:43 +02:00
if usesm:
2009-10-16 08:20:08 +02:00
myCheckLib( [ "mozjs" , "js", "js_static" ] , True )
mozHeader = "js"
2009-04-28 14:47:56 +02:00
if bigLibString(myenv).find( "mozjs" ) >= 0:
mozHeader = "mozjs"
if not conf.CheckHeader( mozHeader + "/jsapi.h" ):
if conf.CheckHeader( "jsapi.h" ):
myenv.Append( CPPDEFINES=[ "OLDJS" ] )
else:
print( "no spider monkey headers!" )
Exit(1)
2009-04-23 23:40:43 +02:00
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
2009-02-12 03:05:28 +01:00
if shell:
2009-02-12 05:16:29 +01:00
haveReadLine = False
if darwin:
myenv.Append( CPPDEFINES=[ "USE_READLINE" ] )
2009-03-04 14:18:50 +01:00
if force64:
myCheckLib( "readline" , True )
myCheckLib( "ncurses" , True )
else:
myenv.Append( LINKFLAGS=" /usr/lib/libreadline.dylib " )
2009-05-29 18:08:51 +02:00
elif myCheckLib( "readline" , release and nix , staticOnly=release ):
2009-02-12 03:05:28 +01:00
myenv.Append( CPPDEFINES=[ "USE_READLINE" ] )
2009-06-29 19:09:30 +02:00
myCheckLib( "ncurses" , staticOnly=release )
2009-04-17 22:23:01 +02:00
myCheckLib( "tinfo" , staticOnly=release )
2009-02-12 03:16:08 +01:00
else:
print( "warning: no readline, shell will be a bit ugly" )
2009-03-25 18:22:09 +01:00
if linux:
myCheckLib( "rt" , True )
# requires ports devel/libexecinfo to be installed
if freebsd:
myCheckLib( "execinfo", True )
env.Append( LIBS=[ "execinfo" ] )
2009-02-01 23:39:07 +01:00
return conf.Finish()
env = doConfigure( env )
2009-01-27 04:19:15 +01:00
# --- js concat ---
def concatjs(target, source, env):
2009-01-27 04:19:15 +01:00
outFile = str( target[0] )
2009-01-27 04:19:15 +01:00
fullSource = ""
2009-12-10 03:30:09 +01:00
first = True
2009-01-27 04:19:15 +01:00
for s in source:
f = open( str(s) , 'r' )
for l in f:
l = l.split("//")[0].strip()
if len ( l ) == 0:
continue
2009-12-10 03:30:09 +01:00
if l == "}":
fullSource += "}"
continue
if first:
first = False
else:
fullSource += "\n"
fullSource += l
fullSource += "\n"
2009-12-10 03:30:09 +01:00
fullSource = re.compile( r'/\*\*.*?\*/' , re.M | re.S ).sub( "" , fullSource )
2009-01-27 04:19:15 +01:00
out = open( outFile , 'w' )
out.write( fullSource )
return None
jsBuilder = Builder(action = concatjs,
suffix = '.jsall',
src_suffix = '.js')
env.Append( BUILDERS={'JSConcat' : jsBuilder})
# --- jsh ---
def jsToH(target, source, env):
2009-01-27 04:19:15 +01:00
outFile = str( target[0] )
if len( source ) != 1:
raise Exception( "wrong" )
h = "const char * jsconcatcode" + outFile.split( "mongo" )[-1].replace( "-" , "_").split( ".cpp")[0] + " = \n"
2009-01-27 04:19:15 +01:00
for l in open( str(source[0]) , 'r' ):
l = l.strip()
2009-11-20 19:24:26 +01:00
l = l.split( "//" )[0]
2009-01-27 04:19:15 +01:00
l = l.replace( '\\' , "\\\\" )
l = l.replace( '"' , "\\\"" )
2009-01-27 04:19:15 +01:00
h += '"' + l + "\\n\"\n "
2009-01-27 04:19:15 +01:00
h += ";\n\n"
out = open( outFile , 'w' )
out.write( h )
return None
jshBuilder = Builder(action = jsToH,
suffix = '.cpp',
2009-01-27 04:19:15 +01:00
src_suffix = '.jsall')
env.Append( BUILDERS={'JSHeader' : jshBuilder})
# --- targets ----
2009-01-08 00:05:22 +01:00
2009-01-13 15:56:18 +01:00
clientEnv = env.Clone();
clientEnv.Append( CPPPATH=["../"] )
2009-05-28 17:16:19 +02:00
clientEnv.Prepend( LIBS=[ "mongoclient"] )
2009-07-13 19:44:11 +02:00
clientEnv.Prepend( LIBPATH=["."] )
2009-05-11 20:57:26 +02:00
l = clientEnv[ "LIBS" ]
removeIfInList( l , "pcre" )
removeIfInList( l , "pcrecpp" )
2009-01-13 15:56:18 +01:00
testEnv = env.Clone()
testEnv.Append( CPPPATH=["../"] )
2009-09-18 20:33:21 +02:00
testEnv.Prepend( LIBS=[ "mongotestfiles" ] )
2009-07-13 19:44:11 +02:00
testEnv.Prepend( LIBPATH=["."] )
2009-01-12 21:27:55 +01:00
# ----- TARGETS ------
def checkErrorCodes():
import buildscripts.errorcodes as x
if x.checkErrorCodes() == False:
print( "next id to use:" + str( x.getNextCode() ) )
Exit(-1)
checkErrorCodes()
2009-01-06 00:19:56 +01:00
2009-01-12 16:34:12 +01:00
# main db target
2009-11-18 18:53:56 +01:00
mongod = env.Program( "mongod" , commonFiles + coreDbFiles + serverOnlyFiles + [ "db/db.cpp" ] )
Default( mongod )
2009-01-12 16:34:12 +01:00
# tools
2009-09-24 17:02:00 +02:00
allToolFiles = commonFiles + coreDbFiles + serverOnlyFiles + [ "client/gridfs.cpp", "tools/tool.cpp" ]
2009-01-27 21:16:09 +01:00
env.Program( "mongodump" , allToolFiles + [ "tools/dump.cpp" ] )
2009-02-09 17:24:21 +01:00
env.Program( "mongorestore" , allToolFiles + [ "tools/restore.cpp" ] )
2009-02-08 16:37:39 +01:00
2009-02-02 18:17:20 +01:00
env.Program( "mongoexport" , allToolFiles + [ "tools/export.cpp" ] )
env.Program( "mongoimport" , allToolFiles + [ "tools/import.cpp" ] )
2009-01-06 00:19:56 +01:00
2009-02-08 16:37:39 +01:00
env.Program( "mongofiles" , allToolFiles + [ "tools/files.cpp" ] )
2009-04-02 21:10:52 +02:00
env.Program( "mongobridge" , allToolFiles + [ "tools/bridge.cpp" ] )
2009-02-13 15:22:04 +01:00
# mongos
2009-03-11 22:28:49 +01:00
mongos = env.Program( "mongos" , commonFiles + coreDbFiles + coreServerFiles + shardServerFiles )
2009-03-02 15:13:20 +01:00
2009-01-12 16:34:12 +01:00
# c++ library
clientLibName = str( env.Library( "mongoclient" , allClientFiles )[0] )
2009-10-16 19:50:27 +02:00
env.Library( "mongotestfiles" , commonFiles + coreDbFiles + serverOnlyFiles + ["client/gridfs.cpp"])
2009-01-12 21:27:55 +01:00
2009-01-29 15:19:51 +01:00
clientTests = []
2009-01-13 15:15:47 +01:00
# examples
2009-01-29 15:19:51 +01:00
clientTests += [ clientEnv.Program( "firstExample" , [ "client/examples/first.cpp" ] ) ]
clientTests += [ clientEnv.Program( "secondExample" , [ "client/examples/second.cpp" ] ) ]
2009-01-29 16:30:25 +01:00
clientTests += [ clientEnv.Program( "whereExample" , [ "client/examples/whereExample.cpp" ] ) ]
2009-01-29 15:19:51 +01:00
clientTests += [ clientEnv.Program( "authTest" , [ "client/examples/authTest.cpp" ] ) ]
2009-01-12 21:27:55 +01:00
2009-01-13 15:15:47 +01:00
# testing
test = testEnv.Program( "test" , Glob( "dbtests/*.cpp" ) )
2009-09-18 20:33:21 +02:00
perftest = testEnv.Program( "perftest", [ "dbtests/framework.cpp" , "dbtests/perf/perftest.cpp" ] )
2009-01-29 15:19:51 +01:00
clientTests += [ clientEnv.Program( "clientTest" , [ "client/examples/clientTest.cpp" ] ) ]
2009-01-12 21:27:55 +01:00
2009-02-13 22:18:57 +01:00
# --- sniffer ---
mongosniff_built = False
if darwin or clientEnv["_HAVEPCAP"]:
mongosniff_built = True
2009-02-13 22:18:57 +01:00
sniffEnv = clientEnv.Clone()
if not windows:
sniffEnv.Append( LIBS=[ "pcap" ] )
else:
sniffEnv.Append( LIBS=[ "wpcap" ] )
2009-02-13 22:18:57 +01:00
sniffEnv.Program( "mongosniff" , "tools/sniffer.cpp" )
# --- shell ---
env.JSConcat( "shell/mongo.jsall" , ["shell/utils.js","shell/db.js","shell/mongo.js","shell/mr.js","shell/query.js","shell/collection.js"] )
2009-05-02 03:25:26 +02:00
env.JSHeader( "shell/mongo.jsall" )
env.JSConcat( "shell/mongo-server.jsall" , [ "shell/servers.js"] )
env.JSHeader( "shell/mongo-server.jsall" )
shellEnv = env.Clone();
2009-02-01 23:39:07 +01:00
2009-02-05 18:42:35 +01:00
if release and ( ( darwin and force64 ) or linux64 ):
2009-02-01 23:39:07 +01:00
shellEnv["LINKFLAGS"] = env["LINKFLAGS_CLEAN"]
shellEnv["LIBS"] = env["LIBS_CLEAN"]
2009-02-05 18:42:35 +01:00
shellEnv["SLIBS"] = ""
2009-02-01 23:39:07 +01:00
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:
2009-08-28 17:50:20 +02:00
weird = force64 and not windows and not solaris
2009-02-12 03:05:28 +01:00
if weird:
shellEnv["CFLAGS"].remove("-m64")
shellEnv["CXXFLAGS"].remove("-m64")
shellEnv["LINKFLAGS"].remove("-m64")
shellEnv["CPPPATH"].remove( "/usr/64/include" )
shellEnv["LIBPATH"].remove( "/usr/64/lib" )
2010-01-28 22:36:47 +01:00
shellEnv.Append( CPPPATH=filterExists(["/sw/include" , "/opt/local/include"]) )
shellEnv.Append( LIBPATH=filterExists(["/sw/lib/", "/opt/local/lib" , "/usr/lib"]) )
l = shellEnv["LIBS"]
if linux64:
2009-02-05 18:42:35 +01:00
removeIfInList( l , "java" )
removeIfInList( l , "jvm" )
2009-02-02 00:41:25 +01:00
2009-02-01 23:39:07 +01:00
removeIfInList( l , "pcre" )
removeIfInList( l , "pcrecpp" )
2009-02-12 03:05:28 +01:00
if windows:
shellEnv.Append( LIBS=["winmm.lib"] )
coreShellFiles = [ "shell/dbshell.cpp" , "shell/utils.cpp" , "shell/mongo-server.cpp" ]
2009-05-08 15:15:56 +02:00
2009-02-12 03:05:28 +01:00
if weird:
2009-05-08 15:15:56 +02:00
shell32BitFiles = coreShellFiles
2009-02-12 03:05:28 +01:00
for f in allClientFiles:
shell32BitFiles.append( "32bit/" + str( f ) )
shellEnv.VariantDir( "32bit" , "." )
else:
shellEnv.Prepend( LIBPATH=[ "." ] )
2009-02-02 00:26:18 +01:00
2009-02-04 15:21:39 +01:00
shellEnv = doConfigure( shellEnv , needPcre=False , needJava=False , shell=True )
2009-02-02 00:26:18 +01:00
2009-02-12 03:05:28 +01:00
if weird:
mongo = shellEnv.Program( "mongo" , shell32BitFiles )
2009-02-12 03:05:28 +01:00
else:
shellEnv.Prepend( LIBS=[ "mongoclient"] )
2009-05-08 15:15:56 +02:00
mongo = shellEnv.Program( "mongo" , coreShellFiles )
2009-02-12 03:05:28 +01:00
2009-08-14 04:44:55 +02:00
if weird:
Depends( "32bit/shell/mongo.cpp" , "shell/mongo.cpp" )
Depends( "32bit/shell/mongo-server.cpp" , "shell/mongo-server.cpp" )
2009-08-14 04:44:55 +02:00
# ---- RUNNING TESTS ----
testEnv.Alias( "dummySmokeSideEffect", [], [] )
def addSmoketest( name, deps, actions ):
if type( actions ) == type( list() ):
actions = [ testSetup ] + actions
else:
actions = [ testSetup, actions ]
testEnv.Alias( name, deps, actions )
testEnv.AlwaysBuild( name )
# Prevent smoke tests from running in parallel
testEnv.SideEffect( "dummySmokeSideEffect", name )
def ensureDir( name ):
d = os.path.dirname( name )
if not os.path.exists( d ):
print( "Creating dir: " + name );
os.makedirs( d )
if not os.path.exists( d ):
print( "Failed to create dir: " + name );
Exit( 1 )
def ensureTestDirs():
ensureDir( "/tmp/unittest/" )
ensureDir( "/data/" )
ensureDir( "/data/db/" )
def testSetup( env , target , source ):
ensureTestDirs()
2009-01-29 15:19:51 +01:00
if len( COMMAND_LINE_TARGETS ) == 1 and str( COMMAND_LINE_TARGETS[0] ) == "test":
ensureDir( "/tmp/unittest/" );
2009-10-01 18:06:04 +02:00
addSmoketest( "smoke", [ add_exe( "test" ) ] , [ test[ 0 ].abspath ] )
addSmoketest( "smokePerf", [ "perftest" ] , [ perftest[ 0 ].abspath ] )
2009-02-11 19:17:52 +01:00
clientExec = [ x[0].abspath for x in clientTests ]
def runClientTests( env, target, source ):
global clientExec
global mongodForTestsPort
import subprocess
for i in clientExec:
if subprocess.call( [ i, "--port", mongodForTestsPort ] ) != 0:
return True
if subprocess.Popen( [ mongod[0].abspath, "msg", "ping", mongodForTestsPort ], stdout=subprocess.PIPE ).communicate()[ 0 ].count( "****ok" ) == 0:
return True
if subprocess.call( [ mongod[0].abspath, "msg", "ping", mongodForTestsPort ] ) != 0:
return True
return False
addSmoketest( "smokeClient" , clientExec, runClientTests )
addSmoketest( "mongosTest" , [ mongos[0].abspath ] , [ mongos[0].abspath + " --test" ] )
def jsSpec( suffix ):
import os.path
args = [ os.path.dirname( mongo[0].abspath ), "jstests" ] + suffix
return apply( os.path.join, args )
def jsDirTestSpec( dir ):
return mongo[0].abspath + " --nodb " + jsSpec( [ dir ] )
def runShellTest( env, target, source ):
global mongodForTestsPort
import subprocess
target = str( target[0] )
if target == "smokeJs":
spec = [ jsSpec( [ "_runner.js" ] ) ]
elif target == "smokeQuota":
g = Glob( jsSpec( [ "quota" ] ) )
spec = [ x.abspath for x in g ]
elif target == "smokeJsPerf":
g = Glob( jsSpec( [ "perf" ] ) )
spec = [ x.abspath for x in g ]
2010-01-19 21:28:55 +01:00
elif target == "smokeJsSlow":
spec = [x.abspath for x in Glob(jsSpec(["slow/*"]))]
else:
print( "invalid target for runShellTest()" )
Exit( 1 )
return subprocess.call( [ mongo[0].abspath, "--port", mongodForTestsPort ] + spec )
# These tests require the mongo shell
2009-03-26 19:55:00 +01:00
if not onlyServer and not noshell:
addSmoketest( "smokeJs", [add_exe("mongo")], runShellTest )
addSmoketest( "smokeClone", [ "mongo", "mongod" ], [ jsDirTestSpec( "clone" ) ] )
2009-05-29 21:32:24 +02:00
addSmoketest( "smokeRepl", [ "mongo", "mongod", "mongobridge" ], [ jsDirTestSpec( "repl" ) ] )
2009-10-01 18:06:04 +02:00
addSmoketest( "smokeDisk", [ add_exe( "mongo" ), add_exe( "mongod" ) ], [ jsDirTestSpec( "disk" ) ] )
2010-01-27 02:05:28 +01:00
addSmoketest( "smokeAuth", [ add_exe( "mongo" ), add_exe( "mongod" ) ], [ jsDirTestSpec( "auth" ) ] )
addSmoketest( "smokeSharding", [ "mongo", "mongod", "mongos" ], [ jsDirTestSpec( "sharding" ) ] )
addSmoketest( "smokeJsPerf", [ "mongo" ], runShellTest )
2010-01-19 21:28:55 +01:00
addSmoketest("smokeJsSlow", [add_exe("mongo")], runShellTest)
2009-05-11 20:05:56 +02:00
addSmoketest( "smokeQuota", [ "mongo" ], runShellTest )
2009-10-01 18:06:04 +02:00
addSmoketest( "smokeTool", [ add_exe( "mongo" ) ], [ jsDirTestSpec( "tool" ) ] )
mongodForTests = None
mongodForTestsPort = "27017"
def startMongodForTests( env, target, source ):
global mongodForTests
global mongodForTestsPort
global mongod
if mongodForTests:
return
mongodForTestsPort = "40000"
import os
ensureTestDirs()
dirName = "/data/db/sconsTests/"
ensureDir( dirName )
from subprocess import Popen
mongodForTests = Popen( [ mongod[0].abspath, "--port", mongodForTestsPort, "--dbpath", dirName, "--nohttpinterface" ] )
# Wait for mongod to start
import time
2009-08-24 23:13:21 +02:00
time.sleep( 5 )
if mongodForTests.poll() is not None:
print( "Failed to start mongod" )
mongodForTests = None
Exit( 1 )
def stopMongodForTests():
global mongodForTests
if not mongodForTests:
return
if mongodForTests.poll() is not None:
print( "Failed to start mongod" )
mongodForTests = None
Exit( 1 )
try:
# This function not available in Python 2.5
mongodForTests.terminate()
except AttributeError:
if windows:
import win32process
win32process.TerminateProcess(mongodForTests._handle, -1)
else:
from os import kill
kill( mongodForTests.pid, 15 )
mongodForTests.wait()
testEnv.Alias( "startMongod", [add_exe("mongod")], [startMongodForTests] );
testEnv.AlwaysBuild( "startMongod" );
testEnv.SideEffect( "dummySmokeSideEffect", "startMongod" )
def addMongodReqTargets( env, target, source ):
2009-04-15 23:53:01 +02:00
mongodReqTargets = [ "smokeClient", "smokeJs", "smokeQuota" ]
for target in mongodReqTargets:
testEnv.Depends( target, "startMongod" )
testEnv.Depends( "smokeAll", target )
testEnv.Alias( "addMongodReqTargets", [], [addMongodReqTargets] )
testEnv.AlwaysBuild( "addMongodReqTargets" )
2010-01-27 02:05:28 +01:00
testEnv.Alias( "smokeAll", [ "smoke", "mongosTest", "smokeClone", "smokeRepl", "addMongodReqTargets", "smokeDisk", "smokeAuth", "smokeSharding", "smokeTool" ] )
testEnv.AlwaysBuild( "smokeAll" )
2009-04-02 22:56:39 +02:00
def addMongodReqNoJsTargets( env, target, source ):
mongodReqTargets = [ "smokeClient" ]
for target in mongodReqTargets:
testEnv.Depends( target, "startMongod" )
testEnv.Depends( "smokeAllNoJs", target )
testEnv.Alias( "addMongodReqNoJsTargets", [], [addMongodReqNoJsTargets] )
testEnv.AlwaysBuild( "addMongodReqNoJsTargets" )
testEnv.Alias( "smokeAllNoJs", [ "smoke", "mongosTest", "addMongodReqNoJsTargets" ] )
testEnv.AlwaysBuild( "smokeAllNoJs" )
import atexit
atexit.register( stopMongodForTests )
2009-02-18 16:10:39 +01:00
def recordPerformance( env, target, source ):
from buildscripts import benchmark_tools
global perftest
import subprocess, re
p = subprocess.Popen( [ perftest[0].abspath ], stdout=subprocess.PIPE )
b = p.communicate()[ 0 ]
print( "perftest results:" );
print( b );
if p.returncode != 0:
return True
entries = re.findall( "{.*?}", b )
import sys
for e in entries:
matches = re.match( "{'(.*?)': (.*?)}", e )
name = matches.group( 1 )
val = float( matches.group( 2 ) )
sub = { "benchmark": { "project": "http://github.com/mongodb/mongo", "description": "" }, "trial": {} }
sub[ "benchmark" ][ "name" ] = name
sub[ "benchmark" ][ "tags" ] = [ "c++", re.match( "(.*)__", name ).group( 1 ) ]
sub[ "trial" ][ "server_hash" ] = getGitVersion()
sub[ "trial" ][ "client_hash" ] = ""
sub[ "trial" ][ "result" ] = val
try:
print(benchmark_tools.post_data(sub))
except:
print( "exception posting perf results" )
print( sys.exc_info() )
return False
addSmoketest( "recordPerf", [ "perftest" ] , [ recordPerformance ] )
def run_shell_tests(env, target, source):
from buildscripts import test_shell
test_shell.mongo_path = windows and "mongo.exe" or "mongo"
test_shell.run_tests()
env.Alias("test_shell", [], [run_shell_tests])
env.AlwaysBuild("test_shell")
2009-01-12 21:27:55 +01:00
# ---- INSTALL -------
def getSystemInstallName():
n = platform + "-" + processor
if static:
n += "-static"
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:
import settings
if "distmod" in dir( settings ):
n = n + "-" + str( settings.distmod )
except:
pass
return n
def getCodeVersion():
fullSource = open( "stdafx.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]
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
return getGitBranchString( "" , "-" ) + today.strftime( "%Y-%m-%d" )
2009-02-06 16:48:39 +01:00
if distBuild:
2009-02-08 20:58:52 +01:00
from datetime import date
today = date.today()
installDir = "mongodb-" + getSystemInstallName() + "-"
installDir += getDistName( installDir )
2009-02-08 20:58:52 +01:00
print "going to make dist: " + installDir
2009-01-12 21:27:55 +01:00
2009-02-08 16:37:39 +01:00
# binaries
def checkGlibc(target,source,env):
import subprocess
stringProcess = subprocess.Popen( [ "strings" , str( target[0] ) ] , stdout=subprocess.PIPE )
stringResult = stringProcess.communicate()[0]
if stringResult.count( "GLIBC_2.4" ) > 0:
2009-12-30 21:22:13 +01:00
print( "************* " + str( target[0] ) + " has GLIBC_2.4 dependencies!" )
Exit(-3)
2009-05-16 13:17:12 +02:00
allBinaries = []
def installBinary( e , name ):
2009-05-16 13:17:12 +02:00
global allBinaries
2009-05-29 19:23:25 +02:00
if windows:
e.Alias( name , name + ".exe" )
name += ".exe"
2009-05-29 19:23:25 +02:00
inst = e.Install( installDir + "/bin" , name )
2009-07-22 19:42:21 +02:00
fullInstallName = installDir + "/bin/" + name
2009-05-29 19:23:25 +02:00
2009-05-16 13:17:12 +02:00
allBinaries += [ name ]
if solaris or linux:
e.AddPostAction( inst, e.Action( 'strip ' + fullInstallName ) )
2009-07-22 19:42:21 +02:00
2009-07-10 05:18:55 +02:00
if linux and len( COMMAND_LINE_TARGETS ) == 1 and str( COMMAND_LINE_TARGETS[0] ) == "s3dist":
e.AddPostAction( inst , checkGlibc )
2009-02-08 16:37:39 +01:00
2009-08-05 21:38:58 +02:00
if nix:
e.AddPostAction( inst , e.Action( 'chmod 755 ' + fullInstallName ) )
installBinary( env , "mongodump" )
installBinary( env , "mongorestore" )
2009-02-08 16:37:39 +01:00
installBinary( env , "mongoexport" )
2009-10-10 20:29:22 +02:00
installBinary( env , "mongoimport" )
installBinary( env , "mongofiles" )
if mongosniff_built:
installBinary(env, "mongosniff")
2009-07-22 19:42:57 +02:00
installBinary( env , "mongod" )
2009-04-22 18:58:39 +02:00
installBinary( env , "mongos" )
2009-02-08 16:37:39 +01:00
2009-02-09 20:30:45 +01:00
if not noshell:
installBinary( env , "mongo" )
2009-01-12 21:27:55 +01:00
2009-05-16 13:17:12 +02:00
env.Alias( "all" , allBinaries )
# NOTE: In some cases scons gets confused between installation targets and build
# dependencies. Here, we use InstallAs instead of Install to prevent such confusion
# on a case-by-case basis.
2009-01-12 21:27:55 +01:00
#headers
2009-02-08 01:20:15 +01:00
for id in [ "", "util/", "db/" , "client/" ]:
2009-01-12 21:27:55 +01:00
env.Install( installDir + "/include/mongo/" + id , Glob( id + "*.h" ) )
#lib
env.Install( installDir + "/" + nixLibPrefix, clientLibName )
2009-05-16 00:39:53 +02:00
if usejvm:
env.Install( installDir + "/" + nixLibPrefix + "/mongo/jars" , Glob( "jars/*" ) )
2009-01-12 21:27:55 +01:00
2009-02-11 12:39:00 +01:00
#textfiles
2009-02-11 17:26:28 +01:00
if distBuild or release:
2009-02-11 12:39:00 +01:00
#don't want to install these /usr/local/ for example
env.Install( installDir , "distsrc/README" )
env.Install( installDir , "distsrc/THIRD-PARTY-NOTICES" )
env.Install( installDir , "distsrc/GNU-AGPL-3.0" )
2009-01-12 21:27:55 +01:00
#final alias
env.Alias( "install" , installDir )
# aliases
if windows:
env.Alias( "mongoclient" , "mongoclient.lib" )
else:
env.Alias( "mongoclient" , "libmongoclient.a" )
# ---- 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 ):
if remotePrefix is None:
if distName is None:
2009-12-05 17:54:36 +01:00
remotePrefix = getGitBranchString( "-" ) + "-latest"
2009-02-11 03:37:18 +01:00
else:
remotePrefix = "-" + distName
2009-01-27 19:08:44 +01:00
sys.path.append( "." )
2009-08-27 17:52:22 +02:00
sys.path.append( ".." )
sys.path.append( "../../" )
2009-01-27 19:08:44 +01:00
import simples3
import settings
2009-02-02 15:54:11 +01:00
s = simples3.S3Bucket( settings.bucket , settings.id , settings.key )
2009-01-27 19:08:44 +01:00
if remoteName is None:
remoteName = localName
2009-02-02 04:11:26 +01:00
if fixName:
2009-02-06 16:48:39 +01:00
(root,dot,suffix) = localName.rpartition( "." )
name = remoteName + "-" + getSystemInstallName()
2009-07-07 17:12:39 +02:00
name += remotePrefix
2009-02-06 16:48:39 +01:00
if dot == "." :
name += "." + suffix
2009-02-02 04:11:26 +01:00
name = name.lower()
else:
name = remoteName
2009-01-27 19:08:44 +01:00
2009-02-06 16:48:39 +01:00
if platformDir:
name = platform + "/" + name
2009-02-11 03:37:18 +01:00
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)
2009-02-10 16:54:43 +01:00
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 " )
if windows:
distFile = installDir + ".zip"
env.Zip( distFile , installDir )
else:
distFile = installDir + ".tgz"
env.Tar( distFile , installDir )
2009-02-02 00:27:04 +01:00
2009-02-06 22:51:14 +01:00
env.Alias( "dist" , distFile )
env.Alias( "s3dist" , [ "install" , distFile ] , [ s3dist ] )
2009-02-02 00:27:04 +01:00
env.AlwaysBuild( "s3dist" )
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]:
2009-04-22 17:15:22 +02:00
print "removing %s" % filename
try:
shutil.rmtree(filename)
except:
os.remove(filename)
env.Alias("dist_clean", [], [clean_old_dist_builds])
env.AlwaysBuild("dist_clean")