SConstruct 9.08 KB
import os, sys
import platform

opts = Variables('DefaultOptions.py')
opts.Add(BoolVariable('DEBUG', 'Set to 1 to build with debug symbols', 0))
opts.Add(BoolVariable('GUI', 'Set to 1 to build with graphical interface support', 1))
opts.Add(BoolVariable('SSL', 'Set to 1 to build with SSL support', 1))
opts.Add(BoolVariable('SQLAPI', 'Set to 1 to build with SQLAPI support', 0))
opts.Add(EnumVariable('SQLITE_THREADSAFE', 'Threading mode for Sqlite', '1', allowed_values=('0', '1', '2')))
opts.Add('CC', 'The C compiler')
opts.Add('CXX', 'The C++ compiler')
opts.Add('CFLAGS', 'The C compiler flags')
opts.Add('CPPFLAGS', 'The C++ compiler flags')
opts.Add('CCFLAGS', 'The C & C++ compiler flags')
opts.Add('LINK', 'The linker')
opts.Add('LINKFLAGS', 'The linker flags')
opts.Add('LIBPATH', 'The linker includes paths')
opts.Add(BoolVariable('STRIP', 'The platform dependant strip tool', 1))
opts.Add('STRIPTOOL', 'The platform dependant strip tool', 'strip')
opts.Add('ARCH', 'The platform architecture (x86 or mipsel)', 'x86')

def ArgToList(val):
  return val.split()

opts.Add('LIBS', 'Additionnal libs', '', None, ArgToList)

debug = int(ARGUMENTS.get('DEBUG', 0))
gui = int(ARGUMENTS.get('GUI', 1))
ssl = int(ARGUMENTS.get('SSL', 1))
sqlapi = int(ARGUMENTS.get('SQLAPI', 1))
arch = ARGUMENTS.get('ARCH', 'x86')
strip = int(ARGUMENTS.get('STRIP', 1))
stripTool = ARGUMENTS.get('STRIPTOOL', 'strip')
static = ARGUMENTS.get('STATIC', 0)
if sys.platform == 'win32':
  #env = Environment(variables = opts, ENV = os.environ, MSVS_VERSION = '6.0')
  env = Environment(variables = opts, ENV = os.environ, tools = ['mingw'])
else:
  env = Environment(variables = opts, ENV = os.environ)

env['DEVDIR'] = os.path.join('..')
env['BASEDIR'] = os.path.join(env['DEVDIR'], '..')
env['TRDDIR'] = os.path.join(env['BASEDIR'], 'third_dev')

print 'Platform is "' + env['PLATFORM'] + '"'
if env['PLATFORM'] in ( 'posix', 'darwin', ):
  is_posix = True
else:
  is_posix = False
print "POSIX:", is_posix 
  
if debug:
  env.Append(CPPDEFINES = {'DEBUG': None})
  env.Append(CPPDEFINES = {'_DEBUG': None})
else:
  env.Append(CPPDEFINES = {'NDEBUG': None})

if gui == 1:
  print "GUI is Ok"
  env.Append(CPPDEFINES = {'_WITH_GRAPHISM_': None})
if ssl == 1:
  print "SSL is Ok"
  env.Append(CPPDEFINES = {'_WITH_SSL_': None})
  if platform.system().lower() == 'linux':
    env.Append(CPPPATH = [os.path.join(env['TRDDIR'], 'openssl', 'include')])

if sqlapi:
  print "SQLAPI is Ok"
  env.Append(CPPDEFINES = {'WITH_SQLAPI': None})
  env.Append(CPPPATH = [os.path.join(env['TRDDIR'], 'SQLAPI', 'include')])
  env.Append(LIBPATH = [os.path.join(env['TRDDIR'], 'SQLAPI', 'lib', sys.platform)])
  if is_posix:
    env.Append(LIBS=['sqlapi'])
  elif env['PLATFORM'] == 'win32':
    if debug:
      env.Append(LIBS=['sqlapid', 'ole32', 'Oleaut32'])
      env.Append(LINKFLAGS = ' /nodefaultlib:"MSVCRT.lib" ')
    else:
      env.Append(LIBS=['sqlapi', 'ole32', 'Oleaut32'])

env.Append(CPPDEFINES = {'ARCH_' + arch.upper(): None})

