224 lines
5.9 KiB
Python
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')
|