220 lines
6.7 KiB
Python
220 lines
6.7 KiB
Python
import os, sys
|
|
import distutils.sysconfig
|
|
|
|
root_dir = Dir('#').abspath
|
|
|
|
######################################
|
|
# install paths
|
|
######################################
|
|
|
|
try:
|
|
umask = os.umask(022)
|
|
#print 'setting umask to 022 (was 0%o)' % umask
|
|
except OSError: # ignore on systems that don't support umask
|
|
pass
|
|
|
|
import SCons
|
|
from SCons.Script.SConscript import SConsEnvironment
|
|
SConsEnvironment.Chmod = SCons.Action.ActionFactory(os.chmod,
|
|
lambda dest, mode: 'Chmod: "%s" with 0%o' % (dest, mode))
|
|
|
|
# 755 = rwxr-xr-x
|
|
def InstallPerm(env, dir, source, perm):
|
|
obj = env.Install(dir, source)
|
|
for i in obj:
|
|
env.AddPostAction(i, env.Chmod(str(i), perm))
|
|
return dir
|
|
|
|
SConsEnvironment.InstallPerm = InstallPerm
|
|
|
|
def win32():
|
|
return sys.platform == 'win32'
|
|
|
|
def make_symlink(target, source, env):
|
|
os.symlink(os.path.abspath(str(source[0])), str(target[0]))
|
|
|
|
class LocalEnvironment(Environment):
|
|
def __init__(self, **kargs):
|
|
Environment.__init__(self,
|
|
ENV=os.environ,
|
|
variables=opts,
|
|
**kargs)
|
|
self['BUILDERS'].update(dict(
|
|
Symlink = Builder(action = make_symlink)
|
|
))
|
|
self.Append(
|
|
LINKFLAGS = "-z defs" # warn for missing symbols
|
|
)
|
|
if not self['VERBOSE']:
|
|
self.Append(
|
|
SHCXXCOMSTR = "$SOURCE",
|
|
SHLINKCOMSTR = "Linking $TARGET",
|
|
CXXCOMSTR = "$SOURCE",
|
|
LINKCOMSTR = "Linking $TARGET",
|
|
)
|
|
if self['DEBUG']:
|
|
self.debug()
|
|
else:
|
|
self.release()
|
|
|
|
self.Alias(target='install', source="${DESTDIR}${PREFIX}")
|
|
self['PYTHON_SITE_PACKAGES'] = distutils.sysconfig.get_python_lib(prefix="${DESTDIR}${PREFIX}")
|
|
|
|
def debug(self):
|
|
if win32():
|
|
self.Append(
|
|
CXXFLAGS=[
|
|
"/EHsc",
|
|
"/arch:SSE",
|
|
"/MTd",
|
|
"/D",
|
|
],
|
|
)
|
|
else:
|
|
self.Append(
|
|
CXXFLAGS=[
|
|
"-fpermissive",
|
|
"-g",
|
|
"-DDEBUG",
|
|
"-fno-strict-aliasing",
|
|
"-fwrapv",
|
|
"-Wall",
|
|
"-Wno-deprecated",
|
|
# '-march=core2', #x86_64: we need to take this out
|
|
# '-mfpmath=sse',
|
|
# '-msse',
|
|
'-ffast-math',
|
|
],
|
|
)
|
|
|
|
def release(self):
|
|
if win32():
|
|
self.Append(
|
|
CXXFLAGS=[
|
|
"/EHsc",
|
|
"/arch:SSE",
|
|
"/Ox",
|
|
"/Oy",
|
|
"/Oi",
|
|
"/Ob2",
|
|
"/fp:fast",
|
|
"/MT",
|
|
],
|
|
)
|
|
else:
|
|
self.Append(
|
|
CXXFLAGS=[
|
|
"-fpermissive",
|
|
"-fno-strict-aliasing",
|
|
"-fwrapv",
|
|
"-Wall",
|
|
"-Wno-deprecated",
|
|
# '-march=core2', #x86_64: we need to take this out
|
|
# '-mfpmath=sse',
|
|
# '-msse',
|
|
'-O3',
|
|
'-funroll-loops',
|
|
'-fomit-frame-pointer',
|
|
'-ffast-math',
|
|
'-DNDEBUG',
|
|
],
|
|
)
|
|
|
|
def install(self, target, source, perm=None):
|
|
if self['IDDQD']:
|
|
target_dir = self.Dir(target)
|
|
if not hasattr(source, '__iter__'):
|
|
source = [source]
|
|
for s in source:
|
|
target = os.path.join(str(target_dir), os.path.basename(str(s)))
|
|
i = self.Symlink(target=target, source=source)
|
|
elif not perm:
|
|
self.Install(dir=self.Dir(target), source=source)
|
|
else:
|
|
self.InstallPerm(dir=self.Dir(target), source=source, perm=perm)
|
|
|
|
class PyExtEnvironment(LocalEnvironment):
|
|
def __init__(self, **kargs):
|
|
LocalEnvironment.__init__(self, **kargs)
|
|
if win32():
|
|
python_inc = distutils.sysconfig.get_python_inc(False)
|
|
# not beautiful but rare
|
|
python_lib = os.path.join(distutils.sysconfig.get_python_lib(False, True),'..','libs')
|
|
self.Append(
|
|
CPPPATH=[
|
|
python_inc,
|
|
'../../../include',
|
|
'#/include',
|
|
],
|
|
CXXFLAGS=[
|
|
"/DBOOST_PYTHON_STATIC_LIB",
|
|
"/DWIN32",
|
|
],
|
|
LIBPATH=[
|
|
python_lib,
|
|
'../../../lib',
|
|
],
|
|
LIBS=[
|
|
]
|
|
)
|
|
self['SHLIBPREFIX'] = "" #gets rid of lib prefix
|
|
self['SHLIBSUFFIX'] = ".pyd"
|
|
else:
|
|
python_inc = distutils.sysconfig.get_python_inc(False)
|
|
python_lib = distutils.sysconfig.get_python_lib(False, True)
|
|
|
|
self.Append(
|
|
CPPPATH=[
|
|
python_inc,
|
|
'#/include',
|
|
],
|
|
LIBPATH=[
|
|
python_lib,
|
|
],
|
|
LIBS=[
|
|
'stdc++', # possible fix for __cxa_allocate_exception segfault
|
|
'boost_python-mt-py26',
|
|
],
|
|
)
|
|
self['SHLIBPREFIX'] = "" #gets rid of lib prefix
|
|
self.ParseConfig("python-config --libs")
|
|
|
|
######################################
|
|
|
|
#VariantDir('build', 'src', duplicate=0)
|
|
|
|
def bool_converter(value):
|
|
value = value.lower()
|
|
if value in ('true','enabled','on','yes','1'):
|
|
return True
|
|
elif value in ('false','disabled','off','no','0'):
|
|
return False
|
|
return bool(value)
|
|
|
|
######################################
|
|
|
|
opts = Variables( root_dir + '/options.conf', ARGUMENTS )
|
|
opts.Add("PREFIX", 'Set the install "prefix" ( /path/to/PREFIX )', "/usr/local")
|
|
opts.Add("DESTDIR", 'Set the root directory to install into ( /path/to/DESTDIR )', "")
|
|
opts.Add("DEBUG", "Compile in debug mode if true", False, None, bool_converter)
|
|
opts.Add("VERBOSE", "Print command lines while building", False, None, bool_converter)
|
|
opts.Add("IDDQD", "Enables god mode (installs symlinks)", False, None, bool_converter)
|
|
|
|
env = LocalEnvironment()
|
|
env.SConsignFile()
|
|
|
|
assert not env['DESTDIR'] or os.path.isabs(env['DESTDIR']), "%s must be an absolute path." % env['DESTDIR']
|
|
assert not env['PREFIX'] or os.path.isabs(env['PREFIX']), "%s must be an absolute path." % env['PREFIX']
|
|
|
|
opts.Save(root_dir + '/options.conf', env)
|
|
Help( opts.GenerateHelpText( env ) )
|
|
|
|
######################################
|
|
|
|
Export('LocalEnvironment',
|
|
'PyExtEnvironment',
|
|
'win32')
|
|
SConscript([
|
|
'SConscript',
|
|
])
|