tildefriends/SConstruct

137 lines
5.4 KiB
Python

#!/usr/bin/python
import os
import platform
import sys
options = Variables('options.cache', ARGUMENTS)
options.AddVariables(PathVariable('uv', 'Location of libuv', 'deps/%s/uv' % sys.platform))
options.AddVariables(PathVariable('v8', 'Location of v8', 'deps/%s/v8' % sys.platform))
options.AddVariables(PathVariable('lmdb', 'Location of liblmdb', 'deps/%s/lmdb' % sys.platform))
options.AddVariables(BoolVariable('package', 'Build a package', False))
VariantDir('build/src', 'src', duplicate=0)
VariantDir('build/deps', 'deps', duplicate=0)
kwargs = {}
if sys.platform == 'darwin':
kwargs['CXX'] = 'clang++'
env = Environment(options=options, tools=['default', 'packaging'], **kwargs)
options.Save('options.cache', env)
Help(options.GenerateHelpText(env))
v8 = env['v8']
uv = env['uv']
liblmdb = env['lmdb']
libs = []
env.Append(CPPPATH=[
os.path.join(v8, 'include'),
v8,
os.path.join(uv, 'include'),
os.path.join(liblmdb, 'libraries', 'liblmdb'),
])
grouped_libs = []
objectSuffix = '.obj' if sys.platform == 'win32' else '.o'
raspi = platform.machine() == 'armv7l'
if raspi:
libs += [
os.path.join(v8, 'out', 'arm.release', 'obj.target', 'src', 'libv8_libplatform.a'),
os.path.join(v8, 'out', 'arm.release', 'obj.target', 'src', 'libv8_base.a'),
os.path.join(v8, 'out', 'arm.release', 'obj.target', 'src', 'libv8_libbase.a'),
os.path.join(v8, 'out', 'arm.release', 'obj.target', 'src', 'libv8_libsampler.a'),
os.path.join(v8, 'out', 'arm.release', 'obj.target', 'src', 'libv8_nosnapshot.a'),
os.path.join(v8, 'out', 'arm.release', 'obj.target', 'third_party', 'icu', 'libicui18n.a'),
os.path.join(v8, 'out', 'arm.release', 'obj.target', 'third_party', 'icu', 'libicuuc.a'),
]
else:
grouped_libs += ['-Wl,--start-group']
grouped_libs += [env.Library('build/bin/v8_libplatform', Glob(os.path.join(v8, 'out', 'obj', 'v8_libplatform', '*' + objectSuffix)))]
grouped_libs += [env.Library('build/bin/v8_base', Glob(os.path.join(v8, 'out', 'obj', 'v8_base', '*' + objectSuffix)))]
grouped_libs += [env.Library('build/bin/v8_builtins_setup', Glob(os.path.join(v8, 'out', 'obj', 'v8_builtins_setup', '*' + objectSuffix)))]
grouped_libs += [env.Library('build/bin/v8_libbase', Glob(os.path.join(v8, 'out', 'obj', 'v8_libbase', '*' + objectSuffix)))]
grouped_libs += [env.Library('build/bin/v8_builtins_generators', Glob(os.path.join(v8, 'out', 'obj', 'v8_builtins_generators', '*' + objectSuffix)))]
grouped_libs += [env.Library('build/bin/v8_libsampler', Glob(os.path.join(v8, 'out', 'obj', 'v8_libsampler', '*' + objectSuffix)))]
grouped_libs += [env.Library('build/bin/v8_snapshot', Glob(os.path.join(v8, 'out', 'obj', 'v8_snapshot', '*' + objectSuffix)))]
grouped_libs += [env.Library('build/bin/icui18n', Glob(os.path.join(v8, 'out', 'obj', 'third_party', 'icu', 'icui18n', '*' + objectSuffix)))]
grouped_libs += [env.Library('build/bin/icuuc', Glob(os.path.join(v8, 'out', 'obj', 'third_party', 'icu', 'icuuc', '*' + objectSuffix)))]
grouped_libs += ['-Wl,--end-group']
if sys.platform == 'win32':
env.Append(LIBS=['libuv', 'advapi32', 'winmm', 'wsock32', 'ws2_32', 'psapi', 'iphlpapi', 'userenv', 'user32', 'dbghelp', 'shlwapi'])
env.Append(CXXFLAGS=['/EHsc', '/MTd', '/Zi', '/Gy'])
env.Append(CFLAGS=['/EHsc', '/MTd', '/Zi', '/Gy'])
env.Append(LIBPATH=[
os.path.join(uv, 'Release/lib'),
])
env.Append(LINKFLAGS=['/RELEASE', '/OPT:REF', '/OPT:ICF', '/NODEFAULTLIB:libcmt', '/LTCG'])
elif sys.platform == 'darwin':
env.Append(LIBS=['pthread', 'uv'])
env.Append(CXXFLAGS=['--std=c++11', '-g', '-Wall', '-stdlib=libc++'])
env.Append(CFLAGS=['-g', '-Wall'])
env.Append(LINKFLAGS=['-g', '-stdlib=libc++'])
env.Append(LIBPATH=[
os.path.join(uv, 'build/Release'),
])
else:
env.Append(LIBS=['uv', 'rt', 'dl', 'pthread'])
env.Append(CXXFLAGS=['--std=c++11', '-g', '-Wall'])
env.Append(CFLAGS=['-g', '-Wall'])
env.Append(LINKFLAGS=['-g'])
env.Append(LIBPATH=[
os.path.join(uv, 'out/Debug/obj.target'),
])
env.Command('icudtl.dat', os.path.join(v8, 'out/arm.release/icudtl.dat' if raspi else 'out/icudtl.dat'), Copy("$TARGET", "$SOURCE"))
ldapEnv = env.Clone()
if sys.platform == 'win32':
ldapEnv.Append(CPPPATH=['deps/win32'])
lmdb = ldapEnv.Library('build/lmdb', [
os.path.join(liblmdb, 'libraries', 'liblmdb', 'mdb.c'),
os.path.join(liblmdb, 'libraries', 'liblmdb', 'midl.c'),
])
env.Append(LIBS=[lmdb])
if sys.platform == 'linux2':
env.Append(LIBS=['crypto', 'ssl'])
env.Append(LINKFLAGS=['-std=c++0x'])
source = [s for s in Glob('build/src/*.cpp') if not os.path.basename(str(s)).startswith("SecureSocket_")]
if sys.platform == 'darwin':
env.Append(FRAMEWORKS=['CoreFoundation', 'Security'])
elif sys.platform == 'win32':
env.Append(LIBS=['Crypt32'])
if grouped_libs:
env.Append(GROUPED_LIBS = grouped_libs)
env.Append(LINKCOM = ' $GROUPED_LIBS')
env.Program('tildefriends', source + libs)
def listAllFiles(root):
for root, dirs, files in os.walk(root):
for f in files:
if not f.startswith('.'):
yield os.path.join(root, f)
hidden = [d for d in dirs if d.startswith('.')]
for d in hidden:
dirs.remove(d)
if env['package'] and sys.platform == 'win32':
files = [
'COPYING',
'LICENSE',
'SConstruct',
'tildefriends.exe',
'icudtl.dat',
]
files += listAllFiles('src')
files += listAllFiles('packages')
files += listAllFiles('core')
env.Package(
NAME='TildeFriends',
target='dist/TildeFriends-win32.zip',
PACKAGETYPE='zip',
PACKAGEROOT='TildeFriends-win32',
source=files
)