File: SConscript

package info (click to toggle)
woo 1.0%2Bdfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 29,812 kB
  • ctags: 10,227
  • sloc: cpp: 48,664; python: 20,469; sh: 201; makefile: 39
file content (143 lines) | stat: -rw-r--r-- 5,500 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# encoding: utf-8
# vim: set filetype=python:
Import('*')

import os.path,re,sys

pyModules=[]
pyObjects=[]
pySharedObject='$LIBDIR/woo/_cxxInternal%s%s.so'%(env['cxxFlavor'],('_debug' if env['debug'] else ''))

# we need relative paths here, to keep buildDir
pkgSrcs=[os.path.relpath(str(s),env.Dir('#').abspath) for s in env.Glob('pkg/*.cpp')+env.Glob('pkg/*/*.cpp')+env.Glob('pkg/*/*/*.cpp')]
## compile hotPlugs separately
hotPlugins=[s for s in pkgSrcs if os.path.basename(s[:-4]) in env['hotPlugins']]
pyObjects+=[env.SharedObject(s) for s in pkgSrcs if s in hotPlugins]
# and remove them from pkgSrcs
pkgSrcs=[s for s in pkgSrcs if s not in hotPlugins]
#
# handle chunkSize here
chunkSize=env['chunkSize']
if chunkSize==1: pass  # compile each seaparately
if chunkSize<=0 or len(pkgSrcs)<chunkSize: pkgSrcs=[env.CombineWrapper('$buildDir/pkg.cpp',pkgSrcs)] # compile all together
else: # compile by chunks
	# thanks to http://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized-chunks-in-python :
	pkgSrcs=[env.CombineWrapper('$buildDir/pkg-%d.cpp'%j,pkgSrcs[i:i+chunkSize]) for j,i in enumerate(range(0,len(pkgSrcs),chunkSize))]
pyObjects+=[env.SharedObject(s) for s in pkgSrcs]


## LIB
pyObjects.append(
	env.SharedObject('woo-support',
		## ['voro++/voro++.cc']+ # included directly in sources, due to templates
		env.Combine('woo-support.cpp',env.Glob('lib/*/*.cpp'))
	)
)
## CORE
pyObjects.append(env.SharedObject('core',env.Combine('core.cpp',env.Glob('core/*.cpp'))))
## PY
pyObjects+=[env.SharedObject(f) for f in env.Glob('py/*.cpp')+env.Glob('py/*/*.cpp')]
## CONFIG
pyObjects.append(env.SharedObject('config','py/config.cxx',
	CPPDEFINES=env['CPPDEFINES']+[
		('WOO_REVISION',env['realVersion']),
		('WOO_VERSION',env['version']),
		('WOO_SOURCE_ROOT',env['sourceRoot']),
		('WOO_BUILD_ROOT',env['buildDir']),
		('WOO_FLAVOR',env['flavor']),
		('WOO_SCONS_PATH',os.path.abspath(sys.argv[0]))
	]
))

if 'qt4' in env['features']:
	pyObjects+=['gui/qt4/GLViewer.cpp','gui/qt4/GLViewer.qrc','gui/qt4/_GLViewer.cpp','gui/qt4/OpenGLManager.cpp']

if 'gts' in env['features']:
	# HACK HACK HACK!!!
	# this is VERY ugly, but we need resolve those symbols for ourselves
	# so we basically have the same lib twice
	pyObjects+=[env.SharedObject(f) for f in env.Glob('py/3rd-party/pygts-0.3.1/*.cpp')]
	env.Install('$LIBDIR/woo/gts',[
		env.File('py/3rd-party/pygts-0.3.1/__init__.py'),
		env.File('py/3rd-party/pygts-0.3.1/pygts.py'),
		# this module is faked in py/__init__.py
		# env.SharedLibrary('_gts',env.Glob('py/3rd-party/pygts-0.3.1/*.c'),SHLIBPREFIX='',LIBS=['gts'])
	])