if is_posix:
  if debug:
    env.Append(CCFLAGS = ' -g -c -Wall')
    sqliteFlags = ' -g -c -m32'
  else:
    env.Append(CCFLAGS = ' -O3 -c -Wall')
    sqliteFlags = ' -O3 -c -m32'
  env.Append(CCFLAGS = ' -fpermissive')
  if strip != 0:
    vm_output_name = 'anbexec_with_symbols'
  else:
    vm_output_name = 'anbexec'
  if static:
    env.Append(LINKFLAGS = '-static')
    env.Append(CCFLAGS = ' -static')
  env.Append(CCFLAGS = ' -m32')
  env.Append(LINKFLAGS = ' -m32')

if sys.platform.startswith('linux'):
  host = 'linux'  #used  to construct a src path specific to that platform
  #if sys.platform == 'linux2':
  	# missing definition for OpenWRT buildroot
  env.Append(CPPDEFINES = {'_LINUX_': None})
 
elif sys.platform.startswith('freebsd'):
  host = 'linux'  #used  to construct a src path specific to that platform
  env.Append(CPPDEFINES = {'_LINUX_': None})

  env.Append(CPPPATH = ['/usr/local/include'])
  env.Append(LIBPATH = ['/usr/local/lib'])

elif sys.platform == "darwin":
  host = 'linux'  #used  to construct a src path specific to that platform
  env.Append(CPPDEFINES = {'_LINUX_': None})
  
  # for full path on log
  env['CXXCOM'] = '$CXX -o $TARGET -c $CXXFLAGS $CCFLAGS $_CCCOMCOM ${SOURCES.abspath}'

  env.Append(CPPPATH = ['/opt/local/include'])
  env.Append(LIBPATH = ['/opt/local/lib'])

elif env['PLATFORM'] == 'win32':
  host = 'win32'
  sqliteFlags = '' #' -c'
  vm_output_name = 'anbexec'
  #env.Append(CCFLAGS = ' /MD /GX /O2 /GS')
  # env.Append(CCFLAGS = ' -U__STRICT_ANSI__')
  env.Append(CPPDEFINES = {'WIN32': None, '_WIN32_IE': '0x0400'})
  #env.Append(LINKFLAGS = ' /subsystem:console /incremental:no /machine:I386 ')

env.Append(CPPPATH = [os.path.join(env['DEVDIR'], 'include'), 
                      '.',
                      'src',
                      os.path.join(env['TRDDIR'], 'sqlite3'),
                      ])
if env['PLATFORM'] == 'win32':
  env.Append(CPPPATH = [os.path.join(env['TRDDIR'], 'openssl', 'include')])
  env.Append(LIBPATH = [os.path.join(env['TRDDIR'], 'openssl', 'lib', 'mingw')])
  env.Append(CPPPATH = [os.path.join(env['TRDDIR'], 'libjpeg', 'include')])
  env.Append(LIBPATH = [os.path.join(env['TRDDIR'], 'libjpeg', 'lib', 'win32')])


env.VariantDir('build', 'src', duplicate=0)
env.VariantDir(os.path.join('build', 'share'), os.path.join(env['DEVDIR'], 'share'), duplicate=0)
env.VariantDir(os.path.join('build', 'cipher'), os.path.join(env['DEVDIR'], 'cipher'), duplicate=0)
env.VariantDir(os.path.join('build', 'graph'), os.path.join('src', host), duplicate=0)
env.VariantDir(os.path.join('build', 'openssl'), os.path.join(env['TRDDIR'], 'openssl'), duplicate=0)
env.VariantDir(os.path.join('build', 'sqlite'), os.path.join(env['TRDDIR'], 'sqlite3'), duplicate=0)

main_src = [os.path.join('build', x) for x in Split("""
  vmint.cpp vmalloc.cpp vm.cpp vmtools.cpp graphics.cpp sslstuff.cpp time.c
  AnubisAllocator.cpp AnubisFileLocker.cpp AnubisProcess.cpp 
  syscall.cpp syscall32.cpp serialize.cpp Profiling.cpp debugger.cpp Library.cpp
""")]
if sqlapi:
  main_src.append(os.path.join('build', 'dbapi_tools.cpp'))

