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

792 lines
23 KiB
Python
Raw Normal View History

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-01-28 23:27:12 +01:00
import types
2009-02-01 23:39:07 +01:00
import re
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-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-01-27 04:19:15 +01:00
AddOption( "--v8" ,
dest="v8home",
type="string",
2009-01-27 04:54:22 +01:00
default="../v8/",
2009-01-27 04:19:15 +01:00
nargs=1,
action="store",
metavar="dir",
help="v8 location")
2009-01-19 19:02:41 +01:00
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-01-14 16:58:32 +01:00
# --- environment setup ---
2009-01-06 00:19:56 +01:00
env = Environment()
2009-02-04 21:08:55 +01:00
if GetOption( "recstore" ) != None:
env.Append( CPPDEFINES=[ "_RECSTORE" ] )
env.Append( CPPPATH=[ "." ] )
2009-01-06 00:19:56 +01:00
boostLibs = [ "thread" , "filesystem" , "program_options" ]
2009-02-24 20:14:45 +01:00
commonFiles = Split( "stdafx.cpp db/jsobj.cpp db/json.cpp db/commands.cpp db/lasterror.cpp db/nonce.cpp db/queryutil.cpp" )
2009-02-03 19:30:28 +01:00
commonFiles += [ "util/background.cpp" , "util/mmap.cpp" , "util/sock.cpp" , "util/util.cpp" , "util/message.cpp" ]
commonFiles += Glob( "util/*.c" );
commonFiles += Split( "client/connpool.cpp client/dbclient.cpp client/model.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" ]
2009-02-17 21:53:19 +01:00
serverOnlyFiles = Split( "db/query.cpp db/introspect.cpp db/btree.cpp db/clientcursor.cpp db/javajs.cpp db/tests.cpp db/repl.cpp db/btreecursor.cpp db/cloner.cpp db/namespace.cpp db/matcher.cpp db/dbcommands.cpp db/dbeval.cpp db/dbwebserver.cpp db/dbinfo.cpp db/dbhelpers.cpp db/instance.cpp db/pdfile.cpp db/cursor.cpp db/security_commands.cpp db/security.cpp util/miniwebserver.cpp db/storage.cpp db/reccache.cpp db/queryoptimizer.cpp" )
2009-03-11 22:28:49 +01:00
coreShardFiles = []
shardServerFiles = coreShardFiles + Glob( "s/strategy*.cpp" ) + [ "s/commands.cpp" , "s/request.cpp" , "s/cursors.cpp" , "s/server.cpp" ] + [ "s/shard.cpp" , "s/shardkey.cpp" , "s/config.cpp" ]
serverOnlyFiles += coreShardFiles + [ "s/commands_db.cpp" ]
2009-02-02 23:13:38 +01:00
allClientFiles = commonFiles + coreDbFiles + [ "client/clientOnly.cpp" , "client/gridfs.cpp" ];
2009-01-06 00:19:56 +01:00
2009-02-05 18:28:51 +01:00
onlyServer = len( COMMAND_LINE_TARGETS ) == 0 or ( len( COMMAND_LINE_TARGETS ) == 1 and str( COMMAND_LINE_TARGETS[0] ) == "mongod" )
2009-01-07 19:27:01 +01:00
nix = False
2009-02-01 15:06:49 +01:00
useJavaHome = False
linux64 = False
2009-01-29 00:04:08 +01:00
darwin = False
windows = False
2009-01-20 16:22:09 +01:00
force64 = not GetOption( "force64" ) is None
2009-01-22 15:12:58 +01:00
force32 = not GetOption( "force32" ) is None
2009-01-28 23:27:12 +01:00
release = not GetOption( "release" ) is None
2009-02-09 20:30:45 +01:00
debugBuild = ( not GetOption( "debugBuild" ) is None ) or ( not GetOption( "debugBuildAndLogging" ) is None )
debugLogging = not GetOption( "debugBuildAndLogging" ) is None
2009-02-09 20:30:45 +01:00
noshell = not GetOption( "noshell" ) is None
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" )
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-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-01-25 16:01:43 +01:00
env.Append( CPPPATH=[ "-I/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Headers/" ] )
2009-01-06 00:19:56 +01:00
env.Append( CPPFLAGS=" -mmacosx-version-min=10.4 " )
env.Append( FRAMEWORKS=["JavaVM"] )
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-20 16:22:09 +01:00
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:
env.Append( CPPPATH=[ "/sw/include" , "/opt/local/include"] )
env.Append( LIBPATH=["/sw/lib/", "/opt/local/lib"] )
2009-01-06 00:53:46 +01:00
elif "linux2" == os.sys.platform:
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-01-30 15:47:01 +01:00
if not os.path.exists( javaHome ):
2009-01-30 15:46:25 +01:00
#fedora standarm jvm location
javaHome = "/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-01-19 17:59:42 +01:00
env.Append( LIBPATH=["/usr/lib64"] )
2009-02-05 18:42:35 +01:00
env.Append( LIBS=["pthread"] )
2009-02-01 15:06:49 +01:00
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-02-01 15:06:49 +01:00
elif "sunos5" == os.sys.platform:
nix = True
useJavaHome = True
javaHome = "/usr/lib/jvm/java-6-sun/"
javaOS = "solaris"
env.Append( CPPDEFINES=[ "__linux__" ] )
2009-01-07 21:51:42 +01:00
elif "win32" == os.sys.platform:
windows = True
2009-01-07 21:51:42 +01:00
boostDir = "C:/Program Files/Boost/boost_1_35_0"
if not os.path.exists( boostDir ):
print( "can't find boost" )
Exit(1)
boostLibs = []
javaHome = findVersion( "C:/Program Files/java/" ,
[ "jdk" , "jdk1.6.0_10" ] )
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 , javaHome + "/include" , javaHome + "/include/win32" , "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 " )
env.Append( CPPDEFINES=["WIN32","_CONSOLE","_CRT_SECURE_NO_WARNINGS","HAVE_CONFIG_H","PCRE_STATIC","_UNICODE","UNICODE" ] )
2009-01-08 00:05:22 +01:00
2009-02-10 21:12:15 +01:00
if release:
env.Append( CPPDEFINES=[ "NDEBUG" ] )
2009-02-10 21:38:20 +01:00
env.Append( CPPFLAGS= " /O2 /Oi /GL /FD /MT /Gy /nologo /Zi /TP /errorReport:prompt /Gm " )
2009-02-10 21:12:15 +01:00
# /Yu"stdafx.h" /Fp"Release\db.pch" /Fo"Release\\" /Fd"Release\vc90.pdb"
else:
env.Append( CPPDEFINES=[ "_DEBUG" ] )
env.Append( CPPFLAGS=" /Od /Gm /RTC1 /MDd /ZI " )
# /Fo"Debug\\" /Fd"Debug\vc90.pdb"
2009-01-07 21:51:42 +01:00
env.Append( LIBPATH=[ boostDir + "/Lib" , javaHome + "/Lib" , winSDKHome + "/Lib" ] )
2009-01-27 17:38:41 +01:00
javaLibs += [ "jvm" ];
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
2009-01-08 15:53:46 +01:00
env.Append( LIBS=Split("ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib" ) )
2009-01-08 00:05:22 +01:00
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
2009-02-01 15:06:49 +01:00
if useJavaHome:
env.Append( CPPPATH=[ javaHome + "include" , javaHome + "include/" + javaOS ] )
env.Append( LIBPATH=[ javaHome + "jre/lib/" + javaVersion + "/server" , javaHome + "jre/lib/" + javaVersion ] )
javaLibs += [ "java" , "jvm" ]
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-02-18 19:42:32 +01:00
env.Append( CPPFLAGS="-fPIC -fno-strict-aliasing -ggdb -pthread -Wall -Wsign-compare -Wnon-virtual-dtor" )
2009-01-25 16:01:43 +01:00
env.Append( LINKFLAGS=" -fPIC " )
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
# --- check system ---
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-01-28 23:27:12 +01: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 ):
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 = [];
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-05 18:42:35 +01:00
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 failIfNotFound:
2009-02-05 18:28:51 +01:00
extra = ""
if linux64 and shell:
extra += " 32 bit version for shell"
print( "ERROR: can't find static version of: " + str( poss ) + extra + " in: " + str( allPlaces ) )
Exit(1)
2009-02-04 15:21:39 +01:00
res = conf.CheckLib( poss )
if res:
return True
if failIfNotFound:
2009-02-17 18:18:13 +01:00
print( "can't find " + str( poss ) + " in " + str( myenv["LIBPATH"] ) )
2009-02-04 15:21:39 +01:00
Exit(1)
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
if conf.CheckCXXHeader( "boost/asio.hpp" ):
myenv.Append( CPPDEFINES=[ "USE_ASIO" ] )
2009-03-02 22:49:05 +01:00
else:
print( "WARNING: old version of boost - you should consider upgrading" )
2009-02-01 23:39:07 +01:00
for b in boostLibs:
l = "boost_" + b
myCheckLib( [ l + "-mt" , l ] , release or not shell)
2009-02-01 23:39:07 +01:00
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" )
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-02-12 05:16:29 +01:00
elif myCheckLib( "readline" ):
2009-02-12 03:05:28 +01:00
myenv.Append( CPPDEFINES=[ "USE_READLINE" ] )
2009-02-12 04:18:30 +01:00
myCheckLib( "tinfo" )
2009-02-12 03:16:08 +01:00
else:
print( "WARNING: no readline, shell will be a bit ugly" )
2009-02-01 23:39:07 +01:00
# this will add it iff it exists and works
myCheckLib( "boost_system-mt" )
return conf.Finish()
env = doConfigure( env )
2009-01-27 04:19:15 +01:00
# --- v8 ---
v8Home = GetOption( "v8home" )
2009-01-27 05:30:22 +01:00
if not os.path.exists( v8Home ):
2009-01-27 04:19:15 +01:00
for poss in [ "../v8" , "../open-source/v8" ]:
if os.path.exists( poss ):
v8Home = poss
break
# --- js concat ---
def concatjs(target, source, env):
outFile = str( target[0] )
fullSource = ""
for s in source:
f = open( str(s) , 'r' )
for l in f:
fullSource += l
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):
outFile = str( target[0] )
if len( source ) != 1:
raise Exception( "wrong" )
h = "const char * jsconcatcode = \n"
for l in open( str(source[0]) , 'r' ):
l = l.strip()
l = l.partition( "//" )[0]
l = l.replace( '\\' , "\\\\" )
l = l.replace( '"' , "\\\"" )
h += '"' + l + "\\n\"\n "
h += ";\n\n"
out = open( outFile , 'w' )
out.write( h )
return None
jshBuilder = Builder(action = jsToH,
suffix = '.jsh',
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=["../"] )
clientEnv.Append( LIBS=[ "libmongoclient.a"] )
2009-01-13 15:56:18 +01:00
clientEnv.Append( LIBPATH=["."] )
testEnv = env.Clone()
testEnv.Append( CPPPATH=["../"] )
testEnv.Append( LIBS=[ "unittest" , "libmongotestfiles.a" ] )
testEnv.Append( LIBPATH=["."] )
2009-01-12 21:27:55 +01:00
# ----- TARGETS ------
2009-01-06 00:19:56 +01:00
2009-01-12 16:34:12 +01:00
# main db target
2009-01-27 15:26:15 +01:00
Default( env.Program( "mongod" , commonFiles + coreDbFiles + serverOnlyFiles + [ "db/db.cpp" ] ) )
2009-01-12 16:34:12 +01:00
# tools
2009-01-27 21:16:09 +01:00
allToolFiles = allClientFiles + [ "tools/Tool.cpp" ]
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" ] )
2009-01-29 19:01:45 +01:00
env.Program( "mongoimportjson" , allToolFiles + [ "tools/importJSON.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-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] )
env.Library( "mongotestfiles" , commonFiles + coreDbFiles + serverOnlyFiles )
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-02-11 19:17:52 +01:00
perftest = testEnv.Program( "perftest", "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 ---
if darwin or clientEnv["_HAVEPCAP"]:
2009-02-13 22:18:57 +01:00
sniffEnv = clientEnv.Clone()
sniffEnv.Append( LIBS=[ "pcap" ] )
sniffEnv.Program( "mongosniff" , "tools/sniffer.cpp" )
# --- shell ---
# shell is complicated by the fact that v8 doesn't work 64-bit yet
shellEnv = env.Clone();
2009-02-01 23:39:07 +01:00
shellEnv.Append( CPPPATH=[ "../" , v8Home + "/include/" ] )
shellEnv.Append( LIBPATH=[ v8Home] )
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-10 19:45:30 +01:00
shellEnv.Append( LIBS=[ "v8" ] )
2009-02-01 23:39:07 +01:00
2009-01-27 04:19:15 +01:00
shellEnv.JSConcat( "shell/mongo.jsall" , Glob( "shell/*.js" ) )
shellEnv.JSHeader( "shell/mongo.jsall" )
2009-02-01 23:39:07 +01:00
def removeIfInList( lst , thing ):
if thing in lst:
lst.remove( thing )
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:
weird = linux64 or force64
if linux64:
shellEnv.Append( CFLAGS="-m32" )
shellEnv.Append( CXXFLAGS="-m32" )
shellEnv.Append( LINKFLAGS="-m32" )
shellEnv.Append( LIBPATH=[ "/usr/lib32" , "/usr/lib" ] )
2009-02-04 15:41:52 +01:00
shellEnv["LIBPATH"].remove( "/usr/lib64" )
2009-02-12 03:05:28 +01:00
if force64:
shellEnv["CFLAGS"].remove("-m64")
shellEnv["CXXFLAGS"].remove("-m64")
shellEnv["LINKFLAGS"].remove("-m64")
shellEnv["CPPPATH"].remove( "/usr/64/include" )
shellEnv["LIBPATH"].remove( "/usr/64/lib" )
shellEnv.Append( CPPPATH=[ "/sw/include" , "/opt/local/include"] )
2009-01-28 23:27:12 +01:00
shellEnv.Append( LIBPATH=[ "/sw/lib/", "/opt/local/lib"] )
2009-02-02 00:38:33 +01:00
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"] )
if weird:
shell32BitFiles = Glob( "shell/*.cpp" )
for f in allClientFiles:
shell32BitFiles.append( "32bit/" + str( f ) )
2009-02-12 03:05:28 +01:00
shellEnv.VariantDir( "32bit" , "." )
else:
shellEnv.Append( 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:
shellEnv.Program( "mongo" , shell32BitFiles )
2009-02-12 03:05:28 +01:00
else:
2009-02-12 04:18:30 +01:00
shellEnv.Append( LIBS=[ "mongoclient"] )
shellEnv.Program( "mongo" , Glob( "shell/*.cpp" ) );
2009-02-12 03:05:28 +01:00
# ---- RUNNING TESTS ----
2009-01-29 15:19:51 +01:00
def testSetup( env , target , source ):
Mkdir( "/tmp/unittest/" )
testEnv.Alias( "smoke", [ "test" ] , [ testSetup , test[ 0 ].abspath ] )
testEnv.AlwaysBuild( "smoke" )
testEnv.Alias( "smokePerf", [ "perftest" ] , [ testSetup , perftest[ 0 ].abspath ] )
testEnv.AlwaysBuild( "smokePerf" )
2009-02-11 19:17:52 +01:00
2009-01-30 18:00:51 +01:00
clientExec = [ x[0].abspath for x in clientTests ];
testEnv.Alias( "smokeClient" , clientExec , clientExec )
testEnv.AlwaysBuild( "smokeClient" )
env.Alias( "mongosTest" , [ mongos[0].abspath ] , [ mongos[0].abspath + " --test" ] )
env.AlwaysBuild( "mongosTest" )
2009-02-18 16:10:39 +01:00
2009-01-12 21:27:55 +01:00
# ---- INSTALL -------
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()
2009-02-11 16:53:51 +01:00
installDir = "mongodb-" + platform + "-" + processor + "-";
2009-02-11 03:37:18 +01:00
if distName is None:
installDir += today.strftime( "%Y-%m-%d" )
else:
installDir += distName
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 installBinary( e , name ):
if windows:
name += ".exe"
env.Install( installDir + "/bin" , name )
2009-02-08 16:37:39 +01:00
installBinary( env , "mongodump" )
installBinary( env , "mongorestore" )
2009-02-08 16:37:39 +01:00
installBinary( env , "mongoexport" )
installBinary( env , "mongoimportjson" )
installBinary( env , "mongofiles" )
installBinary( env , "mongod" )
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
# 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 )
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 )
# ---- 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:
remotePrefix = "-latest"
else:
remotePrefix = "-" + distName
2009-01-27 19:08:44 +01:00
sys.path.append( "." )
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 + "-" + platform + "-" + processor + remotePrefix
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 )
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" )