adchpp-docker/src/swig/SConscript

224 lines
5.9 KiB
Python

# vim: set filetype: py
Import('dev source_path setLuaEnv')
targets = []
build_path = dev.get_build_path(source_path)
import os.path
def runCommand(cmd):
import subprocess
try:
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
(output, err) = p.communicate()
return output
except Exception,e:
print e
return ""
def getRbConf(name):
return runCommand([dev.env['ruby'], '-rmkmf', '-e', "print RbConfig.expand('$(" + name + ")')"])
def buildRbModule():
env = dev.env.Clone()
conf = Configure(env, conf_dir = dev.get_build_path('.sconf_temp'), log_file = dev.get_build_path('config.log'), clean = False, help = False)
if not runCommand([dev.env['ruby'], '-v']):
print "Ruby not found, skipping ruby module"
return
env.Append(SWIGFLAGS=['-c++','-Wall','-ruby','-autorename'])
import distutils.sysconfig
libdir = getRbConf("libdir")
if not libdir:
print "Ruby libdir not found, skipping ruby module"
return
incdir = getRbConf("rubyhdrdir")
if not incdir:
print "Ruby hdrdir not found, skipping ruby module"
return
arch = getRbConf("arch")
if not arch:
print "Ruby arch not found, skipping ruby module"
return
soname = getRbConf("RUBY_SO_NAME")
if not soname:
print "Ruby RUBY_SO_NAME not found, skipping ruby module"
return
env.Append(LIBPATH=[libdir])
env.Append(CPPPATH=['#', incdir, os.path.join(incdir, arch)])
env.Append(LIBS=[soname, 'adchpp'])
if not conf.CheckCHeader('ruby.h'):
print "ruby.h not found, skipping ruby module"
conf.Finish()
return
conf.Finish()
ruby_wrap = dev.get_build_path(source_path) + 'ruby_wrap.cxx'
f = env.CFile(target=ruby_wrap, source='ruby.i')
doc_path = env.Dir(dev.get_target(source_path, "doc/")).path
env["DOCPATH"] = doc_path
# TODO make it not rebuild every time...
# docs = env.Command(doc_path + "/index.html", ruby_wrap, "rdoc -o \"$DOCPATH\" $SOURCES")
if '_DEBUG' in env['CPPDEFINES']:
env['CPPDEFINES'].remove('_DEBUG')
rb = env.SharedLibrary(dev.get_target(source_path, 'rbadchpp'), [f],
SHLIBPREFIX='')
targets.append(rb)
def buildPyModule():
import sys
env, target, sources = dev.prepare_build(source_path, '_pyadchpp', 'python.i')
env.Append(SWIGFLAGS=['-c++','-threads','-Wall','-python', '-O', '-modern', '-features', 'autodoc=1'])
env['SWIGOUTDIR'] = Dir(dev.get_build_path('bin'))
version = sys.version[0] + sys.version[2]
if version not in ('25','26','27'):
print 'Invalid Python version: ' + version + ' - skipping Python module'
return
env.Append(CPPPATH=['#'])
if '_DEBUG' in env['CPPDEFINES']:
env['CPPDEFINES'].remove('_DEBUG')
if '/MDd' in env['CCFLAGS']:
env['CCFLAGS'].remove('/MDd')
env['CCFLAGS'].append('/MD')
if dev.is_win32():
pyprefix = env['python']
incpath = os.path.join(pyprefix, "include")
libpath = os.path.join(pyprefix, "libs")
env.Append(LIBPATH=[libpath])
env.Append(LIBS=["python"+version])
env.Append(CPPPATH=[incpath])
else:
import distutils
env.Append(CPPPATH=[distutils.sysconfig.get_python_inc()])
env.Append(LIBS=['python' + sys.version[0:3]])
env.Append(LIBS=['adchpp'])
found = False
for p in env['CPPPATH']:
if os.path.exists(os.path.join(p, "Python.h")):
found = True
break
if not found:
print "Python.h not found, not building python extension"
return
if dev.is_win32():
env['SHLIBSUFFIX'] ='.pyd'
pyd = env.SharedLibrary(target, sources, SHLIBPREFIX='')
targets.append(pyd)
def buildLuaModule(lib,mod,plugin):
env, target, sources = dev.prepare_build(source_path, lib, mod)
env['SWIGOUTDIR'] = Dir(dev.get_build_path('bin'))
env.Append(SWIGFLAGS=['-c++','-Wall','-lua'])
env.Append(LIBS = ['adchpp'])
if (dev.is_win32() or env['PLATFORM'] == 'cygwin') and 'Bloom' in dev.env['plugins']:
env.Append(LIBS = ['Bloom'])
env.Append(CPPPATH=['#'])
# We assume the lua from the script plugin will be used...
setLuaEnv(env)
if dev.is_win32():
env.Append(CPPDEFINES=['LUA_BUILD_AS_DLL=1'])
else:
env.Append(CPPDEFINES=['LUA_USE_LINUX=1'])
# on x64, SWIG includes some unsafe pointer conversions that the compiler of course disallows...
if 'gcc' in env['TOOLS'] and env['arch'] == 'x64':
env.Append(CPPFLAGS = ['-fpermissive'])
if plugin:
env.Replace(UNDEF = '')
luadchpp = env.SharedLibrary(target, sources, SHLIBPREFIX='')
targets.append(luadchpp)
def buildPHPModule():
env, target, sources = dev.prepare_build(source_path, 'php_adchpp', 'php.i')
if not dev.is_win32():
print 'No Linux support for PHP extensions yet'
# TODO add Linux support (see TODO below)
return
php_path = '#/php/'
if env['arch'] != 'x86':
php_path = php_path + env['arch'] + '/'
if dev.is_win32():
if env['CC'] == 'cl': # MSVC
if not os.path.exists(env.File(php_path + 'lib/php5.lib').abspath):
print 'No php5.lib file, skipping PHP'
return
else:
print 'Skipping the PHP module, use MSVC or Linux'
return
bin_dir = dev.get_build_path('bin')
env['SWIGOUTDIR'] = Dir(bin_dir)
env.Append(SWIGFLAGS = ['-c++', '-Wall', '-php'])
env.Append(CPPPATH = ['#', bin_dir])
env.Append(LIBS = ['adchpp'])
if dev.is_win32():
env.Append(CPPPATH = [php_path + 'include/', php_path + 'include/main/', php_path + 'include/TSRM/', php_path + 'include/Zend/'])
env.Append(CPPDEFINES = ['WIN32', 'PHP_WIN32=1', 'ZEND_WIN32=1', 'PHP_DEBUG=0', 'ZEND_DEBUG=0', '_USE_32BIT_TIME_T=1'])
env.Append(LIBPATH = [php_path + 'lib/'])
env.Append(LIBS = ['php5'])
else:
pass # TODO run "php-config --includes"
php_adchpp = env.SharedLibrary(target, sources, SHLIBPREFIX='')
targets.append(php_adchpp)
if 'ruby' in dev.env['langs']:
buildRbModule()
if 'python' in dev.env['langs']:
if dev.env['PLATFORM'] == 'win32' and dev.env['arch'] != 'x86':
print 'Skipping Python module because build platform is Windows and ARCH != x86'
else:
buildPyModule()
if 'lua' in dev.env['langs']:
buildLuaModule('luadchpp','lua.i',False)
if 'Bloom' in dev.env['plugins']:
buildLuaModule('luadchppbloom','bloom.i',True)
# TODO buildPHPModule()
Return('targets')