mirror of
https://github.com/UberGames/GtkRadiant.git
synced 2024-11-24 21:01:24 +00:00
get the basics of a new scons build system together
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/ZeroRadiant@179 8a3a26a2-13c4-0310-b231-cf6edde360e5
This commit is contained in:
parent
8037810110
commit
ff588a439f
11 changed files with 498 additions and 1175 deletions
839
SConscript
839
SConscript
|
@ -1,839 +0,0 @@
|
|||
import os, sys, commands, string
|
||||
from makeversion import get_version
|
||||
# OS Detection:
|
||||
OS = commands.getoutput('uname')
|
||||
|
||||
Import('GLOBALS')
|
||||
Import(GLOBALS)
|
||||
|
||||
# make scons link shared libs against static libs
|
||||
g_env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
|
||||
|
||||
# make gcc accept default parameters in function typedefs
|
||||
g_env['CXXFLAGS'] += '-fpermissive '
|
||||
|
||||
g_env['CXXFLAGS'] += '-fPIC '
|
||||
g_env['CCFLAGS'] += '-fPIC '
|
||||
|
||||
def build_list(s_prefix, s_string):
|
||||
s_list = Split(s_string)
|
||||
for i in range(len(s_list)):
|
||||
s_list[i] = s_prefix + '/' + s_list[i]
|
||||
return s_list
|
||||
|
||||
# common code ------------------------------------------------------
|
||||
|
||||
cmdlib_lib = g_env.StaticLibrary(target='libs/cmdlib', source='libs/cmdlib/cmdlib.cpp')
|
||||
|
||||
|
||||
mathlib_src = 'mathlib.c bbox.c linear.c m4x4.c ray.c'
|
||||
mathlib_lib = g_env.StaticLibrary(target='libs/mathlib', source=build_list('libs/mathlib', mathlib_src))
|
||||
|
||||
|
||||
md5lib_lib = g_env.StaticLibrary(target='libs/md5lib', source='libs/md5lib/md5lib.c')
|
||||
|
||||
|
||||
ddslib_lib = g_env.StaticLibrary(target='libs/ddslib', source='libs/ddslib/ddslib.c')
|
||||
|
||||
|
||||
jpeg_env = g_env.Copy()
|
||||
jpeg_env.Prepend(CPPPATH = 'libs/jpeg6')
|
||||
jpeg_src = 'jcomapi.cpp jdcoefct.cpp jdinput.cpp jdpostct.cpp jfdctflt.cpp jpgload.cpp jdapimin.cpp jdcolor.cpp jdmainct.cpp jdsample.cpp jidctflt.cpp jutils.cpp jdapistd.cpp jddctmgr.cpp jdmarker.cpp jdtrans.cpp jmemmgr.cpp jdatasrc.cpp jdhuff.cpp jdmaster.cpp jerror.cpp jmemnobs.cpp'
|
||||
jpeg_lib = jpeg_env.StaticLibrary(target='libs/jpeg', source=build_list('libs/jpeg6', jpeg_src))
|
||||
|
||||
|
||||
net_lib = g_env.StaticLibrary(target='libs/l_net', source=['libs/l_net/l_net.c', 'libs/l_net/l_net_berkley.c'])
|
||||
|
||||
|
||||
picomodel_src = 'picointernal.c picomodel.c picomodules.c pm_3ds.c pm_ase.c pm_md3.c pm_obj.c\
|
||||
pm_ms3d.c pm_mdc.c pm_fm.c pm_md2.c pm_lwo.c lwo/clip.c lwo/envelope.c lwo/list.c lwo/lwio.c\
|
||||
lwo/lwo2.c lwo/lwob.c lwo/pntspols.c lwo/surface.c lwo/vecmath.c lwo/vmap.c'
|
||||
picomodel_lib = g_env.StaticLibrary(target='libs/picomodel', source=build_list('libs/picomodel', picomodel_src))
|
||||
|
||||
|
||||
synapse_env = g_env.Copy()
|
||||
synapse_env.useGlib2()
|
||||
synapse_env.useXML2()
|
||||
synapse_env['CPPPATH'].append('include')
|
||||
synapse_src = 'synapse.cpp'
|
||||
synapse_lib = synapse_env.StaticLibrary(target='libs/synapse', source=build_list('libs/synapse', synapse_src))
|
||||
# scons 0.95. Doesn't recognize archive compatible for dynamic modules
|
||||
# see thread: http://scons.tigris.org/servlets/BrowseList?listName=users&by=thread&from=168952&to=168952&first=1&count=2
|
||||
|
||||
|
||||
splines_env = g_env.Copy()
|
||||
splines_src = build_list('libs/splines',
|
||||
'math_angles.cpp math_matrix.cpp math_quaternion.cpp math_vector.cpp q_parse.cpp q_shared.cpp splines.cpp util_str.cpp')
|
||||
splines_env['CPPPATH'].append('include')
|
||||
splines_lib = splines_env.StaticLibrary(target='libs/splines', source=splines_src)
|
||||
|
||||
|
||||
# end static / common libraries ---------------------------------------------------
|
||||
|
||||
# q3map ---------------------------------------------------------------------------
|
||||
|
||||
q3map_env = g_env.Copy()
|
||||
q3map_env['CPPPATH'].append('include')
|
||||
q3map_env.useXML2()
|
||||
q3map_env.useGlib2()
|
||||
q3map_env.usePNG()
|
||||
q3map_env.usePThread()
|
||||
q3map_env.Prepend(CPPPATH='tools/quake3/common')
|
||||
|
||||
q3map_common_src = [
|
||||
'common/cmdlib.c',
|
||||
'common/imagelib.c',
|
||||
'common/inout.c',
|
||||
'common/mutex.c',
|
||||
'common/polylib.c',
|
||||
'common/scriplib.c',
|
||||
'common/threads.c',
|
||||
'common/unzip.c',
|
||||
'common/vfs.c' ]
|
||||
|
||||
q3map_src = [
|
||||
'q3map2/brush.c',
|
||||
'q3map2/brush_primit.c',
|
||||
'q3map2/bsp.c',
|
||||
'q3map2/facebsp.c',
|
||||
'q3map2/fog.c',
|
||||
'q3map2/leakfile.c',
|
||||
'q3map2/map.c',
|
||||
'q3map2/model.c',
|
||||
'q3map2/patch.c',
|
||||
'q3map2/portals.c',
|
||||
'q3map2/prtfile.c',
|
||||
'q3map2/surface.c',
|
||||
'q3map2/surface_fur.c',
|
||||
'q3map2/surface_meta.c',
|
||||
'q3map2/tjunction.c',
|
||||
'q3map2/tree.c',
|
||||
'q3map2/writebsp.c',
|
||||
'q3map2/image.c',
|
||||
'q3map2/light.c',
|
||||
'q3map2/light_bounce.c',
|
||||
'q3map2/light_trace.c',
|
||||
'q3map2/light_ydnar.c',
|
||||
'q3map2/lightmaps_ydnar.c',
|
||||
'q3map2/vis.c',
|
||||
'q3map2/visflow.c',
|
||||
'q3map2/bspfile_abstract.c',
|
||||
'q3map2/bspfile_ibsp.c',
|
||||
'q3map2/bspfile_rbsp.c',
|
||||
'q3map2/decals.c',
|
||||
'q3map2/main.c',
|
||||
'q3map2/mesh.c',
|
||||
'q3map2/path_init.c',
|
||||
'q3map2/shaders.c',
|
||||
'q3map2/surface_extra.c',
|
||||
'q3map2/surface_foliage.c',
|
||||
'q3map2/convert_ase.c',
|
||||
'q3map2/convert_map.c' ]
|
||||
|
||||
q3map_full_src = [ ]
|
||||
for i in q3map_common_src + q3map_src:
|
||||
q3map_full_src.append('tools/quake3/' + i)
|
||||
|
||||
q3map_full_src.append('libs/libmathlib.a')
|
||||
q3map_full_src.append('libs/libl_net.a')
|
||||
q3map_full_src.append('libs/libjpeg.a')
|
||||
q3map_full_src.append('libs/libpicomodel.a')
|
||||
q3map_full_src.append('libs/libmd5lib.a')
|
||||
q3map_full_src.append('libs/libddslib.a')
|
||||
|
||||
q3map_env.Program(target='q3map2.' + g_cpu, source=q3map_full_src )
|
||||
q3map_env.Install(INSTALL, 'q3map2.' + g_cpu)
|
||||
|
||||
# end q3map2 ----------------------------------------------------------------------
|
||||
|
||||
# q3data ---------------------------------------------------------------------------
|
||||
|
||||
q3data_env = q3map_env.Copy()
|
||||
|
||||
q3data_common_src = [
|
||||
'common/aselib.c',
|
||||
'common/bspfile.c',
|
||||
'common/cmdlib.c',
|
||||
'common/imagelib.c',
|
||||
'common/inout.c',
|
||||
'common/scriplib.c',
|
||||
'common/trilib.c',
|
||||
'common/unzip.c',
|
||||
'common/vfs.c'
|
||||
]
|
||||
|
||||
q3data_src = [
|
||||
'q3data/3dslib.c',
|
||||
'q3data/compress.c',
|
||||
'q3data/images.c',
|
||||
'q3data/md3lib.c',
|
||||
'q3data/models.c',
|
||||
'q3data/p3dlib.c',
|
||||
'q3data/polyset.c',
|
||||
'q3data/q3data.c',
|
||||
'q3data/stripper.c',
|
||||
'q3data/video.c' ]
|
||||
|
||||
q3data_full_src = [ ]
|
||||
for i in q3data_common_src + q3data_src:
|
||||
q3data_full_src.append('tools/quake3/' + i)
|
||||
|
||||
q3data_full_src.append('libs/libmathlib.a')
|
||||
q3data_full_src.append('libs/libl_net.a')
|
||||
|
||||
q3data_env.Program( target = 'q3data.' + g_cpu, source = q3data_full_src )
|
||||
q3data_env.Install( INSTALL, 'q3data.' + g_cpu )
|
||||
|
||||
# end q3data ----------------------------------------------------------------------
|
||||
|
||||
# q2_tools ---------------------------------------------------------------------------
|
||||
|
||||
q2_tools_env = g_env.Copy()
|
||||
q2_tools_env['CPPPATH'].append('include')
|
||||
q2_tools_env.useXML2()
|
||||
q2_tools_env.usePThread()
|
||||
q2_tools_env.Prepend(CPPPATH='tools/quake2/common')
|
||||
|
||||
q2_tools_common_src = [
|
||||
'common/bspfile.c',
|
||||
'common/cmdlib.c',
|
||||
'common/inout.c',
|
||||
'common/l3dslib.c',
|
||||
'common/lbmlib.c',
|
||||
'common/mathlib.c',
|
||||
'common/path_init.c',
|
||||
'common/polylib.c',
|
||||
'common/scriplib.c',
|
||||
'common/threads.c',
|
||||
'common/trilib.c'
|
||||
]
|
||||
|
||||
|
||||
q2_tools_q2map_src = [
|
||||
'q2map/brushbsp.c',
|
||||
'q2map/csg.c',
|
||||
'q2map/faces.c',
|
||||
'q2map/flow.c',
|
||||
'q2map/glfile.c',
|
||||
'q2map/leakfile.c',
|
||||
'q2map/lightmap.c',
|
||||
'q2map/main.c',
|
||||
'q2map/map.c',
|
||||
'q2map/nodraw.c',
|
||||
'q2map/patches.c',
|
||||
'q2map/portals.c',
|
||||
'q2map/prtfile.c',
|
||||
'q2map/qbsp.c',
|
||||
'q2map/qrad.c',
|
||||
'q2map/qvis.c',
|
||||
'q2map/textures.c',
|
||||
'q2map/trace.c',
|
||||
'q2map/tree.c',
|
||||
'q2map/writebsp.c'
|
||||
]
|
||||
|
||||
q2_tools_qdata3_common_src = [
|
||||
'common/bspfile.c',
|
||||
'common/cmdlib.c',
|
||||
'common/inout.c',
|
||||
'common/l3dslib.c',
|
||||
'common/lbmlib.c',
|
||||
'common/mathlib.c',
|
||||
'common/path_init.c',
|
||||
'common/scriplib.c',
|
||||
'common/threads.c',
|
||||
'common/trilib.c'
|
||||
]
|
||||
|
||||
q2_tools_qdata3_src = [
|
||||
'qdata/images.c',
|
||||
'qdata/models.c',
|
||||
'qdata/qdata.c',
|
||||
'qdata/sprites.c',
|
||||
'qdata/tables.c',
|
||||
'qdata/video.c'
|
||||
]
|
||||
|
||||
q2_tools_q2map_full_src = [ ]
|
||||
for i in q2_tools_common_src + q2_tools_q2map_src:
|
||||
q2_tools_q2map_full_src.append('tools/quake2/' + i)
|
||||
|
||||
q2_tools_q2map_full_src.append('libs/libl_net.a')
|
||||
|
||||
q2_tools_qdata3_full_src = [ ]
|
||||
for i in q2_tools_common_src + q2_tools_qdata3_src:
|
||||
q2_tools_qdata3_full_src.append('tools/quake2/' + i)
|
||||
|
||||
q2_tools_qdata3_full_src.append('libs/libl_net.a')
|
||||
|
||||
if ( OS != 'Darwin' ):
|
||||
q2_tools_env.Program(target='quake2_tools/q2map', source=q2_tools_q2map_full_src )
|
||||
q2_tools_env.Install(INSTALL + '/q2', 'quake2_tools/q2map' )
|
||||
|
||||
q2_tools_env.Program(target='quake2_tools/qdata3', source=q2_tools_qdata3_full_src )
|
||||
q2_tools_env.Install(INSTALL + '/q2', 'quake2_tools/qdata3' )
|
||||
|
||||
|
||||
# end q2_tools ----------------------------------------------------------------------
|
||||
|
||||
# qdata3_heretic2 ---------------------------------------------------------------------------
|
||||
|
||||
heretic2_tools_env = g_env.Copy()
|
||||
heretic2_tools_env['CPPPATH'].append('include')
|
||||
heretic2_tools_env.useXML2()
|
||||
heretic2_tools_env.usePThread()
|
||||
heretic2_tools_env.Prepend(CPPPATH='tools/quake2/qdata_heretic2')
|
||||
heretic2_tools_env.Prepend(CPPPATH='tools/quake2/qdata_heretic2/qcommon')
|
||||
heretic2_tools_env.Prepend(CPPPATH='tools/quake2/qdata_heretic2/common')
|
||||
|
||||
heretic2_tools_qdata3_common_src = [
|
||||
'qdata_heretic2/common/bspfile.c',
|
||||
'qdata_heretic2/common/cmdlib.c',
|
||||
'qdata_heretic2/common/inout.c',
|
||||
'qdata_heretic2/common/l3dslib.c',
|
||||
'qdata_heretic2/common/lbmlib.c',
|
||||
'qdata_heretic2/common/mathlib.c',
|
||||
'qdata_heretic2/common/path_init.c',
|
||||
'qdata_heretic2/common/qfiles.c',
|
||||
'qdata_heretic2/common/scriplib.c',
|
||||
'qdata_heretic2/common/threads.c',
|
||||
'qdata_heretic2/common/token.c',
|
||||
'qdata_heretic2/common/trilib.c'
|
||||
]
|
||||
|
||||
heretic2_tools_qdata3_qcommon_src = [
|
||||
'qdata_heretic2/qcommon/reference.c',
|
||||
'qdata_heretic2/qcommon/resourcemanager.c',
|
||||
'qdata_heretic2/qcommon/skeletons.c'
|
||||
]
|
||||
|
||||
heretic2_tools_qdata3_src = [
|
||||
'qdata_heretic2/animcomp.c',
|
||||
'qdata_heretic2/book.c',
|
||||
'qdata_heretic2/fmodels.c',
|
||||
'qdata_heretic2/images.c',
|
||||
'qdata_heretic2/jointed.c',
|
||||
'qdata_heretic2/models.c',
|
||||
'qdata_heretic2/pics.c',
|
||||
'qdata_heretic2/qdata.c',
|
||||
'qdata_heretic2/qd_skeletons.c',
|
||||
'qdata_heretic2/sprites.c',
|
||||
'qdata_heretic2/svdcmp.c',
|
||||
'qdata_heretic2/tables.c',
|
||||
'qdata_heretic2/tmix.c',
|
||||
'qdata_heretic2/video.c'
|
||||
]
|
||||
|
||||
heretic2_tools_qdata3_full_src = [ ]
|
||||
for i in heretic2_tools_qdata3_common_src + heretic2_tools_qdata3_qcommon_src + heretic2_tools_qdata3_src:
|
||||
heretic2_tools_qdata3_full_src.append('tools/quake2/' + i)
|
||||
|
||||
heretic2_tools_qdata3_full_src.append('libs/libl_net.a')
|
||||
|
||||
heretic2_tools_env['CCFLAGS'] += '-D_LINUX '
|
||||
|
||||
if ( OS != 'Darwin' ):
|
||||
heretic2_tools_env.Program(target='heretic2_tools/qdata3', source=heretic2_tools_qdata3_full_src )
|
||||
heretic2_tools_env.Install(INSTALL + '/heretic2', 'heretic2_tools/qdata3' )
|
||||
|
||||
heretic2_q2map_env = q2_tools_env
|
||||
heretic2_q2map_env.Install(INSTALL + '/heretic2', 'quake2_tools/q2map' )
|
||||
|
||||
# end heretic2_tools ----------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
# radiant, modules and plugins ----------------------------------------------------
|
||||
|
||||
module_env = g_env.Copy()
|
||||
module_env['CPPPATH'].append('include')
|
||||
if ( OS == 'Darwin' ):
|
||||
module_env['LINKFLAGS'] += '-dynamiclib -ldl '
|
||||
else:
|
||||
module_env['LINKFLAGS'] += '-ldl '
|
||||
module_env['LIBPREFIX'] = ''
|
||||
module_env.useGlib2()
|
||||
module_env.useXML2()
|
||||
|
||||
module_env.SharedLibrarySafe(target='fgd', source=['plugins/eclassfgd/plugin.cpp', 'libs/libsynapse.a'])
|
||||
module_env.Install(INSTALL + '/modules', 'fgd.so')
|
||||
|
||||
vfspk3_lst=build_list('plugins/vfspk3', 'vfspk3.cpp vfs.cpp unzip.cpp')
|
||||
vfspk3_lst.append('libs/libsynapse.a')
|
||||
module_env.SharedLibrarySafe(target='vfspk3', source=vfspk3_lst)
|
||||
module_env.Install(INSTALL + '/modules', 'vfspk3.so')
|
||||
|
||||
vfswad_lst=build_list('plugins/vfswad', 'unwad.cpp vfs.cpp vfswad.cpp')
|
||||
vfswad_lst.append('libs/libsynapse.a')
|
||||
module_env.SharedLibrarySafe(target='vfswad', source=vfswad_lst)
|
||||
module_env.Install(INSTALL + '/modules', 'vfswad.so')
|
||||
|
||||
vfspak_lst=build_list('plugins/vfspak', 'vfspak.cpp vfs.cpp')
|
||||
vfspak_lst.append('libs/libsynapse.a')
|
||||
module_env.SharedLibrarySafe(target='vfspak', source=vfspak_lst)
|
||||
module_env.Install(INSTALL + '/q2/modules', 'vfspak.so')
|
||||
module_env.Install(INSTALL + '/heretic2/modules', 'vfspak.so')
|
||||
|
||||
shaders_lst=build_list('plugins/shaders', 'shaders.cpp plugin.cpp')
|
||||
shaders_lst.append('libs/libsynapse.a')
|
||||
module_env.SharedLibrarySafe(target='shaders', source=shaders_lst)
|
||||
module_env.Install(INSTALL + '/modules', 'shaders.so')
|
||||
|
||||
image_lst=build_list('plugins/image', 'jpeg.cpp image.cpp lbmlib.cpp')
|
||||
image_lst.append('libs/libsynapse.a')
|
||||
image_lst.append('libs/libjpeg.a')
|
||||
module_env.SharedLibrarySafe(target='image', source=image_lst)
|
||||
module_env.Install(INSTALL + '/modules', 'image.so')
|
||||
|
||||
imagewal_lst=build_list('plugins/imagewal', 'wal.cpp imagewal.cpp')
|
||||
imagewal_lst.append('libs/libsynapse.a')
|
||||
module_env.SharedLibrarySafe(target='imagewal', source=imagewal_lst)
|
||||
module_env.Install(INSTALL + '/q2/modules', 'imagewal.so')
|
||||
|
||||
imagem8_lst=build_list('plugins/imagem8', 'm8.cpp m32.cpp imagem8.cpp')
|
||||
imagem8_lst.append('libs/libsynapse.a')
|
||||
module_env.SharedLibrarySafe(target='imagem8', source=imagem8_lst)
|
||||
module_env.Install(INSTALL + '/heretic2/modules', 'imagem8.so')
|
||||
|
||||
imagehl_lst=build_list('plugins/imagehl', 'imagehl.cpp lbmlib.cpp')
|
||||
imagehl_lst.append('libs/libsynapse.a')
|
||||
module_env.SharedLibrarySafe(target='imagehl', source=imagehl_lst)
|
||||
module_env.Install(INSTALL + '/modules', 'imagehl.so')
|
||||
|
||||
imagepng_lst=build_list('plugins/imagepng', 'plugin.cpp')
|
||||
imagepng_lst.append('libs/libsynapse.a')
|
||||
module_env.usePNG()
|
||||
module_env.SharedLibrarySafe(target='imagepng', source=imagepng_lst)
|
||||
module_env.Install(INSTALL + '/modules', 'imagepng.so')
|
||||
|
||||
map_lst=build_list('plugins/map', 'plugin.cpp parse.cpp write.cpp')
|
||||
map_lst.append('libs/libsynapse.a')
|
||||
map_lst.append('libs/libcmdlib.a')
|
||||
module_env.SharedLibrarySafe(target='map', source=map_lst)
|
||||
module_env.Install(INSTALL + '/modules', 'map.so')
|
||||
|
||||
mapxml_lst=build_list('plugins/mapxml', 'plugin.cpp xmlparse.cpp xmlwrite.cpp')
|
||||
mapxml_lst.append('libs/libsynapse.a')
|
||||
module_env.SharedLibrarySafe(target='mapxml', source=mapxml_lst)
|
||||
module_env.Install(INSTALL + '/modules', 'mapxml.so')
|
||||
|
||||
model_lst=build_list('plugins/model', 'plugin.cpp model.cpp cpicomodel.cpp cpicosurface.cpp remap.cpp')
|
||||
model_lst.append('libs/libsynapse.a')
|
||||
model_lst.append('libs/libpicomodel.a')
|
||||
model_lst.append('libs/libmathlib.a')
|
||||
module_env.SharedLibrarySafe(target='model', source=model_lst)
|
||||
module_env.Install(INSTALL + '/modules', 'model.so')
|
||||
|
||||
entity_lst = build_list('plugins/entity', 'plugin.cpp entity_entitymodel.cpp miscmodel.cpp eclassmodel.cpp entity.cpp light.cpp')
|
||||
entity_lst.append('libs/libsynapse.a')
|
||||
entity_lst.append('libs/libmathlib.a')
|
||||
module_env.SharedLibrarySafe(target='entity', source=entity_lst)
|
||||
module_env.Install(INSTALL + '/modules', 'entity.so')
|
||||
|
||||
bob_env = module_env.Copy()
|
||||
bob_env.useGtk2()
|
||||
bob_lst = build_list('contrib/bobtoolz/',
|
||||
'dialogs/dialogs-gtk.cpp bobToolz-GTK.cpp bsploader.cpp cportals.cpp DBobView.cpp \
|
||||
DBrush.cpp DEntity.cpp DEPair.cpp DListener.cpp DMap.cpp DPatch.cpp DPlane.cpp DPoint.cpp \
|
||||
DShape.cpp DTrainDrawer.cpp DTreePlanter.cpp DVisDrawer.cpp DWinding.cpp funchandlers-GTK.cpp \
|
||||
lists.cpp misc.cpp ScriptParser.cpp shapes.cpp visfind.cpp')
|
||||
bob_lst.append('libs/libsynapse.a')
|
||||
bob_lst.append('libs/libmathlib.a')
|
||||
bob_lst.append('libs/libcmdlib.a')
|
||||
bob_env['CPPPATH'].append('contrib/bobtoolz/dialogs')
|
||||
bob_env.SharedLibrarySafe(target='bobtoolz', source=bob_lst)
|
||||
bob_env.Install(INSTALL + '/plugins', 'bobtoolz.so')
|
||||
|
||||
camera_lst = build_list('contrib/camera',
|
||||
'camera.cpp dialogs.cpp dialogs_common.cpp funchandlers.cpp listener.cpp misc.cpp renderer.cpp')
|
||||
camera_lst.append('libs/libsynapse.a')
|
||||
camera_lst.append('libs/libsplines.a')
|
||||
bob_env.SharedLibrarySafe(target='camera', source=camera_lst)
|
||||
bob_env.Install(INSTALL + '/plugins', 'camera.so')
|
||||
|
||||
prtview_lst = build_list('contrib/prtview',
|
||||
'AboutDialog.cpp ConfigDialog.cpp LoadPortalFileDialog.cpp portals.cpp prtview.cpp')
|
||||
prtview_lst.append('libs/libsynapse.a')
|
||||
prtview_env = bob_env.Copy()
|
||||
prtview_env['CXXFLAGS'] += '-DGTK_PLUGIN '
|
||||
prtview_env.SharedLibrarySafe(target='prtview', source=prtview_lst)
|
||||
prtview_env.Install(INSTALL + '/plugins', 'prtview.so')
|
||||
|
||||
gensurf_lst = build_list('contrib/gtkgensurf',
|
||||
'bitmap.cpp dec.cpp face.cpp font.cpp gendlgs.cpp genmap.cpp gensurf.cpp heretic.cpp plugin.cpp view.cpp triangle.c')
|
||||
gensurf_lst.append('libs/libsynapse.a')
|
||||
bob_env.SharedLibrarySafe(target='gensurf', source=gensurf_lst)
|
||||
bob_env.Install(INSTALL + '/plugins', 'gensurf.so')
|
||||
|
||||
surface_lst = build_list('plugins/surface', 'surfdlg_plugin.cpp surfacedialog.cpp')
|
||||
surface_lst.append('libs/libsynapse.a')
|
||||
surface_lst.append('libs/libmathlib.a')
|
||||
surface_env = module_env.Copy()
|
||||
surface_env.useGtk2()
|
||||
surface_env.SharedLibrarySafe(target='surface', source=surface_lst)
|
||||
surface_env.Install(INSTALL + '/modules', 'surface.so')
|
||||
|
||||
surface_quake2_lst = build_list('plugins/surface_quake2', 'surfdlg_plugin.cpp surfacedialog.cpp surfaceflagsdialog_quake2.cpp')
|
||||
surface_quake2_lst.append('libs/libsynapse.a')
|
||||
surface_quake2_lst.append('libs/libmathlib.a')
|
||||
surface_quake2_env = module_env.Copy()
|
||||
surface_quake2_env.useGtk2()
|
||||
surface_quake2_env.SharedLibrarySafe(target='surface_quake2', source=surface_quake2_lst)
|
||||
surface_quake2_env.Install(INSTALL + '/q2/modules', 'surface_quake2.so')
|
||||
|
||||
surface_heretic2_lst = build_list('plugins/surface_heretic2', 'surfdlg_plugin.cpp surfacedialog.cpp surfaceflagsdialog_heretic2.cpp')
|
||||
surface_heretic2_lst.append('libs/libsynapse.a')
|
||||
surface_heretic2_lst.append('libs/libmathlib.a')
|
||||
surface_heretic2_env = module_env.Copy()
|
||||
surface_heretic2_env.useGtk2()
|
||||
surface_heretic2_env.SharedLibrarySafe(target='surface_heretic2', source=surface_heretic2_lst)
|
||||
surface_heretic2_env.Install(INSTALL + '/heretic2/modules', 'surface_heretic2.so')
|
||||
|
||||
bkgrnd2d_list = build_list( 'contrib/bkgrnd2d', 'bkgrnd2d.cpp plugin.cpp dialog.cpp' )
|
||||
bkgrnd2d_list.append( 'libs/libsynapse.a' )
|
||||
bkgrnd2d_env = module_env.Copy()
|
||||
bkgrnd2d_env.useGtk2()
|
||||
bkgrnd2d_env.SharedLibrarySafe( target='bkgrnd2d', source=bkgrnd2d_list )
|
||||
bkgrnd2d_env.Install( INSTALL + '/plugins', 'bkgrnd2d.so' )
|
||||
|
||||
radiant_env = g_env.Copy()
|
||||
radiant_env['CPPPATH'].append('include')
|
||||
radiant_env['LINKFLAGS'] += '-ldl '
|
||||
if ( OS == 'Darwin' ):
|
||||
radiant_env['CXXFLAGS'] += '-fno-common '
|
||||
radiant_env['CCFLAGS'] += '-fno-common '
|
||||
radiant_env['LINKFLAGS'] += '-lX11 -lGL -lGLU '
|
||||
radiant_env['LIBPREFIX'] = ''
|
||||
radiant_env.useGlib2()
|
||||
radiant_env.useXML2()
|
||||
radiant_env.useGtk2()
|
||||
radiant_env.useGtkGLExt()
|
||||
|
||||
radiant_src=[ 'qgl.c', 'brush.cpp', 'brush_primit.cpp', 'brushscript.cpp', 'camwindow.cpp', 'csg.cpp',
|
||||
'dialog.cpp', 'dialoginfo.cpp', 'drag.cpp', 'eclass.cpp', 'eclass_def.cpp', 'error.cpp', 'feedback.cpp',
|
||||
'file.cpp', 'findtexturedialog.cpp', 'glinterface.cpp', 'glwidget.cpp', 'glwindow.cpp', 'groupdialog.cpp',
|
||||
'gtkdlgs.cpp', 'gtkmisc.cpp', 'main.cpp', 'mainframe.cpp', 'map.cpp', 'missing.cpp', 'parse.cpp',
|
||||
'patchdialog.cpp', 'pluginentities.cpp', 'pluginmanager.cpp', 'pmesh.cpp', 'points.cpp', 'preferences.cpp',
|
||||
'profile.cpp', 'qe3.cpp', 'qgl_ext.cpp', 'select.cpp', 'selectedface.cpp', 'surfacedialog.cpp',
|
||||
'surfaceplugin.cpp', 'targetname.cpp', 'texmanip.cpp', 'texwindow.cpp', 'undo.cpp', 'vertsel.cpp',
|
||||
'watchbsp.cpp', 'winding.cpp', 'xywindow.cpp', 'z.cpp', 'zwindow.cpp', 'filters.cpp', 'bp_dlg.cpp', 'ui.cpp' ]
|
||||
|
||||
for i in range(len(radiant_src)):
|
||||
radiant_src[i] = 'radiant/' + radiant_src[i]
|
||||
|
||||
radiant_src.append('libs/libmathlib.a')
|
||||
radiant_src.append('libs/libcmdlib.a')
|
||||
radiant_src.append('libs/libl_net.a')
|
||||
radiant_src.append('libs/libsynapse.a')
|
||||
|
||||
radiant_env.Program(target='radiant.' + g_cpu, source=radiant_src)
|
||||
radiant_env.Install(INSTALL, 'radiant.' + g_cpu)
|
||||
|
||||
# setup -------------------------------------------------------------------------------------------
|
||||
|
||||
class setup_builder:
|
||||
|
||||
g_dryrun = 0
|
||||
|
||||
def system(self, cmd):
|
||||
if (self.g_dryrun):
|
||||
print cmd
|
||||
else:
|
||||
sys.stdout.write(cmd)
|
||||
ret = commands.getstatusoutput(cmd)
|
||||
print ret[1]
|
||||
if (ret[0] != 0):
|
||||
raise 'command failed'
|
||||
|
||||
def copy_core(self):
|
||||
# binaries and misc
|
||||
self.system('mkdir -p %s/modules' % self.SETUP_BIN_DIR)
|
||||
self.system('mkdir -p %s/plugins' % self.SETUP_BIN_DIR)
|
||||
self.system('cp install/%s %s' % (self.EDITOR_BIN, self.SETUP_BIN_DIR))
|
||||
self.system('cp install/modules/*.so %s/modules' % self.SETUP_BIN_DIR )
|
||||
self.system('cp install/plugins/*.so %s/plugins' % self.SETUP_BIN_DIR )
|
||||
self.system('cp install/q3map2.%s %s' % ( g_cpu, self.SETUP_BIN_DIR ) )
|
||||
self.M4_STDC = ''
|
||||
if (not self.g_darwin):
|
||||
# fugly
|
||||
# copy libgcc_s and stdc++ over to distribute it and reduce potential ABI fuckups
|
||||
ret = commands.getstatusoutput('ldd -r install/' + self.EDITOR_BIN + ' 2>/dev/null | grep libgcc_s | sed -e \'s/.* => \\([^ ]*\\) .*/\\1/\'')
|
||||
if (ret[0] != 0):
|
||||
raise 'ldd command failed'
|
||||
self.system('cp ' + ret[1] + ' ' + self.SETUP_BIN_DIR)
|
||||
ret = commands.getstatusoutput('ldd -r install/' + self.EDITOR_BIN + ' 2>/dev/null | grep libstdc++ | sed -e \'s/.* => \\([^ ]*\\) .*/\\1/\'')
|
||||
if (ret[0] != 0):
|
||||
raise 'ldd command failed'
|
||||
lines = string.split(ret[1], '\n')
|
||||
self.M4_STDC = '"'
|
||||
for i in lines:
|
||||
self.system('cp ' + i + ' ' + self.SETUP_BIN_DIR)
|
||||
self.M4_STDC += os.path.basename(i) + ' \n'
|
||||
self.M4_STDC += '"'
|
||||
# hack for symlink
|
||||
# setup process generates the wrapper at install time
|
||||
# but we need a dummy executable for symlink in loki_setup
|
||||
self.system('echo -n "#!/bin/sh\necho If you read this then there was a bug during setup. Report the bug and try running %s directly from it\'s installation directory.\n" > %s/radiant' % (self.EDITOR_BIN, self.SETUP_BIN_DIR));
|
||||
self.system('echo -n "#!/bin/sh\necho If you read this then there was a bug during setup. Report the bug and try running %s directly from it\'s installation directory.\n" > %s/q3map2' % (self.EDITOR_BIN, self.SETUP_BIN_DIR));
|
||||
## this goes to the core install directory
|
||||
DEST = self.SETUP_DIR + '/core'
|
||||
self.system('mkdir -p ' + DEST + '/modules/bitmaps')
|
||||
# general content stuff
|
||||
self.system('cp -R plugins/model/bitmaps/* ' + DEST + '/modules/bitmaps')
|
||||
self.system('cp -R setup/data/tools/* ' + DEST)
|
||||
self.system('cp -R radiant/bitmaps ' + DEST)
|
||||
self.system('cp setup/changelog.txt ' + DEST)
|
||||
self.system('cp setup/openurl.sh ' + DEST)
|
||||
self.system('cp tools/quake3/q3map2/changelog.q3map2.txt ' + DEST)
|
||||
# documentation
|
||||
self.system('cp -R docs/manual/Q3Rad_Manual ' + DEST)
|
||||
self.system('cp -R docs/manual/quake3/Compile_Manual ' + DEST)
|
||||
self.system('cp -R docs/manual/quake3/Model_Manual ' + DEST)
|
||||
self.system('cp -R docs/manual/quake3/Terrain_Manual ' + DEST)
|
||||
# copy plugins media
|
||||
self.system('mkdir -p ' + DEST + '/plugins/bitmaps')
|
||||
self.system('cp -R contrib/bobtoolz/bitmaps/* ' + DEST + '/plugins/bitmaps')
|
||||
self.system('cp -R contrib/bobtoolz/bt ' + DEST + '/plugins')
|
||||
self.system('cp -R contrib/camera/bitmaps/* ' + DEST + '/plugins/bitmaps' )
|
||||
self.system('cp -R contrib/bkgrnd2d/bitmaps/* ' + DEST + '/plugins/bitmaps' )
|
||||
|
||||
def copy_q3(self):
|
||||
# binaries
|
||||
self.system('mkdir -p ' + self.SETUP_BIN_DIR + '/q3')
|
||||
if ( self.g_darwin == 0 ):
|
||||
self.system('cp setup/linux/bspc ' + self.SETUP_BIN_DIR + '/q3')
|
||||
|
||||
# goes in core
|
||||
DEST = self.SETUP_DIR + '/core/q3'
|
||||
self.system('mkdir -p ' + DEST)
|
||||
self.system('cp setup/data/tools/synapse.config ' + DEST)
|
||||
self.system('cp setup/data/tools/game.xlink ' + DEST)
|
||||
self.system('cp -R docs/manual/quake3/Team_Arena_Mapping_Help ' + DEST)
|
||||
self.system('cp -R docs/manual/quake3/New_Teams_For_Q3TA ' + DEST)
|
||||
self.system('cp -R docs/manual/quake3/Q3AShader_Manual ' + DEST)
|
||||
|
||||
# goes in the game install path
|
||||
DEST = self.SETUP_DIR + '/q3'
|
||||
self.system('mkdir -p ' + DEST)
|
||||
self.system('cp -R setup/data/baseq3 ' + DEST)
|
||||
self.system('cp -R setup/data/missionpack ' + DEST)
|
||||
|
||||
def copy_wolf(self):
|
||||
# binaries
|
||||
self.system('mkdir -p ' + self.SETUP_BIN_DIR + '/wolf')
|
||||
if ( self.g_darwin == 0 ):
|
||||
self.system('cp ../WolfPack/bin/Linux/bspc ' + self.SETUP_BIN_DIR + '/wolf')
|
||||
|
||||
# goes in core
|
||||
DEST = self.SETUP_DIR + '/core/wolf'
|
||||
self.system('mkdir -p ' + DEST)
|
||||
self.system('cp ../WolfPack/synapse.config ' + DEST)
|
||||
self.system('cp -R ../WolfPack/docs ' + DEST)
|
||||
self.system('cp ../WolfPack/game.xlink ' + DEST)
|
||||
self.system('cp ../WolfPack/bin/aascfg_lg.c ' + DEST)
|
||||
self.system('cp ../WolfPack/bin/aascfg_sm.c ' + DEST)
|
||||
self.system('cp ../WolfPack/bin/bspc.ai ' + DEST)
|
||||
|
||||
# goes in the game install path
|
||||
DEST = self.SETUP_DIR + '/wolf/main'
|
||||
self.system('mkdir -p ' + DEST)
|
||||
self.system('cp ../WolfPack/astro-skies.pk3 ' + DEST)
|
||||
self.system('cp ../WolfPack/common-astro-spog.pk3 ' + DEST)
|
||||
self.system('cp ../WolfPack/lights.pk3 ' + DEST)
|
||||
self.system('cp -R ../WolfPack/scripts ' + DEST)
|
||||
self.system('cp -R ../WolfPack/maps ' + DEST)
|
||||
self.system('cp -R ../WolfPack/models ' + DEST)
|
||||
|
||||
def copy_et(self):
|
||||
# goes in core
|
||||
DEST = self.SETUP_DIR + '/core/et'
|
||||
self.system('mkdir -p ' + DEST)
|
||||
self.system('cp -R ../ETPack/bitmaps ' + DEST)
|
||||
self.system('cp -R ../ETPack/docs ' + DEST)
|
||||
self.system('cp ../ETPack/game.xlink ' + DEST)
|
||||
self.system('cp ../ETPack/synapse.config ' + DEST)
|
||||
|
||||
# goes in game install path
|
||||
DEST = self.SETUP_DIR + '/et/etmain'
|
||||
self.system('mkdir -p ' + DEST)
|
||||
self.system('cp ../ETPack/astro-skies.pk3 ' + DEST)
|
||||
self.system('cp ../ETPack/common.pk3 ' + DEST)
|
||||
self.system('cp ../ETPack/goldrush.pcx ' + DEST)
|
||||
self.system('cp ../ETPack/lights.pk3 ' + DEST)
|
||||
self.system('cp ../ETPack/mapmedia.pk3 ' + DEST)
|
||||
self.system('cp -R ../ETPack/scripts ' + DEST)
|
||||
self.system('cp -R ../ETPack/maps ' + DEST)
|
||||
self.system('cp -R ../ETPack/models ' + DEST)
|
||||
|
||||
def copy_q2(self):
|
||||
# binaries
|
||||
self.system('cp -R install/q2 %s' % (self.SETUP_BIN_DIR))
|
||||
|
||||
# goes in core
|
||||
DEST = self.SETUP_DIR + '/core/q2'
|
||||
self.system('mkdir -p ' + DEST + '/modules')
|
||||
self.system('cp ../Q2Pack/game.xlink ' + DEST)
|
||||
self.system('cp ../Q2Pack/synapse.config ' + DEST)
|
||||
self.system('cp install/q2/q2map install/q2/qdata3 ' + DEST)
|
||||
self.system('cp -R install/q2/modules ' + DEST )
|
||||
|
||||
# goes in game install path
|
||||
DEST = self.SETUP_DIR + '/q2'
|
||||
self.system('mkdir -p ' + DEST + '/baseq2')
|
||||
self.system('cp -R ../Q2Pack/baseq2/* ' + DEST + '/baseq2')
|
||||
|
||||
def copy_her2(self):
|
||||
# binaries
|
||||
self.system('cp -R install/heretic2 %s' % (self.SETUP_BIN_DIR))
|
||||
|
||||
# goes in core
|
||||
DEST = self.SETUP_DIR + '/core/heretic2'
|
||||
self.system('mkdir -p ' + DEST + '/modules')
|
||||
self.system('cp ../Her2Pack/game.xlink ' + DEST)
|
||||
self.system('cp ../Her2Pack/synapse.config ' + DEST)
|
||||
self.system('cp install/q2/q2map install/heretic2/qdata3 ' + DEST)
|
||||
self.system('cp -R install/heretic2/modules ' + DEST )
|
||||
|
||||
# goes in game install path
|
||||
DEST = self.SETUP_DIR + '/heretic2'
|
||||
self.system('mkdir -p ' + DEST + '/base')
|
||||
self.system('cp -R ../Her2Pack/base/* ' + DEST + '/base')
|
||||
|
||||
def build_setup(self):
|
||||
self.system( 'cp -R ' + self.SETUP_IMAGE_OS + '/* ' + self.SETUP_DIR )
|
||||
self.system( 'cp -fR ' + self.SETUP_IMAGE + '/* ' + self.SETUP_DIR )
|
||||
self.system('cp setup/license.txt ' + self.SETUP_DIR)
|
||||
self.system('cp setup/linux/README ' + self.SETUP_DIR)
|
||||
OS_DEFS=''
|
||||
if (self.g_darwin):
|
||||
OS_DEFS='--define=M4_OSX'
|
||||
M4_LINE = OS_DEFS + ' --define=M4_VER_MAJOR=' + self.major + ' --define=M4_VER_MINOR=' + self.minor + ' --define=M4_VER=' + self.line
|
||||
M4_LINE += ' --define=M4_GAME_ET=%d' % self.DO_GAME_ET
|
||||
M4_LINE += ' --define=M4_GAME_Q2=%d' % self.DO_GAME_Q2
|
||||
if ( self.M4_STDC != '' ):
|
||||
M4_LINE += ' --define=M4_STDC=' + self.M4_STDC
|
||||
# setup.xml
|
||||
self.system('m4 ' + M4_LINE + ' ' + self.SETUP_DIR + '/setup.data/setup.xml.in > ' + self.SETUP_DIR + '/setup.data/setup.xml')
|
||||
# postinstall.sh
|
||||
self.system('m4 ' + M4_LINE + ' ' + self.SETUP_DIR + '/setup.data/postinstall.sh.in > ' + self.SETUP_DIR + '/setup.data/postinstall.sh')
|
||||
# config.sh
|
||||
self.system('m4 ' + M4_LINE + ' ' + self.SETUP_DIR + '/setup.data/config.sh.in > ' + self.SETUP_DIR + '/setup.data/config.sh')
|
||||
# setup.sh
|
||||
self.system('m4 ' + M4_LINE + ' ' + self.SETUP_DIR + '/setup.sh.in > ' + self.SETUP_DIR + '/setup.sh')
|
||||
self.system('chmod +x ' +self.SETUP_DIR + '/setup.sh')
|
||||
self.system('find ' + self.SETUP_DIR + ' -name .svn | while read i ; do rm -r "$i" ; done')
|
||||
# pack it up
|
||||
self.system('setup/linux/makeself/makeself.sh ' + self.SETUP_DIR + ' ' + self.SETUP_TARGET + ' "GtkRadiant ' + self.line + ' setup" ./setup.sh')
|
||||
if (self.g_darwin):
|
||||
def build_fink_deb(self):
|
||||
print "Building installer .deb\n"
|
||||
self.F_REV = '1'
|
||||
self.FINKINFO_DIR = '/sw/fink/10.2/unstable/main/finkinfo/games'
|
||||
self.TARBALL_DIR='radiant-' + self.F_REV + '.' + self.major
|
||||
self.TARBALL_NAME='radiant-' + self.F_REV + '.' + self.major + '.tar.gz'
|
||||
self.TARBALL_DEST='/sw/src'
|
||||
|
||||
# prepare package description
|
||||
self.system('mkdir -p ' + self.FINKINFO_DIR)
|
||||
self.system('m4 ' + M4_LINE + ' --define=M4_SETUP_TARGET=' + self.SETUP_TARGET + ' --define=M4_F_REV=' + self.F_REV + ' ' + 'setup/osx/radiant.info.m4 > ' + self.FINKINFO_DIR + '/radiant-' + self.TARBALL_DIR + '.info')
|
||||
|
||||
# build the tarball
|
||||
self.system('if [ -r /tmp/' + self.TARBALL_DIR + ' ] ; then rm -r ' '/tmp/' + self.TARBALL_DIR + ' ; fi')
|
||||
self.system('mkdir -p ' '/tmp/' + self.TARBALL_DIR)
|
||||
self.system('cp ' + self.SETUP_TARGET + ' ' + '/tmp/' + self.TARBALL_DIR)
|
||||
self.system('cd /tmp ; tar -cvzf ' + self.TARBALL_NAME + ' ' + self.TARBALL_DIR + ' ; cp ' + self.TARBALL_NAME + ' ' + self.TARBALL_DEST + '/')
|
||||
self.system('/sw/bin/fink rebuild radiant')
|
||||
|
||||
build_fink_deb(self)
|
||||
|
||||
def spawn_setup(self, env, target, source):
|
||||
if ( OS == 'Darwin' ):
|
||||
self.g_darwin = 1
|
||||
else:
|
||||
self.g_darwin = 0
|
||||
(self.line, self.major, self.minor) = get_version()
|
||||
print 'Setup: GtkRadiant %s' % self.line
|
||||
if ( self.g_darwin ):
|
||||
self.SETUP_IMAGE_OS = '../loki_setup/image'
|
||||
else:
|
||||
self.SETUP_IMAGE_OS = 'setup/linux/setup_image.Linux'
|
||||
self.SETUP_IMAGE = 'setup/linux/setup_image'
|
||||
self.SETUP_DIR = '/tmp/radiant-setup.%d' % os.getpid()
|
||||
self.EDITOR_BIN='radiant.' + g_cpu
|
||||
if ( self.g_darwin ):
|
||||
self.SETUP_BIN_DIR = self.SETUP_DIR + '/bin/Darwin/ppc'
|
||||
self.SETUP_TARGET = 'osx-radiant-%s.run' % self.line
|
||||
else:
|
||||
self.SETUP_BIN_DIR = self.SETUP_DIR + '/bin/Linux/x86'
|
||||
self.SETUP_TARGET = 'linux-radiant-%s.run' % self.line
|
||||
# TODO: eval a conf file instead
|
||||
self.DO_CORE=1
|
||||
self.DO_GAME_Q3=1
|
||||
self.DO_GAME_WOLF=1
|
||||
self.DO_GAME_ET=1
|
||||
self.DO_GAME_Q2=1
|
||||
self.DO_GAME_HER2=1
|
||||
if ( self.g_darwin ):
|
||||
self.DO_GAME_Q2=0
|
||||
self.DO_GAME_ET=0
|
||||
self.DO_GAME_HER2=0
|
||||
# verbose a bit
|
||||
print 'version: %s major: %s minor: %s\neditor core: %d\nq3: %d\nwolf: %d\nq2: %d\nher2: %d' % (self.line, self.major, self.minor, self.DO_CORE, self.DO_GAME_Q3, self.DO_GAME_WOLF, self.DO_GAME_Q2, self.DO_GAME_HER2)
|
||||
if (self.DO_CORE):
|
||||
self.copy_core()
|
||||
if (self.DO_GAME_Q3):
|
||||
self.copy_q3()
|
||||
if (self.DO_GAME_WOLF):
|
||||
self.copy_wolf()
|
||||
if (self.DO_GAME_ET):
|
||||
self.copy_et()
|
||||
if (self.DO_GAME_Q2):
|
||||
self.copy_q2()
|
||||
if (self.DO_GAME_HER2):
|
||||
self.copy_her2()
|
||||
self.build_setup()
|
||||
return 0
|
||||
|
||||
def spawn_setup(env, target, source):
|
||||
setup = setup_builder()
|
||||
setup.spawn_setup(env, target, source)
|
||||
|
||||
# NOTE: could modify g_env to add the deps auto when calling SharedLibrarySafe ..
|
||||
if (SETUP == '1'):
|
||||
g_env.Command('foo', INSTALL + '/radiant.' + g_cpu, [ spawn_setup ] )
|
||||
depends_list = [
|
||||
INSTALL + '/modules/entity.so',
|
||||
INSTALL + '/modules/fgd.so',
|
||||
INSTALL + '/modules/imagehl.so',
|
||||
INSTALL + '/modules/image.so',
|
||||
INSTALL + '/modules/imagepng.so',
|
||||
INSTALL + '/modules/map.so',
|
||||
INSTALL + '/modules/mapxml.so',
|
||||
INSTALL + '/modules/model.so',
|
||||
INSTALL + '/modules/shaders.so',
|
||||
INSTALL + '/modules/surface.so',
|
||||
INSTALL + '/modules/vfspk3.so',
|
||||
INSTALL + '/modules/vfswad.so',
|
||||
INSTALL + '/plugins/bobtoolz.so',
|
||||
INSTALL + '/plugins/camera.so',
|
||||
INSTALL + '/plugins/prtview.so',
|
||||
INSTALL + '/plugins/gensurf.so',
|
||||
INSTALL + '/plugins/bkgrnd2d.so',
|
||||
INSTALL + '/q3map2.' + g_cpu,
|
||||
INSTALL + '/radiant.' + g_cpu,
|
||||
INSTALL + '/q3data.' + g_cpu ]
|
||||
if ( OS != 'Darwin' ):
|
||||
depends_list += [
|
||||
INSTALL + '/q2/modules/imagewal.so',
|
||||
INSTALL + '/q2/modules/surface_quake2.so',
|
||||
INSTALL + '/q2/modules/vfspak.so',
|
||||
INSTALL + '/q2/q2map',
|
||||
INSTALL + '/q2/qdata3',
|
||||
INSTALL + '/heretic2/modules/imagem8.so',
|
||||
INSTALL + '/heretic2/modules/surface_heretic2.so',
|
||||
INSTALL + '/heretic2/modules/vfspak.so',
|
||||
INSTALL + '/heretic2/qdata3',
|
||||
INSTALL + '/heretic2/q2map' ]
|
||||
g_env.Depends( 'foo', depends_list )
|
||||
|
||||
# end setup ---------------------------------------------------------------------------------------
|
28
SConscript.lib
Normal file
28
SConscript.lib
Normal file
|
@ -0,0 +1,28 @@
|
|||
# -*- mode: python -*-
|
||||
# ZeroRadiant build scripts
|
||||
# TTimo <ttimo@idsoftware.com>
|
||||
# http://scons.sourceforge.net
|
||||
|
||||
import os
|
||||
|
||||
Import( [ 'utils', 'config', 'settings', 'project' ] )
|
||||
|
||||
( libpath, libname ) = os.path.split( project )
|
||||
libname = os.path.splitext( libname )[0]
|
||||
|
||||
env = Environment()
|
||||
settings.SetupEnvironment( env, config )
|
||||
proj = utils.vcproj( os.path.join( GetLaunchDir(), project ) )
|
||||
|
||||
# some filtering. may need to improve that
|
||||
add_sources = []
|
||||
( drop, files ) = proj.filterSource( r'.*l_net_wins\.c' )
|
||||
if ( len( drop ) != 0 ):
|
||||
add_sources.append( 'l_net_berkeley.c' )
|
||||
|
||||
#env.StaticLibrary( libname, [ os.path.join( libpath, i ) for i in files ] )
|
||||
objects = []
|
||||
for i in files + add_sources:
|
||||
objects.append( env.StaticObject( os.path.join( libpath, i ) ) )
|
||||
|
||||
Return( 'objects' )
|
15
SConscript.radiant
Normal file
15
SConscript.radiant
Normal file
|
@ -0,0 +1,15 @@
|
|||
# -*- mode: python -*-
|
||||
# ZeroRadiant build scripts
|
||||
# TTimo <ttimo@idsoftware.com>
|
||||
# http://scons.sourceforge.net
|
||||
|
||||
import os
|
||||
|
||||
Import( [ 'utils', 'config', 'settings', 'lib_objects' ] )
|
||||
|
||||
env = Environment()
|
||||
settings.SetupEnvironment( env, config, useGtk = True, useGtkGL = True )
|
||||
proj = utils.vcproj( os.path.join( GetLaunchDir(), 'radiant/radiant.vcproj' ) )
|
||||
|
||||
env.Program( 'radiant.bin', lib_objects + [ os.path.join( 'radiant', i ) for i in proj.getSourceFiles() ] )
|
||||
|
318
SConstruct
318
SConstruct
|
@ -1,291 +1,59 @@
|
|||
# scons build script
|
||||
# -*- mode: python -*-
|
||||
# ZeroRadiant build scripts
|
||||
# TTimo <ttimo@idsoftware.com>
|
||||
# http://scons.sourceforge.net
|
||||
|
||||
import commands, re, sys, os, pickle, string, popen2
|
||||
from makeversion import radiant_makeversion, get_version
|
||||
from osx_setup import do_osx_setup
|
||||
import sys, os, platform, cPickle
|
||||
|
||||
# to access some internal stuff
|
||||
import SCons
|
||||
import utils, config
|
||||
|
||||
conf_filename='site.conf'
|
||||
# there is a default hardcoded value, you can override on command line, those are saved between runs
|
||||
# we only handle strings
|
||||
serialized=['CC', 'CXX', 'JOBS', 'BUILD', 'SETUP']
|
||||
conf_filename = 'site.sconf'
|
||||
|
||||
# help -------------------------------------------
|
||||
|
||||
Help("""
|
||||
Usage: scons [OPTIONS] [TARGET] [CONFIG]
|
||||
|
||||
[OPTIONS] and [TARGET] are covered in command line options, use scons -H
|
||||
|
||||
[CONFIG]: KEY="VALUE" [...]
|
||||
a number of configuration options saved between runs in the """ + conf_filename + """ file
|
||||
erase """ + conf_filename + """ to start with default settings again
|
||||
|
||||
CC
|
||||
CXX
|
||||
Specify C and C++ compilers (defaults gcc and g++)
|
||||
ex: CC="gcc-3.2"
|
||||
You can use ccache and distcc, for instance:
|
||||
CC="ccache distcc gcc" CXX="ccache distcc g++"
|
||||
|
||||
JOBS
|
||||
Parallel build
|
||||
ex: JOBS="4" is a good setting on SMP machines
|
||||
|
||||
BUILD
|
||||
Use debug/release to select build settings
|
||||
ex: BUILD="release" - default is debug
|
||||
OSX: use BUILD="info" to generate the set of release files
|
||||
|
||||
SETUP
|
||||
Build a setup - default 0
|
||||
"""
|
||||
)
|
||||
|
||||
# end help ---------------------------------------
|
||||
|
||||
# sanity -----------------------------------------
|
||||
|
||||
# use q decently recent python release
|
||||
EnsurePythonVersion( 2, 1 )
|
||||
# above 0.90
|
||||
EnsureSConsVersion( 0, 95 )
|
||||
print 'SCons ' + SCons.__version__
|
||||
|
||||
# end sanity -------------------------------------
|
||||
|
||||
# system detection -------------------------------
|
||||
|
||||
# CPU type
|
||||
g_cpu = commands.getoutput('uname -m')
|
||||
exp = re.compile('.*i?86.*')
|
||||
if (g_cpu == 'Power Macintosh'):
|
||||
g_cpu = 'ppc'
|
||||
elif exp.match(g_cpu):
|
||||
g_cpu = 'x86'
|
||||
else:
|
||||
g_cpu = 'cpu'
|
||||
|
||||
# OS
|
||||
OS = commands.getoutput('uname')
|
||||
|
||||
if (OS == 'Linux'):
|
||||
# libc .. do the little magic!
|
||||
# NOTE: this used to work fine up to libc 2.3
|
||||
libc = commands.getoutput('/lib/libc.so.6 |grep "GNU C "|grep version|awk -F "version " \'{ print $2 }\'|cut -b -3')
|
||||
|
||||
# end system detection ---------------------------
|
||||
|
||||
# default settings -------------------------------
|
||||
|
||||
CC='gcc'
|
||||
CXX='g++'
|
||||
JOBS='1'
|
||||
BUILD='debug'
|
||||
INSTALL='#install'
|
||||
SETUP='0'
|
||||
g_build_root = 'build'
|
||||
|
||||
# end default settings ---------------------------
|
||||
|
||||
# site settings ----------------------------------
|
||||
|
||||
site_dict = {}
|
||||
if (os.path.exists(conf_filename)):
|
||||
site_file = open(conf_filename, 'r')
|
||||
p = pickle.Unpickler(site_file)
|
||||
site_dict = p.load()
|
||||
print 'Loading build configuration from ' + conf_filename
|
||||
for k, v in site_dict.items():
|
||||
exec_cmd = k + '=\"' + v + '\"'
|
||||
print exec_cmd
|
||||
exec(exec_cmd)
|
||||
|
||||
# end site settings ------------------------------
|
||||
|
||||
# command line settings --------------------------
|
||||
|
||||
for k in serialized:
|
||||
if (ARGUMENTS.has_key(k)):
|
||||
exec_cmd = k + '=\"' + ARGUMENTS[k] + '\"'
|
||||
print 'Command line: ' + exec_cmd
|
||||
exec(exec_cmd)
|
||||
|
||||
# end command line settings ----------------------
|
||||
|
||||
# sanity check -----------------------------------
|
||||
|
||||
if (SETUP == '1' and BUILD != 'release' and BUILD != 'info'):
|
||||
print 'Forcing release build for setup'
|
||||
BUILD = 'release'
|
||||
|
||||
def GetGCCVersion(name):
|
||||
ret = commands.getstatusoutput('%s -dumpversion' % name)
|
||||
if ( ret[0] != 0 ):
|
||||
return None
|
||||
vers = string.split(ret[1], '.')
|
||||
if ( len(vers) == 2 ):
|
||||
return [ vers[0], vers[1], 0 ]
|
||||
elif ( len(vers) == 3 ):
|
||||
return vers
|
||||
return None
|
||||
|
||||
ver_cc = GetGCCVersion(CC)
|
||||
ver_cxx = GetGCCVersion(CXX)
|
||||
|
||||
# end sanity check -------------------------------
|
||||
|
||||
# save site configuration ----------------------
|
||||
|
||||
for k in serialized:
|
||||
exec_cmd = 'site_dict[\'' + k + '\'] = ' + k
|
||||
exec(exec_cmd)
|
||||
|
||||
site_file = open(conf_filename, 'w')
|
||||
p = pickle.Pickler(site_file)
|
||||
p.dump(site_dict)
|
||||
site_file.close()
|
||||
|
||||
# end save site configuration ------------------
|
||||
|
||||
# general configuration, target selection --------
|
||||
|
||||
SConsignFile( "scons.signatures" )
|
||||
|
||||
g_build = g_build_root + '/' + BUILD
|
||||
|
||||
SetOption('num_jobs', JOBS)
|
||||
|
||||
LINK = CXX
|
||||
# common flags
|
||||
CCFLAGS = ''
|
||||
CXXFLAGS = '-pipe -DQ_NO_STLPORT '
|
||||
CPPPATH = []
|
||||
if (BUILD == 'debug'):
|
||||
CXXFLAGS += '-g -D_DEBUG '
|
||||
CCFLAGS += '-g -D_DEBUG '
|
||||
elif (BUILD == 'release'):
|
||||
CXXFLAGS += '-g -O2 '
|
||||
CCFLAGS += '-g -O2 '
|
||||
elif ( BUILD == 'info' ):
|
||||
print 'Preparing OSX release'
|
||||
( line, major, minor ) = get_version()
|
||||
do_osx_setup( major, minor, 'osx-radiant-%s.run' % line )
|
||||
sys.exit( 0 )
|
||||
else:
|
||||
print 'Unknown build configuration ' + BUILD
|
||||
sys.exit( 0 )
|
||||
|
||||
LINKFLAGS = ''
|
||||
if ( OS == 'Linux' ):
|
||||
LINKFLAGS += '-Wl,-fini,fini_stub '
|
||||
if ( OS == 'Darwin' ):
|
||||
CCFLAGS += '-force_cpusubtype_ALL -fPIC '
|
||||
CXXFLAGS += '-force_cpusubtype_ALL -fPIC -fno-exceptions -fno-rtti '
|
||||
CPPPATH.append('/sw/include')
|
||||
CPPPATH.append('/usr/X11R6/include')
|
||||
LINKFLAGS += '-L/sw/lib -L/usr/lib -L/usr/X11R6/lib '
|
||||
|
||||
CPPPATH.append('libs')
|
||||
|
||||
# extend the standard Environment a bit
|
||||
class idEnvironment(Environment):
|
||||
|
||||
def useGlib2(self):
|
||||
self['CXXFLAGS'] += '`pkg-config glib-2.0 --cflags` '
|
||||
self['CCFLAGS'] += '`pkg-config glib-2.0 --cflags` '
|
||||
self['LINKFLAGS'] += '`pkg-config glib-2.0 --libs` '
|
||||
|
||||
def useXML2(self):
|
||||
self['CXXFLAGS'] += '`xml2-config --cflags` '
|
||||
self['CCFLAGS'] += '`xml2-config --cflags` '
|
||||
self['LINKFLAGS'] += '`xml2-config --libs` '
|
||||
|
||||
def useGtk2(self):
|
||||
self['CXXFLAGS'] += '`pkg-config gtk+-2.0 --cflags` '
|
||||
self['CCFLAGS'] += '`pkg-config gtk+-2.0 --cflags` '
|
||||
self['LINKFLAGS'] += '`pkg-config gtk+-2.0 --libs-only-L` `pkg-config gtk+-2.0 --libs-only-l` '
|
||||
|
||||
def useGtkGLExt(self):
|
||||
self['CXXFLAGS'] += '`pkg-config gtkglext-1.0 --cflags` '
|
||||
self['CCFLAGS'] += '`pkg-config gtkglext-1.0 --cflags` '
|
||||
self['LINKFLAGS'] += '`pkg-config gtkglext-1.0 --libs-only-L` `pkg-config gtkglext-1.0 --libs-only-l` '
|
||||
|
||||
def usePNG(self):
|
||||
self['CXXFLAGS'] += '`libpng-config --cflags` '
|
||||
self['CCFLAGS'] += '`libpng-config --cflags` '
|
||||
self['LINKFLAGS'] += '`libpng-config --ldflags` '
|
||||
|
||||
def usePThread(self):
|
||||
if ( OS == 'Darwin' ):
|
||||
self['LINKFLAGS'] += '-lpthread -Wl,-stack_size,0x400000 '
|
||||
else:
|
||||
self['LINKFLAGS'] += '-lpthread '
|
||||
|
||||
def CheckLDD(self, target, source, env):
|
||||
file = target[0]
|
||||
if (not os.path.isfile(file.abspath)):
|
||||
print('ERROR: CheckLDD: target %s not found\n' % target[0])
|
||||
Exit(1)
|
||||
# not using os.popen3 as I want to check the return code
|
||||
ldd = popen2.Popen3('`which ldd` -r %s' % target[0], 1)
|
||||
stdout_lines = ldd.fromchild.readlines()
|
||||
stderr_lines = ldd.childerr.readlines()
|
||||
ldd_ret = ldd.wait()
|
||||
del ldd
|
||||
have_undef = 0
|
||||
if ( ldd_ret != 0 ):
|
||||
print "ERROR: ldd command returned with exit code %d" % ldd_ret
|
||||
os.system('rm %s' % target[0])
|
||||
Exit()
|
||||
for i_line in stderr_lines:
|
||||
print repr(i_line)
|
||||
regex = re.compile('undefined symbol: (.*)\t\\((.*)\\)\n')
|
||||
if ( regex.match(i_line) ):
|
||||
symbol = regex.sub('\\1', i_line)
|
||||
try:
|
||||
env['ALLOWED_SYMBOLS'].index(symbol)
|
||||
sys.argv.index( '-h' )
|
||||
except:
|
||||
have_undef = 1
|
||||
pass
|
||||
else:
|
||||
print "ERROR: failed to parse ldd stderr line: %s" % i_line
|
||||
os.system('rm %s' % target[0])
|
||||
Exit(1)
|
||||
if ( have_undef ):
|
||||
print "ERROR: undefined symbols"
|
||||
os.system('rm %s' % target[0])
|
||||
Exit(1)
|
||||
Help(
|
||||
"""
|
||||
======================================================================
|
||||
ZeroRadiant build system quick help
|
||||
|
||||
def SharedLibrarySafe(self, target, source):
|
||||
self.SharedLibrary(target, source)
|
||||
if (OS != 'Darwin'):
|
||||
AddPostAction(target + '.so', self.CheckLDD)
|
||||
You need scons v0.97.0d20070918.r2446 or newer
|
||||
|
||||
g_env = idEnvironment(ENV = os.environ,
|
||||
CC = CC,
|
||||
CXX = CXX,
|
||||
LINK = LINK,
|
||||
CCFLAGS = CCFLAGS,
|
||||
CXXFLAGS = CXXFLAGS,
|
||||
CPPPATH = CPPPATH,
|
||||
LINKFLAGS = LINKFLAGS)
|
||||
Default build (release), just run scons at the toplevel
|
||||
|
||||
# export the globals
|
||||
GLOBALS = 'g_env INSTALL SETUP g_cpu'
|
||||
debug build:
|
||||
$ scons config=debug
|
||||
======================================================================
|
||||
""" )
|
||||
Return()
|
||||
|
||||
radiant_makeversion('\\ngcc version: %s.%s.%s' % ( ver_cc[0], ver_cc[1], ver_cc[2] ) )
|
||||
active_configs = []
|
||||
|
||||
# end general configuration ----------------------
|
||||
# load up configurations from the save file
|
||||
if ( os.path.exists( conf_filename ) ):
|
||||
f = open( conf_filename )
|
||||
print 'reading saved configuration from site.conf'
|
||||
try:
|
||||
while ( True ):
|
||||
c = cPickle.load( f )
|
||||
active_configs.append( c )
|
||||
except:
|
||||
pass
|
||||
|
||||
# targets ----------------------------------------
|
||||
# read the command line and build configs
|
||||
config_statements = sys.argv[1:]
|
||||
active_configs = config.ConfigParser().parseStatements( active_configs, config_statements )
|
||||
assert( len( active_configs ) >= 1 )
|
||||
|
||||
Default('.')
|
||||
# save the config
|
||||
print 'saving updated configuration'
|
||||
f = open( conf_filename, 'wb' )
|
||||
for c in active_configs:
|
||||
cPickle.dump( c, f, -1 )
|
||||
|
||||
Export('GLOBALS ' + GLOBALS)
|
||||
BuildDir(g_build, '.', duplicate = 0)
|
||||
SConscript(g_build + '/SConscript')
|
||||
|
||||
# end targets ------------------------------------
|
||||
print 'emit build rules'
|
||||
for c in active_configs:
|
||||
print 'emit configuration: %s' % repr( c )
|
||||
c.emit()
|
||||
|
|
223
config.py
Normal file
223
config.py
Normal file
|
@ -0,0 +1,223 @@
|
|||
import sys, traceback, platform, re, commands
|
||||
|
||||
if __name__ != '__main__':
|
||||
from SCons.Script import *
|
||||
|
||||
import utils
|
||||
|
||||
# config = debug release
|
||||
# aliases are going to be very needed here
|
||||
# we have dependency situations too
|
||||
# target =
|
||||
|
||||
class Config:
|
||||
# not used atm, but useful to keep a list in mind
|
||||
# may use them eventually for the 'all' and other aliases expansions?
|
||||
target_choices = utils.Enum( 'radiant' )
|
||||
config_choices = utils.Enum( 'debug', 'release' )
|
||||
|
||||
# aliases
|
||||
# 'all' -> for each choices
|
||||
# 'gamecode' for the targets, 'game' 'cgame' 'ui'
|
||||
|
||||
def __init__( self ):
|
||||
# initialize defaults
|
||||
self.target_selected = [ 'radiant' ]
|
||||
self.config_selected = [ 'release' ]
|
||||
# those are global to each config
|
||||
self.cc = 'gcc-4.1'
|
||||
self.cxx = 'g++-4.1'
|
||||
|
||||
def __repr__( self ):
|
||||
return 'config: target=%s config=%s' % ( self.target_selected, self.config_selected )
|
||||
|
||||
def _processTarget( self, ops ):
|
||||
self.target_selected = ops
|
||||
|
||||
def _processConfig( self, ops ):
|
||||
self.config_selected = ops
|
||||
|
||||
def _processCC( self, ops ):
|
||||
self.cc = ops
|
||||
|
||||
def _processCXX( self, ops ):
|
||||
self.cxx = ops
|
||||
|
||||
def setupParser( self, operators ):
|
||||
operators['target'] = self._processTarget
|
||||
operators['config'] = self._processConfig
|
||||
operators['cc'] = self._processCC
|
||||
operators['cxx'] = self._processCXX
|
||||
|
||||
def emit( self ):
|
||||
settings = self
|
||||
for config in self.config_selected:
|
||||
Export( 'utils', 'settings', 'config' )
|
||||
build_dir = os.path.join( 'build', config )
|
||||
BuildDir( build_dir, '.', duplicate = 0 )
|
||||
# left out jpeg6, splines
|
||||
lib_objects = []
|
||||
for project in [ 'libs/synapse/synapse.vcproj', 'libs/cmdlib/cmdlib.vcproj', 'libs/mathlib/mathlib.vcproj', 'libs/l_net/l_net.vcproj', 'libs/ddslib/ddslib.vcproj', 'libs/picomodel/picomodel.vcproj', 'libs/md5lib/md5lib.vcproj' ]:
|
||||
Export( 'project' )
|
||||
lib_objects += SConscript( os.path.join( build_dir, 'SConscript.lib' ) )
|
||||
Export( 'lib_objects' )
|
||||
SConscript( os.path.join( build_dir, 'SConscript.radiant' ) )
|
||||
|
||||
def SetupEnvironment( self, env, config, useGtk = False, useGtkGL = False ):
|
||||
env['CC'] = self.cc
|
||||
env['CXX'] = self.cxx
|
||||
( ret, xml2 ) = commands.getstatusoutput( 'xml2-config --cflags' )
|
||||
if ( ret != 0 ):
|
||||
print 'xml2-config failed'
|
||||
assert( False )
|
||||
xml2libs = commands.getoutput( 'xml2-config --libs' )
|
||||
env.Append( LINKFLAGS = xml2libs.split( ' ' ) )
|
||||
baseflags = [ '-m32', '-pipe', '-Wall', '-fmessage-length=0', '-fvisibility=hidden', xml2.split( ' ' ) ]
|
||||
if ( useGtk ):
|
||||
( ret, gtk2 ) = commands.getstatusoutput( 'pkg-config gtk+-2.0 --cflags' )
|
||||
if ( ret != 0 ):
|
||||
print 'pkg-config gtk+-2.0 failed'
|
||||
assert( False )
|
||||
baseflags += gtk2.split( ' ' )
|
||||
gtk2libs = commands.getoutput( 'pkg-config gtk+-2.0 --libs' )
|
||||
env.Append( LINKFLAGS = gtk2libs.split( ' ' ) )
|
||||
else:
|
||||
( ret, glib ) = commands.getstatusoutput( 'pkg-config glib-2.0 --cflags' )
|
||||
if ( ret != 0 ):
|
||||
print 'pkg-config glib-2.0 failed'
|
||||
assert( False )
|
||||
baseflags += glib.split( ' ' )
|
||||
if ( useGtkGL ):
|
||||
( ret, gtkgl ) = commands.getstatusoutput( 'pkg-config gtkglext-1.0 --cflags' )
|
||||
if ( ret != 0 ):
|
||||
print 'pkg-config gtkglext-1.0 failed'
|
||||
assert( False )
|
||||
baseflags += gtkgl.split( ' ' )
|
||||
gtkgllibs = commands.getoutput( 'pkg-config gtkglext-1.0 --libs' )
|
||||
env.Append( LINKFLAGS = gtkgllibs.split( ' ' ) )
|
||||
|
||||
env.Append( CFLAGS = baseflags )
|
||||
env.Append( CXXFLAGS = baseflags + [ '-fpermissive', '-fvisibility-inlines-hidden' ] )
|
||||
env.Append( CPPPATH = [ 'include', 'libs' ] )
|
||||
env.Append( CPPDEFINES = [ 'Q_NO_STLPORT' ] )
|
||||
if ( config == 'debug' ):
|
||||
env.Append( CFLAGS = [ '-g' ] )
|
||||
env.Append( CPPDEFINES = [ '_DEBUG' ] )
|
||||
else:
|
||||
env.Append( CFLAGS = [ '-O3', '-march=pentium3', '-Winline', '-ffast-math', '-fno-unsafe-math-optimizations' ] )
|
||||
|
||||
# parse the config statement line to produce/update an existing config list
|
||||
# the configs expose a list of keywords and accepted values, which the engine parses out
|
||||
class ConfigParser:
|
||||
def __init__( self ):
|
||||
self.operators = {}
|
||||
|
||||
def _processOp( self, ops ):
|
||||
assert( len( ops ) == 1 )
|
||||
op = ops.pop()
|
||||
if ( op == 'clear' ):
|
||||
self.configs = []
|
||||
self.current_config = None
|
||||
elif ( op == 'pop' ):
|
||||
self.configs.pop()
|
||||
self.current_config = None
|
||||
elif ( op == 'push' ):
|
||||
self.configs.append( self.current_config )
|
||||
self.current_config = Config()
|
||||
self._setupParser( self.current_config )
|
||||
|
||||
def _setupParser( self, c ):
|
||||
self.operators = { 'op' : self._processOp }
|
||||
c.setupParser( self.operators )
|
||||
|
||||
def _parseStatement( self, s ):
|
||||
statement_re = re.compile( '(.*)=(.*)' )
|
||||
value_list_re = re.compile( '([^,]*),?' )
|
||||
if ( not statement_re.match( s ) ):
|
||||
print 'syntax error (statement match): %s' % repr( s )
|
||||
return
|
||||
statement_split = statement_re.split( s )
|
||||
if ( len( statement_split ) != 4 ):
|
||||
print 'syntax error (statement split): %s' % repr( s )
|
||||
return
|
||||
( foo, name, value, bar ) = statement_split
|
||||
value_split = value_list_re.split( value )
|
||||
if ( len( value_split ) < 2 or len( value_split ) % 2 != 1 ):
|
||||
print 'syntax error (value split): %s' % ( repr( value_split ) )
|
||||
return
|
||||
try:
|
||||
value_array = []
|
||||
value_split.reverse()
|
||||
value_split.pop()
|
||||
while ( len( value_split ) != 0 ):
|
||||
value_array.append( value_split.pop() )
|
||||
value_split.pop()
|
||||
except:
|
||||
print traceback.print_exception( sys.exc_type, sys.exc_value, sys.exc_traceback )
|
||||
print 'syntax error (value to array): %s' % ( repr( value_split ) )
|
||||
return
|
||||
|
||||
return ( name, value_array )
|
||||
|
||||
def parseStatements( self, _configs, statements ):
|
||||
self.current_config = None
|
||||
self.configs = _configs
|
||||
if ( self.configs is None ):
|
||||
self.configs = []
|
||||
for s in statements:
|
||||
|
||||
if ( self.current_config is None ):
|
||||
# use a provided config, or create a default one
|
||||
if ( len( self.configs ) > 0 ):
|
||||
self.current_config = self.configs.pop()
|
||||
else:
|
||||
self.current_config = Config()
|
||||
# setup the operator table for this config
|
||||
# NOTE: have that in self._processOp too
|
||||
self._setupParser( self.current_config )
|
||||
|
||||
ret = self._parseStatement( s )
|
||||
if ( ret is None ):
|
||||
print 'stop statement parse at %s' % repr( s )
|
||||
break
|
||||
( name, value_array ) = ret
|
||||
try:
|
||||
processor = self.operators[name]
|
||||
except:
|
||||
print 'unknown operator %s - stop statement parse at %s' % ( repr( name ), repr( s ) )
|
||||
break
|
||||
processor( value_array )
|
||||
|
||||
if ( not self.current_config is None ):
|
||||
self.configs.append( self.current_config )
|
||||
# make sure there is at least one config
|
||||
if ( len( self.configs ) == 0 ):
|
||||
print 'pushing a default config'
|
||||
self.configs.append( Config() )
|
||||
return self.configs
|
||||
|
||||
import unittest
|
||||
|
||||
class TestConfigParse( unittest.TestCase ):
|
||||
|
||||
def setUp( self ):
|
||||
self.parser = ConfigParser()
|
||||
|
||||
def testBasicParse( self ):
|
||||
# test basic config parsing
|
||||
# needs to cleanly stop at the first config statement that is not recognized
|
||||
configs = self.parser.parseStatements( None, [ 'game=missionpack', 'config=qvm', 'foobar' ] )
|
||||
print repr( configs )
|
||||
|
||||
def testMultiParse( self ):
|
||||
# multiple configs seperated by commas
|
||||
configs = self.parser.parseStatements( None, [ 'target=server,game,cgame' ] )
|
||||
print repr( configs )
|
||||
|
||||
def testOp( self ):
|
||||
# test the operator for multiple configs
|
||||
configs = self.parser.parseStatements( None, [ 'target=core', 'config=release', 'op=push', 'target=game,cgame,ui', 'config=debug' ] )
|
||||
print repr( configs )
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
|
@ -43,7 +43,7 @@
|
|||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<File RelativePath=".\CMDLIB.cpp">
|
||||
<File RelativePath=".\cmdlib.cpp">
|
||||
</File>
|
||||
<File RelativePath="..\cmdlib.h">
|
||||
</File>
|
||||
|
|
|
@ -43,69 +43,69 @@
|
|||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<File RelativePath=".\Jchuff.h">
|
||||
<File RelativePath=".\jchuff.h">
|
||||
</File>
|
||||
<File RelativePath=".\JCOMAPI.cpp">
|
||||
<File RelativePath=".\jcomapi.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\Jconfig.h">
|
||||
<File RelativePath=".\jconfig.h">
|
||||
</File>
|
||||
<File RelativePath=".\JDAPIMIN.cpp">
|
||||
<File RelativePath=".\jdapimin.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\JDAPISTD.cpp">
|
||||
<File RelativePath=".\jdapistd.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\JDATASRC.cpp">
|
||||
<File RelativePath=".\jdatasrc.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\JDCOEFCT.cpp">
|
||||
<File RelativePath=".\jdcoefct.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\JDCOLOR.cpp">
|
||||
<File RelativePath=".\jdcolor.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\Jdct.h">
|
||||
<File RelativePath=".\jdct.h">
|
||||
</File>
|
||||
<File RelativePath=".\JDDCTMGR.cpp">
|
||||
<File RelativePath=".\jddctmgr.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\JDHUFF.cpp">
|
||||
<File RelativePath=".\jdhuff.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\Jdhuff.h">
|
||||
<File RelativePath=".\jdhuff.h">
|
||||
</File>
|
||||
<File RelativePath=".\JDINPUT.cpp">
|
||||
<File RelativePath=".\jdinput.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\JDMAINCT.cpp">
|
||||
<File RelativePath=".\jdmainct.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\JDMARKER.cpp">
|
||||
<File RelativePath=".\jdmarker.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\JDMASTER.cpp">
|
||||
<File RelativePath=".\jdmaster.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\JDPOSTCT.cpp">
|
||||
<File RelativePath=".\jdpostct.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\JDSAMPLE.cpp">
|
||||
<File RelativePath=".\jdsample.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\JDTRANS.cpp">
|
||||
<File RelativePath=".\jdtrans.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\JERROR.cpp">
|
||||
<File RelativePath=".\jerror.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\Jerror.h">
|
||||
<File RelativePath=".\jerror.h">
|
||||
</File>
|
||||
<File RelativePath=".\JFDCTFLT.cpp">
|
||||
<File RelativePath=".\jfdctflt.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\JIDCTFLT.cpp">
|
||||
<File RelativePath=".\jidctflt.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\Jinclude.h">
|
||||
<File RelativePath=".\jinclude.h">
|
||||
</File>
|
||||
<File RelativePath=".\JMEMMGR.cpp">
|
||||
<File RelativePath=".\jmemmgr.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\JMEMNOBS.cpp">
|
||||
<File RelativePath=".\jmemnobs.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\Jmemsys.h">
|
||||
<File RelativePath=".\jmemsys.h">
|
||||
</File>
|
||||
<File RelativePath=".\Jmorecfg.h">
|
||||
<File RelativePath=".\jmorecfg.h">
|
||||
</File>
|
||||
<File RelativePath=".\Jpegint.h">
|
||||
<File RelativePath=".\jpegint.h">
|
||||
</File>
|
||||
<File RelativePath=".\JPGLOAD.cpp">
|
||||
<File RelativePath=".\jpgload.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\JUTILS.cpp">
|
||||
<File RelativePath=".\jutils.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\Jversion.h">
|
||||
<File RelativePath=".\jversion.h">
|
||||
</File>
|
||||
</Files>
|
||||
<Globals>
|
||||
|
|
|
@ -23,6 +23,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|||
|
||||
// seems to be required for str.h
|
||||
#include <glib.h>
|
||||
#include <glib/gstdio.h>
|
||||
|
||||
#include "synapse.h"
|
||||
#if defined (__linux__) || defined (__APPLE__)
|
||||
|
|
|
@ -606,7 +606,7 @@
|
|||
<Filter Name="Code">
|
||||
<File RelativePath=".\bp_dlg.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\BRUSH.cpp">
|
||||
<File RelativePath=".\brush.cpp">
|
||||
<FileConfiguration Name="Debug|Win32">
|
||||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
|
@ -638,7 +638,7 @@
|
|||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath=".\CSG.cpp">
|
||||
<File RelativePath=".\csg.cpp">
|
||||
<FileConfiguration Name="Debug|Win32">
|
||||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
|
@ -646,7 +646,7 @@
|
|||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath=".\DIALOG.cpp">
|
||||
<File RelativePath=".\dialog.cpp">
|
||||
<FileConfiguration Name="Debug|Win32">
|
||||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
|
@ -662,7 +662,7 @@
|
|||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath=".\DRAG.cpp">
|
||||
<File RelativePath=".\drag.cpp">
|
||||
<FileConfiguration Name="Debug|Win32">
|
||||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
|
@ -670,7 +670,7 @@
|
|||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath=".\ECLASS.cpp">
|
||||
<File RelativePath=".\eclass.cpp">
|
||||
<FileConfiguration Name="Debug|Win32">
|
||||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
|
@ -682,7 +682,7 @@
|
|||
</File>
|
||||
<File RelativePath=".\error.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\FILE.cpp">
|
||||
<File RelativePath=".\file.cpp">
|
||||
<FileConfiguration Name="Debug|Win32">
|
||||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
|
@ -710,7 +710,7 @@
|
|||
</File>
|
||||
<File RelativePath=".\glwidget.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\GLWINDOW.cpp">
|
||||
<File RelativePath=".\glwindow.cpp">
|
||||
<FileConfiguration Name="Debug|Win32">
|
||||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
|
@ -731,7 +731,7 @@
|
|||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath=".\GTKMISC.cpp">
|
||||
<File RelativePath=".\gtkmisc.cpp">
|
||||
<FileConfiguration Name="Debug|Win32">
|
||||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
|
@ -739,7 +739,7 @@
|
|||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath=".\MAIN.cpp">
|
||||
<File RelativePath=".\main.cpp">
|
||||
<FileConfiguration Name="Debug|Win32">
|
||||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
|
@ -755,7 +755,7 @@
|
|||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath=".\MAP.cpp">
|
||||
<File RelativePath=".\map.cpp">
|
||||
<FileConfiguration Name="Debug|Win32">
|
||||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
|
@ -763,7 +763,7 @@
|
|||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath=".\MISSING.cpp">
|
||||
<File RelativePath=".\missing.cpp">
|
||||
<FileConfiguration Name="Debug|Win32">
|
||||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
|
@ -771,7 +771,7 @@
|
|||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath=".\PARSE.cpp">
|
||||
<File RelativePath=".\parse.cpp">
|
||||
<FileConfiguration Name="Debug|Win32">
|
||||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
|
@ -803,7 +803,7 @@
|
|||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath=".\PMESH.cpp">
|
||||
<File RelativePath=".\pmesh.cpp">
|
||||
<FileConfiguration Name="Debug|Win32">
|
||||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
|
@ -811,7 +811,7 @@
|
|||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath=".\POINTS.cpp">
|
||||
<File RelativePath=".\points.cpp">
|
||||
<FileConfiguration Name="Debug|Win32">
|
||||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
|
@ -827,7 +827,7 @@
|
|||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath=".\PROFILE.cpp">
|
||||
<File RelativePath=".\profile.cpp">
|
||||
<FileConfiguration Name="Debug|Win32">
|
||||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
|
@ -835,7 +835,7 @@
|
|||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath=".\QE3.cpp">
|
||||
<File RelativePath=".\qe3.cpp">
|
||||
<FileConfiguration Name="Debug|Win32">
|
||||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
|
@ -847,7 +847,7 @@
|
|||
</File>
|
||||
<File RelativePath=".\qgl_ext.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\SELECT.cpp">
|
||||
<File RelativePath=".\select.cpp">
|
||||
<FileConfiguration Name="Debug|Win32">
|
||||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
|
@ -893,7 +893,7 @@
|
|||
</File>
|
||||
<File RelativePath=".\ui.cpp">
|
||||
</File>
|
||||
<File RelativePath=".\UNDO.cpp">
|
||||
<File RelativePath=".\undo.cpp">
|
||||
<FileConfiguration Name="Debug|Win32">
|
||||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
|
@ -901,7 +901,7 @@
|
|||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath=".\VERTSEL.cpp">
|
||||
<File RelativePath=".\vertsel.cpp">
|
||||
<FileConfiguration Name="Debug|Win32">
|
||||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
|
@ -909,7 +909,7 @@
|
|||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath=".\WINDING.cpp">
|
||||
<File RelativePath=".\winding.cpp">
|
||||
<FileConfiguration Name="Debug|Win32">
|
||||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
|
@ -917,7 +917,7 @@
|
|||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath=".\XYWINDOW.cpp">
|
||||
<File RelativePath=".\xywindow.cpp">
|
||||
<FileConfiguration Name="Debug|Win32">
|
||||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
|
@ -925,7 +925,7 @@
|
|||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath=".\Z.cpp">
|
||||
<File RelativePath=".\z.cpp">
|
||||
<FileConfiguration Name="Debug|Win32">
|
||||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
|
@ -933,7 +933,7 @@
|
|||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath=".\ZWINDOW.cpp">
|
||||
<File RelativePath=".\zwindow.cpp">
|
||||
<FileConfiguration Name="Debug|Win32">
|
||||
<Tool AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\libs";"$(SolutionDir)\..\STLPort\stlport";"$(SolutionDir)\..\gtk2\include";"$(SolutionDir)\..\gtk2\include\glib-2.0";"$(SolutionDir)\..\gtk2\lib\glib-2.0\include";"$(SolutionDir)\..\libxml2\include"" DisableSpecificWarnings="4996;4244;4267" Name="VCCLCompilerTool" PrecompiledHeaderThrough="stdafx.h" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"/>
|
||||
</FileConfiguration>
|
||||
|
|
127
utils.py
Normal file
127
utils.py
Normal file
|
@ -0,0 +1,127 @@
|
|||
# -*- mode: python -*-
|
||||
# QuakeZero build scripts
|
||||
# TTimo <ttimo@idsoftware.com>
|
||||
# http://scons.sourceforge.net
|
||||
|
||||
import os, commands, platform, xml.sax, re, string
|
||||
|
||||
class vcproj( xml.sax.handler.ContentHandler ):
|
||||
def __init__( self, filepath ):
|
||||
self.source_files = []
|
||||
self.misc_files = []
|
||||
self._files = []
|
||||
print 'parse %s' % filepath
|
||||
xml.sax.parse( filepath, self )
|
||||
|
||||
def getSourceFiles( self ):
|
||||
return self.source_files
|
||||
|
||||
def filterSource( self, expression, filelist = None ):
|
||||
if ( filelist is None ):
|
||||
filelist = self.source_files
|
||||
match = []
|
||||
nomatch = []
|
||||
for s in filelist:
|
||||
if ( re.match( expression, s ) ):
|
||||
match.append( s )
|
||||
else:
|
||||
nomatch.append( s )
|
||||
return ( match, nomatch )
|
||||
|
||||
def startElement( self, name, attrs ):
|
||||
if ( name == 'File' ):
|
||||
self._files.append( attrs.getValue('RelativePath') )
|
||||
|
||||
def endDocument( self ):
|
||||
# split into source and headers, remap path seperator to the platform
|
||||
for f in self._files:
|
||||
if ( platform.system() != 'Windows' ):
|
||||
f = f.replace( '\\', '/' )
|
||||
if ( f[-2:] == '.c' or f[-4:] == '.cpp' ):
|
||||
self.source_files.append( f.encode('ascii') )
|
||||
else:
|
||||
self.misc_files.append( f )
|
||||
print '%d source files' % len( self.source_files )
|
||||
|
||||
# action uses LDD to verify that the source doesn't hold unresolved symbols
|
||||
# setup as an AddPostAction of a regular SharedLibrary call
|
||||
def CheckUnresolved( source, target, env ):
|
||||
print 'CheckUnresolved %s' % target[0].abspath
|
||||
if ( not os.path.isfile( target[0].abspath ) ):
|
||||
print 'CheckUnresolved: %s does not exist' % target[0]
|
||||
return 1 # fail
|
||||
( status, output ) = commands.getstatusoutput( 'ldd -r %s' % target[0] )
|
||||
if ( status != 0 ):
|
||||
print 'CheckUnresolved: ldd command failed (exit code %d)' % status
|
||||
os.system( 'rm %s' % target[ 0 ] )
|
||||
return 1 # fail
|
||||
lines = string.split( output, '\n' )
|
||||
have_undef = 0
|
||||
for i_line in lines:
|
||||
regex = re.compile('undefined symbol: (.*)\t\\((.*)\\)')
|
||||
if ( regex.match( i_line ) ):
|
||||
symbol = regex.sub( '\\1', i_line )
|
||||
try:
|
||||
env['ALLOWED_SYMBOLS'].index( symbol )
|
||||
except:
|
||||
have_undef = 1
|
||||
if ( have_undef ):
|
||||
print output
|
||||
print "CheckUnresolved: undefined symbols"
|
||||
os.system('rm %s' % target[0])
|
||||
return 1
|
||||
|
||||
# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/413486
|
||||
|
||||
def Enum(*names):
|
||||
##assert names, "Empty enums are not supported" # <- Don't like empty enums? Uncomment!
|
||||
|
||||
class EnumClass(object):
|
||||
__slots__ = names
|
||||
def __iter__(self): return iter(constants)
|
||||
def __len__(self): return len(constants)
|
||||
def __getitem__(self, i): return constants[i]
|
||||
def __repr__(self): return 'Enum' + str(names)
|
||||
def __str__(self): return 'enum ' + str(constants)
|
||||
|
||||
class EnumValue(object):
|
||||
__slots__ = ('__value')
|
||||
def __init__(self, value): self.__value = value
|
||||
Value = property(lambda self: self.__value)
|
||||
EnumType = property(lambda self: EnumType)
|
||||
def __hash__(self): return hash(self.__value)
|
||||
def __cmp__(self, other):
|
||||
# C fans might want to remove the following assertion
|
||||
# to make all enums comparable by ordinal value {;))
|
||||
assert self.EnumType is other.EnumType, "Only values from the same enum are comparable"
|
||||
return cmp(self.__value, other.__value)
|
||||
def __invert__(self): return constants[maximum - self.__value]
|
||||
def __nonzero__(self): return bool(self.__value)
|
||||
def __repr__(self): return str(names[self.__value])
|
||||
|
||||
maximum = len(names) - 1
|
||||
constants = [None] * len(names)
|
||||
for i, each in enumerate(names):
|
||||
val = EnumValue(i)
|
||||
setattr(EnumClass, each, val)
|
||||
constants[i] = val
|
||||
constants = tuple(constants)
|
||||
EnumType = EnumClass()
|
||||
return EnumType
|
||||
|
||||
#if __name__ == '__main__':
|
||||
# print '\n*** Enum Demo ***'
|
||||
# print '--- Days of week ---'
|
||||
# Days = Enum('Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su')
|
||||
# print Days
|
||||
# print Days.Mo
|
||||
# print Days.Fr
|
||||
# print Days.Mo < Days.Fr
|
||||
# print list(Days)
|
||||
# for each in Days:
|
||||
# print 'Day:', each
|
||||
# print '--- Yes/No ---'
|
||||
# Confirmation = Enum('No', 'Yes')
|
||||
# answer = Confirmation.No
|
||||
# print 'Your answer is not', ~answer
|
||||
|
Loading…
Reference in a new issue