#
# install shared lib
#
env.Install(
env.SharedLibrary(pySharedObject,pyObjects,
	SHLIBPREFIX='',
	LIBS=['dl','m','rt']+env['LIBS']+(['glut','GL','GLU']+[env['QGLVIEWER_LIB']] if 'opengl' in env['features'] else []),CXXFLAGS=env['CXXFLAGS']+['-fPIC']
))

#
# EXECUTABLES HERE
#
import sys
pyMain='$EXECDIR/woo'+('-'+env['flavor'] if env['flavor'] else '')
env.InstallAs(pyMain,env.Textfile('main.py','#!%s\nimport wooMain,sys; sys.exit(wooMain.main())\n'%sys.executable))
env.InstallAs(pyMain+'-batch',env.Textfile('batch.py','#!%s\nimport wooMain,sys; sys.exit(wooMain.batch())\n'%sys.executable))
env.AddPostAction(pyMain,Chmod(pyMain,0755))
env.AddPostAction(pyMain+'-batch',Chmod(pyMain+'-batch',0755))

env.Install('$LIBDIR','core/main/wooMain.py')
## for --rebuild
if 'execCheck' in env and env['execCheck']!=os.path.abspath(env.subst(pyMain)):
	raise RuntimeError('execCheck option (%s) does not match what is about to be installed (%s)'%(env['execCheck'],env.subst(pyMain)))


env.Install('$LIBDIR/woo',[
	env.File(env.Glob('py/*.py')),
])
env.Install('$LIBDIR/woo/tests',[env.File(env.Glob('py/tests/*.py'),'tests'),])
env.Install('$LIBDIR/woo/pre',[env.File(env.Glob('py/pre/*.py'),'pre'),])
env.Install('$LIBDIR/woo/_monkey',[env.File(env.Glob('py/_monkey/*.py'),'_monkey')])

# install any locally-linked extra modules
# using their respective setup.py
import subprocess, sys
setups=[str(s) for s in env.Glob('wooExtra/*/setup.py')]
if setups:
	print 'Running setup.py (parallel):',' '.join([os.path.dirname(s) for s in setups])

# http://stackoverflow.com/a/23616229/761090
pp=[subprocess.Popen([sys.executable,os.path.abspath(s),'--quiet','install'],cwd=os.path.dirname(s)) for s in setups]
exits=[p.wait() for p in pp]
if sum(exits)>0:
	print 'Error running:','. '.join([setups[i] for i,e in enumerate(exits) if e>0])
	sys.exit(1)



if 'qt4' in env['features']:
	env.Install('$LIBDIR/woo/qt',[
		env.Glob('gui/qt4/*.py'),
		# mention generated files explicitly			
		env.File('gui/qt4/img_rc.py'),
		env.File('gui/qt4/ui_controller.py'),
	])
	env.Command('gui/qt4/img_rc.py','gui/qt4/img.qrc','pyrcc4 -o $buildDir/gui/qt4/img_rc.py gui/qt4/img.qrc')
	env.Command('gui/qt4/ui_controller.py','gui/qt4/controller.ui','pyuic4 -o $buildDir/gui/qt4/ui_controller.py gui/qt4/controller.ui')

# install .egg-info so that pkg_resources work with woo when installed via scons
# http://svn.python.org/projects/sandbox/trunk/setuptools/doc/formats.txt
env.Install('$LIBDIR',[env.Textfile('woo.egg-info','''
Metadata-Version: 1.1
Name: woo
Version: {version}
Summary: Discrete dynamic compuations, especially granular mechanics.
Home-page: http://www.woodem.eu
Author: Václav Šmilauer
Author-email: eu@doxos.eu
'''.format(version=env['realVersion']))])

# install data files
# accessible through pkg_resources
env.Install('$LIBDIR/woo/data',[env.File(env.Glob('py/data/*'))])