share_src = [os.path.join('build', 'share', x) for x in Split("""
  FileIO.cpp
  IniFile.cpp
  String.cpp
  DebugLog.cpp
  MultiPath.cpp
  StringList.cpp
  List.cpp
  """ + host + 'stuff.cpp')]

special_src = [os.path.join('build', x) for x in Split("""
  anbexec.cpp
""")]

cipher_src = [os.path.join('build', 'cipher', x) for x in Split("""
  blowfish.c sha1.c
""")]

graph_src = [os.path.join('build', 'graph', x) for x in Split("""
  host_graph.cpp
""")]

sqlite3_src = [os.path.join('build', 'sqlite', x) for x in Split("""
  sqlite3.c
""")]

if platform.system() == 'Windows':
  main_src.append(os.path.join('build', 'win32', 'fnmatch.cpp'))
  main_rc = [os.path.join('build', 'win32', x) for x in Split("""
    vm.rc
  """)]

sqliteDefs = env['CPPDEFINES'].copy()
sqliteDefs['NO_TCL'] = None
sqliteDefs['THREADSAFE'] = ARGUMENTS.get('SQLITE_THREADSAFE')
#sqliteDefs['SQLITE_MAX_COLUMN'] = '4000'

#
# 
#
main_obj = env.Object(main_src)
share_obj = env.Object(share_src)
special_obj = env.Object(special_src)
cipher_obj = env.Object(cipher_src)
graph_obj = env.Object(graph_src)
sqlite3_obj = env.Object(sqlite3_src, CCFLAGS = sqliteFlags, CPPDEFINES = sqliteDefs)

if is_posix:
  if ssl:
    env.Append(LIBS=['ssl'])
    env.Append(LIBPATH = [os.path.join(env['TRDDIR'], 'openssl', 'lib', platform.system().lower())])
  
  env.Append(LIBS=['crypto', 'jpeg', 'pthread'])
  if gui:
    env.Append(LIBPATH = ['/usr/X11R6/lib'])
    env.Append(LIBS=['X11'])
  if static:
    env.Append(LIBS=['dl', 'Xau', 'Xdmcp']) # needed by some libraries but removed by the -static flag
  if sys.platform.startswith('freebsd'):
    env.Append(LIBS=['compat'])
  
  rsc = []
elif env['PLATFORM'] == 'win32':
  env.Append(LIBS=['libjpeg', 'ws2_32', 'shell32', 'user32', 'Advapi32', 'Gdi32', 'version'])
  if ssl:
    env.Append(LIBS=['ssl', 'crypto', 'Gdi32'])
    # env.Append(LIBS=['libeay32'])
  rsc = env.RES(main_rc)

all_anbexec_objs = main_obj + share_obj + special_obj + cipher_obj + sqlite3_obj + rsc
if gui == 1:
  all_anbexec_objs += graph_obj
anbexec = env.Program(vm_output_name, all_anbexec_objs)

if is_posix and strip != 0:
  print 'STRIP = ', strip, type(strip)
  anbexec = env.Command('anbexec', vm_output_name, '%s -o $TARGET $SOURCE' % stripTool)

if env['PLATFORM'] == 'win32':
  installPath = os.path.join(env['BASEDIR'], 'anubis_distrib', 'win32_install', 'bin')
  binDir = os.path.normpath(os.path.join(env['BASEDIR'], 'bin', 'anubis'))
else:
  installPath = os.path.join(env['BASEDIR'], 'anubis_distrib', 'linux_install', 'bin')
  binDir = os.path.join(env['ENV']['HOME'], 'bin')
  #if sqlapi:
  	#sqlapi_so = os.path.join(env['TRDDIR'], 'SQLAPI', 'posix', 'lib', 'libsqlapi.so' )
  	#env.Install(installPath, sqlapi_so)
  	#env.Install(binDir, sqlapi_so)

env.Install(installPath, anbexec)
env.Install(binDir, anbexec)
env.Alias('install', [installPath, binDir])

env.Alias('all', [anbexec, 'install'])
env.Alias('vm', [anbexec, ])
print 'BINDIR=', binDir

Default('all')




Help("""
Type: 'scons vm' to build the production program,
      'scons debug' to build the debug version.
"""
  + opts.GenerateHelpText(env))

print 'BUILD_TARGETS is', map(str, BUILD_TARGETS)