aa0557784c271e18079a50a075e5ea760c9599de
[xonotic/netradiant.git] / SConscript
1 import os, sys, commands, string
2 from makeversion import get_version
3 # OS Detection:
4 OS = commands.getoutput('uname')
5
6 Import('GLOBALS')
7 Import(GLOBALS)
8
9 # make scons link shared libs against static libs
10 g_env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
11
12 # make gcc accept default parameters in function typedefs
13 g_env['CXXFLAGS'] += '-fpermissive '
14
15 g_env['CXXFLAGS'] += '-fPIC '
16 g_env['CCFLAGS'] += '-fPIC '
17
18 def build_list(s_prefix, s_string):
19         s_list = Split(s_string)
20         for i in range(len(s_list)):
21                 s_list[i] = s_prefix + '/' + s_list[i]
22         return s_list
23
24 # common code ------------------------------------------------------
25
26 cmdlib_lib = g_env.StaticLibrary(target='libs/cmdlib', source='libs/cmdlib/cmdlib.cpp')
27
28
29 mathlib_src = 'mathlib.c bbox.c linear.c m4x4.c ray.c'
30 mathlib_lib = g_env.StaticLibrary(target='libs/mathlib', source=build_list('libs/mathlib', mathlib_src))
31
32
33 md5lib_lib = g_env.StaticLibrary(target='libs/md5lib', source='libs/md5lib/md5lib.c')
34
35
36 ddslib_lib = g_env.StaticLibrary(target='libs/ddslib', source='libs/ddslib/ddslib.c')
37
38
39 jpeg_env = g_env.Copy()
40 jpeg_env.Prepend(CPPPATH = 'libs/jpeg6')
41 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'
42 jpeg_lib = jpeg_env.StaticLibrary(target='libs/jpeg', source=build_list('libs/jpeg6', jpeg_src))
43
44
45 net_lib = g_env.StaticLibrary(target='libs/l_net', source=['libs/l_net/l_net.c', 'libs/l_net/l_net_berkley.c'])
46
47
48 picomodel_src = 'picointernal.c picomodel.c picomodules.c pm_3ds.c pm_ase.c pm_md3.c pm_obj.c\
49   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\
50   lwo/lwo2.c lwo/lwob.c lwo/pntspols.c lwo/surface.c lwo/vecmath.c lwo/vmap.c'
51 picomodel_lib = g_env.StaticLibrary(target='libs/picomodel', source=build_list('libs/picomodel', picomodel_src))
52
53
54 synapse_env = g_env.Copy()
55 synapse_env.useGlib2()
56 synapse_env.useXML2()
57 synapse_env['CPPPATH'].append('include')
58 synapse_src = 'synapse.cpp'
59 synapse_lib = synapse_env.StaticLibrary(target='libs/synapse', source=build_list('libs/synapse', synapse_src))
60 # scons 0.95. Doesn't recognize archive compatible for dynamic modules
61 # see thread: http://scons.tigris.org/servlets/BrowseList?listName=users&by=thread&from=168952&to=168952&first=1&count=2
62
63
64 splines_env = g_env.Copy()
65 splines_src = build_list('libs/splines', 
66 'math_angles.cpp math_matrix.cpp math_quaternion.cpp math_vector.cpp q_parse.cpp q_shared.cpp splines.cpp util_str.cpp')
67 splines_env['CPPPATH'].append('include')
68 splines_lib = splines_env.StaticLibrary(target='libs/splines', source=splines_src)
69
70
71 # end static / common libraries ---------------------------------------------------
72
73 # q3map ---------------------------------------------------------------------------
74
75 q3map_env = g_env.Copy()
76 q3map_env['CPPPATH'].append('include')
77 q3map_env.useXML2()
78 q3map_env.useGlib2()
79 q3map_env.usePNG()
80 q3map_env.usePThread()
81 q3map_env.Prepend(CPPPATH='tools/quake3/common')
82
83 q3map_common_src = [
84   'common/cmdlib.c',
85   'common/imagelib.c',
86   'common/inout.c',
87   'common/mutex.c',
88   'common/polylib.c',
89   'common/scriplib.c',
90   'common/threads.c',
91   'common/unzip.c',
92   'common/vfs.c' ]
93
94 q3map_src = [
95   'q3map2/brush.c',
96   'q3map2/brush_primit.c',
97   'q3map2/bsp.c',
98   'q3map2/facebsp.c',
99   'q3map2/fog.c',
100   'q3map2/leakfile.c',
101   'q3map2/map.c',
102   'q3map2/model.c',
103   'q3map2/patch.c',
104   'q3map2/portals.c',
105   'q3map2/prtfile.c',
106   'q3map2/surface.c',
107   'q3map2/surface_fur.c',
108   'q3map2/surface_meta.c',
109   'q3map2/tjunction.c',
110   'q3map2/tree.c',
111   'q3map2/writebsp.c',
112   'q3map2/image.c',
113   'q3map2/light.c',
114   'q3map2/light_bounce.c',
115   'q3map2/light_trace.c',
116   'q3map2/light_ydnar.c',
117   'q3map2/lightmaps_ydnar.c',
118   'q3map2/vis.c',
119   'q3map2/visflow.c',
120   'q3map2/bspfile_abstract.c',
121   'q3map2/bspfile_ibsp.c',
122   'q3map2/bspfile_rbsp.c',
123   'q3map2/decals.c',
124   'q3map2/main.c',
125   'q3map2/mesh.c',
126   'q3map2/path_init.c',
127   'q3map2/shaders.c',
128   'q3map2/surface_extra.c',
129   'q3map2/surface_foliage.c',
130   'q3map2/convert_ase.c',
131   'q3map2/convert_map.c' ]
132
133 q3map_full_src = [ ]
134 for i in q3map_common_src + q3map_src:
135   q3map_full_src.append('tools/quake3/' + i)
136
137 q3map_full_src.append('libs/libmathlib.a')
138 q3map_full_src.append('libs/libl_net.a')
139 q3map_full_src.append('libs/libjpeg.a')
140 q3map_full_src.append('libs/libpicomodel.a')
141 q3map_full_src.append('libs/libmd5lib.a')
142 q3map_full_src.append('libs/libddslib.a')
143
144 q3map_env.Program(target='q3map2.' + g_cpu, source=q3map_full_src )
145 q3map_env.Install(INSTALL, 'q3map2.' + g_cpu)
146
147 # end q3map2 ----------------------------------------------------------------------
148
149 # q3data ---------------------------------------------------------------------------
150
151 q3data_env = q3map_env.Copy()
152
153 q3data_common_src = [
154   'common/aselib.c',
155   'common/bspfile.c',
156   'common/cmdlib.c',
157   'common/imagelib.c',
158   'common/inout.c',
159   'common/scriplib.c',
160   'common/trilib.c',
161   'common/unzip.c',
162   'common/vfs.c'
163   ]
164
165 q3data_src = [
166   'q3data/3dslib.c',
167   'q3data/compress.c',
168   'q3data/images.c',
169   'q3data/md3lib.c',
170   'q3data/models.c',
171   'q3data/p3dlib.c',
172   'q3data/polyset.c',
173   'q3data/q3data.c',
174   'q3data/stripper.c',
175   'q3data/video.c' ]
176
177 q3data_full_src = [ ]
178 for i in q3data_common_src + q3data_src:
179   q3data_full_src.append('tools/quake3/' + i)
180
181 q3data_full_src.append('libs/libmathlib.a')
182 q3data_full_src.append('libs/libl_net.a')
183
184 q3data_env.Program( target = 'q3data.' + g_cpu, source = q3data_full_src )
185 q3data_env.Install( INSTALL, 'q3data.' + g_cpu )
186
187 # end q3data ----------------------------------------------------------------------
188
189 # q2_tools ---------------------------------------------------------------------------
190
191 q2_tools_env = g_env.Copy()
192 q2_tools_env['CPPPATH'].append('include')
193 q2_tools_env.useXML2()
194 q2_tools_env.usePThread()
195 q2_tools_env.Prepend(CPPPATH='tools/quake2/common')
196
197 q2_tools_common_src = [
198   'common/bspfile.c',
199   'common/cmdlib.c',
200   'common/inout.c',
201   'common/l3dslib.c',
202   'common/lbmlib.c',
203   'common/mathlib.c',
204   'common/path_init.c',
205   'common/polylib.c',
206   'common/scriplib.c',
207   'common/threads.c',
208   'common/trilib.c'
209 ]
210
211
212 q2_tools_q2map_src = [
213   'q2map/brushbsp.c',
214   'q2map/csg.c',
215   'q2map/faces.c',
216   'q2map/flow.c',
217   'q2map/glfile.c',
218   'q2map/leakfile.c',
219   'q2map/lightmap.c',
220   'q2map/main.c',
221   'q2map/map.c',
222   'q2map/nodraw.c',
223   'q2map/patches.c',
224   'q2map/portals.c',
225   'q2map/prtfile.c',
226   'q2map/qbsp.c',
227   'q2map/qrad.c',
228   'q2map/qvis.c',
229   'q2map/textures.c',
230   'q2map/trace.c',
231   'q2map/tree.c',
232   'q2map/writebsp.c'
233 ]
234
235 q2_tools_qdata3_common_src = [
236   'common/bspfile.c',
237   'common/cmdlib.c',
238   'common/inout.c',
239   'common/l3dslib.c',
240   'common/lbmlib.c',
241   'common/mathlib.c',
242   'common/path_init.c',
243   'common/scriplib.c',
244   'common/threads.c',
245   'common/trilib.c'
246 ]
247
248 q2_tools_qdata3_src = [
249   'qdata/images.c',
250   'qdata/models.c',
251   'qdata/qdata.c',
252   'qdata/sprites.c',
253   'qdata/tables.c',
254   'qdata/video.c'
255 ]
256
257 q2_tools_q2map_full_src = [ ]
258 for i in q2_tools_common_src + q2_tools_q2map_src:
259   q2_tools_q2map_full_src.append('tools/quake2/' + i)
260
261 q2_tools_q2map_full_src.append('libs/libl_net.a')
262
263 q2_tools_qdata3_full_src = [ ]
264 for i in q2_tools_common_src + q2_tools_qdata3_src:
265   q2_tools_qdata3_full_src.append('tools/quake2/' + i)
266
267 q2_tools_qdata3_full_src.append('libs/libl_net.a')
268
269 if ( OS != 'Darwin' ):
270         q2_tools_env.Program(target='quake2_tools/q2map', source=q2_tools_q2map_full_src )
271         q2_tools_env.Install(INSTALL + '/q2', 'quake2_tools/q2map' )
272
273         q2_tools_env.Program(target='quake2_tools/qdata3', source=q2_tools_qdata3_full_src )
274         q2_tools_env.Install(INSTALL + '/q2', 'quake2_tools/qdata3' )
275
276
277 # end q2_tools ----------------------------------------------------------------------
278
279 # qdata3_heretic2 ---------------------------------------------------------------------------
280
281 heretic2_tools_env = g_env.Copy()
282 heretic2_tools_env['CPPPATH'].append('include')
283 heretic2_tools_env.useXML2()
284 heretic2_tools_env.usePThread()
285 heretic2_tools_env.Prepend(CPPPATH='tools/quake2/qdata_heretic2')
286 heretic2_tools_env.Prepend(CPPPATH='tools/quake2/qdata_heretic2/qcommon')
287 heretic2_tools_env.Prepend(CPPPATH='tools/quake2/qdata_heretic2/common')
288
289 heretic2_tools_qdata3_common_src = [
290   'qdata_heretic2/common/bspfile.c',
291   'qdata_heretic2/common/cmdlib.c',
292   'qdata_heretic2/common/inout.c',
293   'qdata_heretic2/common/l3dslib.c',
294   'qdata_heretic2/common/lbmlib.c',
295   'qdata_heretic2/common/mathlib.c',
296   'qdata_heretic2/common/path_init.c',
297   'qdata_heretic2/common/qfiles.c',
298   'qdata_heretic2/common/scriplib.c',
299   'qdata_heretic2/common/threads.c',
300   'qdata_heretic2/common/token.c',
301   'qdata_heretic2/common/trilib.c'
302 ]
303
304 heretic2_tools_qdata3_qcommon_src = [
305   'qdata_heretic2/qcommon/reference.c',
306   'qdata_heretic2/qcommon/resourcemanager.c',
307   'qdata_heretic2/qcommon/skeletons.c'
308 ]
309
310 heretic2_tools_qdata3_src = [
311   'qdata_heretic2/animcomp.c',
312   'qdata_heretic2/book.c',
313   'qdata_heretic2/fmodels.c',
314   'qdata_heretic2/images.c',
315   'qdata_heretic2/jointed.c',
316   'qdata_heretic2/models.c',
317   'qdata_heretic2/pics.c',
318   'qdata_heretic2/qdata.c',
319   'qdata_heretic2/qd_skeletons.c',
320   'qdata_heretic2/sprites.c',
321   'qdata_heretic2/svdcmp.c',
322   'qdata_heretic2/tables.c',
323   'qdata_heretic2/tmix.c',
324   'qdata_heretic2/video.c'
325 ]
326
327 heretic2_tools_qdata3_full_src = [ ]
328 for i in heretic2_tools_qdata3_common_src + heretic2_tools_qdata3_qcommon_src + heretic2_tools_qdata3_src:
329   heretic2_tools_qdata3_full_src.append('tools/quake2/' + i)
330
331 heretic2_tools_qdata3_full_src.append('libs/libl_net.a')
332
333 heretic2_tools_env['CCFLAGS'] += '-D_LINUX '
334
335 if ( OS != 'Darwin' ):
336         heretic2_tools_env.Program(target='heretic2_tools/qdata3', source=heretic2_tools_qdata3_full_src )
337         heretic2_tools_env.Install(INSTALL + '/heretic2', 'heretic2_tools/qdata3' )
338
339         heretic2_q2map_env = q2_tools_env
340         heretic2_q2map_env.Install(INSTALL + '/heretic2', 'quake2_tools/q2map' )
341
342 # end heretic2_tools ----------------------------------------------------------------------
343
344
345
346 # radiant, modules and plugins ----------------------------------------------------
347
348 module_env = g_env.Copy()
349 module_env['CPPPATH'].append('include')
350 if ( OS == 'Darwin' ):
351         module_env['LINKFLAGS'] += '-dynamiclib -ldl '
352 else:
353         module_env['LINKFLAGS'] += '-ldl '
354 module_env['LIBPREFIX'] = ''
355 module_env.useGlib2()
356 module_env.useXML2()
357
358 module_env.SharedLibrarySafe(target='fgd', source=['plugins/eclassfgd/plugin.cpp', 'libs/libsynapse.a'])
359 module_env.Install(INSTALL + '/modules', 'fgd.so')
360
361 vfspk3_lst=build_list('plugins/vfspk3', 'vfspk3.cpp vfs.cpp unzip.cpp')
362 vfspk3_lst.append('libs/libsynapse.a')
363 module_env.SharedLibrarySafe(target='vfspk3', source=vfspk3_lst)
364 module_env.Install(INSTALL + '/modules', 'vfspk3.so')
365
366 vfswad_lst=build_list('plugins/vfswad', 'unwad.cpp vfs.cpp vfswad.cpp')
367 vfswad_lst.append('libs/libsynapse.a')
368 module_env.SharedLibrarySafe(target='vfswad', source=vfswad_lst)
369 module_env.Install(INSTALL + '/modules', 'vfswad.so')
370
371 vfspak_lst=build_list('plugins/vfspak', 'vfspak.cpp vfs.cpp')
372 vfspak_lst.append('libs/libsynapse.a')
373 module_env.SharedLibrarySafe(target='vfspak', source=vfspak_lst)
374 module_env.Install(INSTALL + '/q2/modules', 'vfspak.so')
375 module_env.Install(INSTALL + '/heretic2/modules', 'vfspak.so')
376
377 shaders_lst=build_list('plugins/shaders', 'shaders.cpp plugin.cpp')
378 shaders_lst.append('libs/libsynapse.a')
379 module_env.SharedLibrarySafe(target='shaders', source=shaders_lst)
380 module_env.Install(INSTALL + '/modules', 'shaders.so')
381
382 image_lst=build_list('plugins/image', 'jpeg.cpp image.cpp lbmlib.cpp')
383 image_lst.append('libs/libsynapse.a')
384 image_lst.append('libs/libjpeg.a')
385 module_env.SharedLibrarySafe(target='image', source=image_lst)
386 module_env.Install(INSTALL + '/modules', 'image.so')
387
388 imagewal_lst=build_list('plugins/imagewal', 'wal.cpp imagewal.cpp')
389 imagewal_lst.append('libs/libsynapse.a')
390 module_env.SharedLibrarySafe(target='imagewal', source=imagewal_lst)
391 module_env.Install(INSTALL + '/q2/modules', 'imagewal.so')
392
393 imagem8_lst=build_list('plugins/imagem8', 'm8.cpp m32.cpp imagem8.cpp')
394 imagem8_lst.append('libs/libsynapse.a')
395 module_env.SharedLibrarySafe(target='imagem8', source=imagem8_lst)
396 module_env.Install(INSTALL + '/heretic2/modules', 'imagem8.so')
397
398 imagehl_lst=build_list('plugins/imagehl', 'imagehl.cpp lbmlib.cpp')
399 imagehl_lst.append('libs/libsynapse.a')
400 module_env.SharedLibrarySafe(target='imagehl', source=imagehl_lst)
401 module_env.Install(INSTALL + '/modules', 'imagehl.so')
402
403 imagepng_lst=build_list('plugins/imagepng', 'plugin.cpp')
404 imagepng_lst.append('libs/libsynapse.a')
405 module_env.usePNG()
406 module_env.SharedLibrarySafe(target='imagepng', source=imagepng_lst)
407 module_env.Install(INSTALL + '/modules', 'imagepng.so')
408
409 map_lst=build_list('plugins/map', 'plugin.cpp parse.cpp write.cpp')
410 map_lst.append('libs/libsynapse.a')
411 map_lst.append('libs/libcmdlib.a')
412 module_env.SharedLibrarySafe(target='map', source=map_lst)
413 module_env.Install(INSTALL + '/modules', 'map.so')
414
415 mapxml_lst=build_list('plugins/mapxml', 'plugin.cpp xmlparse.cpp xmlwrite.cpp')
416 mapxml_lst.append('libs/libsynapse.a')
417 module_env.SharedLibrarySafe(target='mapxml', source=mapxml_lst)
418 module_env.Install(INSTALL + '/modules', 'mapxml.so')
419
420 model_lst=build_list('plugins/model', 'plugin.cpp model.cpp cpicomodel.cpp cpicosurface.cpp remap.cpp')
421 model_lst.append('libs/libsynapse.a')
422 model_lst.append('libs/libpicomodel.a')
423 model_lst.append('libs/libmathlib.a')
424 module_env.SharedLibrarySafe(target='model', source=model_lst)
425 module_env.Install(INSTALL + '/modules', 'model.so')
426
427 entity_lst = build_list('plugins/entity', 'plugin.cpp entity_entitymodel.cpp miscmodel.cpp eclassmodel.cpp entity.cpp light.cpp')
428 entity_lst.append('libs/libsynapse.a')
429 entity_lst.append('libs/libmathlib.a')
430 module_env.SharedLibrarySafe(target='entity', source=entity_lst)
431 module_env.Install(INSTALL + '/modules', 'entity.so')
432
433 bob_env = module_env.Copy()
434 bob_env.useGtk2()
435 bob_lst = build_list('contrib/bobtoolz/',
436 'dialogs/dialogs-gtk.cpp bobToolz-GTK.cpp bsploader.cpp cportals.cpp DBobView.cpp \
437 DBrush.cpp DEntity.cpp DEPair.cpp DListener.cpp DMap.cpp DPatch.cpp DPlane.cpp DPoint.cpp \
438 DShape.cpp DTrainDrawer.cpp DTreePlanter.cpp DVisDrawer.cpp DWinding.cpp funchandlers-GTK.cpp \
439 lists.cpp misc.cpp ScriptParser.cpp shapes.cpp visfind.cpp')
440 bob_lst.append('libs/libsynapse.a')
441 bob_lst.append('libs/libmathlib.a')
442 bob_lst.append('libs/libcmdlib.a')
443 bob_env['CPPPATH'].append('contrib/bobtoolz/dialogs')
444 bob_env.SharedLibrarySafe(target='bobtoolz', source=bob_lst)
445 bob_env.Install(INSTALL + '/plugins', 'bobtoolz.so')
446
447 camera_lst = build_list('contrib/camera', 
448 'camera.cpp dialogs.cpp dialogs_common.cpp funchandlers.cpp listener.cpp misc.cpp renderer.cpp')
449 camera_lst.append('libs/libsynapse.a')
450 camera_lst.append('libs/libsplines.a')
451 bob_env.SharedLibrarySafe(target='camera', source=camera_lst)
452 bob_env.Install(INSTALL + '/plugins', 'camera.so')
453
454 prtview_lst = build_list('contrib/prtview', 
455 'AboutDialog.cpp ConfigDialog.cpp LoadPortalFileDialog.cpp portals.cpp prtview.cpp')
456 prtview_lst.append('libs/libsynapse.a')
457 prtview_env = bob_env.Copy()
458 prtview_env['CXXFLAGS'] += '-DGTK_PLUGIN '
459 prtview_env.SharedLibrarySafe(target='prtview', source=prtview_lst)
460 prtview_env.Install(INSTALL + '/plugins', 'prtview.so')
461
462 gensurf_lst = build_list('contrib/gtkgensurf',
463 'bitmap.cpp dec.cpp face.cpp font.cpp gendlgs.cpp genmap.cpp gensurf.cpp heretic.cpp plugin.cpp view.cpp triangle.c')
464 gensurf_lst.append('libs/libsynapse.a')
465 bob_env.SharedLibrarySafe(target='gensurf', source=gensurf_lst)
466 bob_env.Install(INSTALL + '/plugins', 'gensurf.so')
467
468 surface_lst = build_list('plugins/surface', 'surfdlg_plugin.cpp surfacedialog.cpp')
469 surface_lst.append('libs/libsynapse.a')
470 surface_lst.append('libs/libmathlib.a')
471 surface_env = module_env.Copy()
472 surface_env.useGtk2()
473 surface_env.SharedLibrarySafe(target='surface', source=surface_lst)
474 surface_env.Install(INSTALL + '/modules', 'surface.so')
475
476 surface_quake2_lst = build_list('plugins/surface_quake2', 'surfdlg_plugin.cpp surfacedialog.cpp surfaceflagsdialog_quake2.cpp')
477 surface_quake2_lst.append('libs/libsynapse.a')
478 surface_quake2_lst.append('libs/libmathlib.a')
479 surface_quake2_env = module_env.Copy()
480 surface_quake2_env.useGtk2()
481 surface_quake2_env.SharedLibrarySafe(target='surface_quake2', source=surface_quake2_lst)
482 surface_quake2_env.Install(INSTALL + '/q2/modules', 'surface_quake2.so')
483
484 surface_heretic2_lst = build_list('plugins/surface_heretic2', 'surfdlg_plugin.cpp surfacedialog.cpp surfaceflagsdialog_heretic2.cpp')
485 surface_heretic2_lst.append('libs/libsynapse.a')
486 surface_heretic2_lst.append('libs/libmathlib.a')
487 surface_heretic2_env = module_env.Copy()
488 surface_heretic2_env.useGtk2()
489 surface_heretic2_env.SharedLibrarySafe(target='surface_heretic2', source=surface_heretic2_lst)
490 surface_heretic2_env.Install(INSTALL + '/heretic2/modules', 'surface_heretic2.so')
491
492 bkgrnd2d_list = build_list( 'contrib/bkgrnd2d', 'bkgrnd2d.cpp plugin.cpp dialog.cpp' )
493 bkgrnd2d_list.append( 'libs/libsynapse.a' )
494 bkgrnd2d_env = module_env.Copy()
495 bkgrnd2d_env.useGtk2()
496 bkgrnd2d_env.SharedLibrarySafe( target='bkgrnd2d', source=bkgrnd2d_list )
497 bkgrnd2d_env.Install( INSTALL + '/plugins', 'bkgrnd2d.so' )
498
499 radiant_env = g_env.Copy()
500 radiant_env['CPPPATH'].append('include')
501 radiant_env['LINKFLAGS'] += '-ldl '
502 if ( OS == 'Darwin' ):
503   radiant_env['CXXFLAGS'] += '-fno-common '
504   radiant_env['CCFLAGS'] += '-fno-common '
505   radiant_env['LINKFLAGS'] += '-lX11 -lGL -lGLU '
506 radiant_env['LIBPREFIX'] = ''
507 radiant_env.useGlib2()
508 radiant_env.useXML2()
509 radiant_env.useGtk2()
510 radiant_env.useGtkGLExt()
511
512 radiant_src=[ 'qgl.c', 'brush.cpp', 'brush_primit.cpp', 'brushscript.cpp', 'camwindow.cpp', 'csg.cpp',
513  'dialog.cpp', 'dialoginfo.cpp', 'drag.cpp', 'eclass.cpp', 'eclass_def.cpp', 'error.cpp', 'feedback.cpp',
514  'file.cpp', 'findtexturedialog.cpp', 'glinterface.cpp', 'glwidget.cpp', 'glwindow.cpp', 'groupdialog.cpp', 
515  'gtkdlgs.cpp', 'gtkmisc.cpp', 'main.cpp', 'mainframe.cpp', 'map.cpp', 'missing.cpp', 'parse.cpp', 
516  'patchdialog.cpp', 'pluginentities.cpp', 'pluginmanager.cpp', 'pmesh.cpp', 'points.cpp', 'preferences.cpp', 
517  'profile.cpp', 'qe3.cpp', 'qgl_ext.cpp', 'select.cpp', 'selectedface.cpp', 'surfacedialog.cpp',
518  'surfaceplugin.cpp', 'targetname.cpp', 'texmanip.cpp', 'texwindow.cpp', 'undo.cpp', 'vertsel.cpp', 
519  'watchbsp.cpp', 'winding.cpp', 'xywindow.cpp', 'z.cpp', 'zwindow.cpp', 'filters.cpp', 'bp_dlg.cpp', 'ui.cpp' ]
520
521 for i in range(len(radiant_src)):
522   radiant_src[i] = 'radiant/' + radiant_src[i]
523
524 radiant_src.append('libs/libmathlib.a')
525 radiant_src.append('libs/libcmdlib.a')
526 radiant_src.append('libs/libl_net.a')
527 radiant_src.append('libs/libsynapse.a')
528
529 radiant_env.Program(target='radiant.' + g_cpu, source=radiant_src)
530 radiant_env.Install(INSTALL, 'radiant.' + g_cpu)
531
532 # setup -------------------------------------------------------------------------------------------
533
534 class setup_builder:
535
536   g_dryrun = 0
537   
538   def system(self, cmd):
539     if (self.g_dryrun):
540       print cmd
541     else:
542       sys.stdout.write(cmd)
543       ret = commands.getstatusoutput(cmd)
544       print ret[1]
545       if (ret[0] != 0):
546         raise 'command failed'
547
548   def copy_core(self):
549     # binaries and misc
550     self.system('mkdir -p %s/modules' % self.SETUP_BIN_DIR)
551     self.system('mkdir -p %s/plugins' % self.SETUP_BIN_DIR)
552     self.system('cp install/%s %s' % (self.EDITOR_BIN, self.SETUP_BIN_DIR))
553     self.system('cp install/modules/*.so %s/modules' % self.SETUP_BIN_DIR )
554     self.system('cp install/plugins/*.so %s/plugins' % self.SETUP_BIN_DIR )
555     self.system('cp install/q3map2.%s %s' % ( g_cpu, self.SETUP_BIN_DIR ) )
556     self.M4_STDC = ''
557     if (not self.g_darwin):    
558       # fugly
559       # copy libgcc_s and stdc++ over to distribute it and reduce potential ABI fuckups
560       ret = commands.getstatusoutput('ldd -r install/' + self.EDITOR_BIN + ' 2>/dev/null | grep libgcc_s | sed -e \'s/.* => \\([^ ]*\\) .*/\\1/\'')
561       if (ret[0] != 0):
562         raise 'ldd command failed'
563       self.system('cp ' + ret[1] + ' ' + self.SETUP_BIN_DIR)
564       ret = commands.getstatusoutput('ldd -r install/' + self.EDITOR_BIN + ' 2>/dev/null | grep libstdc++ | sed -e \'s/.* => \\([^ ]*\\) .*/\\1/\'')
565       if (ret[0] != 0):
566         raise 'ldd command failed'
567       lines = string.split(ret[1], '\n')
568       self.M4_STDC = '"' 
569       for i in lines:
570         self.system('cp ' + i + ' ' + self.SETUP_BIN_DIR)
571         self.M4_STDC += os.path.basename(i) + ' \n'
572       self.M4_STDC += '"'
573     # hack for symlink
574     # setup process generates the wrapper at install time
575     # but we need a dummy executable for symlink in loki_setup
576     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));
577     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));
578     ## this goes to the core install directory
579     DEST = self.SETUP_DIR + '/core'
580     self.system('mkdir -p ' + DEST + '/modules/bitmaps')
581     # general content stuff
582     self.system('cp -R plugins/model/bitmaps/* ' + DEST + '/modules/bitmaps')
583     self.system('cp -R setup/data/tools/* ' + DEST)
584     self.system('cp -R radiant/bitmaps ' + DEST)
585     self.system('cp setup/changelog.txt ' + DEST)
586     self.system('cp setup/openurl.sh ' + DEST)
587     self.system('cp tools/quake3/q3map2/changelog.q3map2.txt ' + DEST)
588     # documentation
589     self.system('cp -R docs/manual/Q3Rad_Manual ' + DEST)
590     self.system('cp -R docs/manual/quake3/Compile_Manual ' + DEST)
591     self.system('cp -R docs/manual/quake3/Model_Manual ' + DEST)
592     self.system('cp -R docs/manual/quake3/Terrain_Manual ' + DEST)
593     # copy plugins media
594     self.system('mkdir -p ' + DEST + '/plugins/bitmaps')
595     self.system('cp -R contrib/bobtoolz/bitmaps/* ' + DEST + '/plugins/bitmaps')
596     self.system('cp -R contrib/bobtoolz/bt ' + DEST + '/plugins')
597     self.system('cp -R contrib/camera/bitmaps/* ' + DEST + '/plugins/bitmaps' )
598     self.system('cp -R contrib/bkgrnd2d/bitmaps/* ' + DEST + '/plugins/bitmaps' )
599   
600   def copy_q3(self):
601     # binaries
602     self.system('mkdir -p ' + self.SETUP_BIN_DIR + '/q3')
603     if ( self.g_darwin == 0 ):
604       self.system('cp setup/linux/bspc ' + self.SETUP_BIN_DIR + '/q3')
605
606     # goes in core
607     DEST = self.SETUP_DIR + '/core/q3'
608     self.system('mkdir -p ' + DEST)
609     self.system('cp setup/data/tools/synapse.config ' + DEST)
610     self.system('cp setup/data/tools/game.xlink ' + DEST)
611     self.system('cp -R docs/manual/quake3/Team_Arena_Mapping_Help ' + DEST)
612     self.system('cp -R docs/manual/quake3/New_Teams_For_Q3TA ' + DEST)
613     self.system('cp -R docs/manual/quake3/Q3AShader_Manual ' + DEST)
614   
615     # goes in the game install path
616     DEST = self.SETUP_DIR + '/q3'
617     self.system('mkdir -p ' + DEST)
618     self.system('cp -R setup/data/baseq3 ' + DEST)
619     self.system('cp -R setup/data/missionpack ' + DEST)
620
621   def copy_wolf(self):
622     # binaries
623     self.system('mkdir -p ' + self.SETUP_BIN_DIR + '/wolf')
624     if ( self.g_darwin == 0 ):
625       self.system('cp ../WolfPack/bin/Linux/bspc ' + self.SETUP_BIN_DIR + '/wolf')
626   
627     # goes in core
628     DEST = self.SETUP_DIR + '/core/wolf'
629     self.system('mkdir -p ' + DEST)
630     self.system('cp ../WolfPack/synapse.config ' + DEST)
631     self.system('cp -R ../WolfPack/docs ' + DEST)
632     self.system('cp ../WolfPack/game.xlink ' + DEST)
633     self.system('cp ../WolfPack/bin/aascfg_lg.c ' + DEST)
634     self.system('cp ../WolfPack/bin/aascfg_sm.c ' + DEST)
635     self.system('cp ../WolfPack/bin/bspc.ai ' + DEST)
636
637     # goes in the game install path
638     DEST = self.SETUP_DIR + '/wolf/main'
639     self.system('mkdir -p ' + DEST)
640     self.system('cp ../WolfPack/astro-skies.pk3 ' + DEST)
641     self.system('cp ../WolfPack/common-astro-spog.pk3 ' + DEST)
642     self.system('cp ../WolfPack/lights.pk3 ' + DEST)      
643     self.system('cp -R ../WolfPack/scripts ' + DEST)
644     self.system('cp -R ../WolfPack/maps ' + DEST)
645     self.system('cp -R ../WolfPack/models ' + DEST)
646   
647   def copy_et(self):
648     # goes in core
649     DEST = self.SETUP_DIR + '/core/et'
650     self.system('mkdir -p ' + DEST)    
651     self.system('cp -R ../ETPack/bitmaps ' + DEST)
652     self.system('cp -R ../ETPack/docs ' + DEST)
653     self.system('cp ../ETPack/game.xlink ' + DEST)
654     self.system('cp ../ETPack/synapse.config ' + DEST)
655     
656     # goes in game install path
657     DEST = self.SETUP_DIR + '/et/etmain'
658     self.system('mkdir -p ' + DEST)
659     self.system('cp ../ETPack/astro-skies.pk3 ' + DEST)
660     self.system('cp ../ETPack/common.pk3 ' + DEST)
661     self.system('cp ../ETPack/goldrush.pcx ' + DEST)    
662     self.system('cp ../ETPack/lights.pk3 ' + DEST)
663     self.system('cp ../ETPack/mapmedia.pk3 ' + DEST)
664     self.system('cp -R ../ETPack/scripts ' + DEST)
665     self.system('cp -R ../ETPack/maps ' + DEST)
666     self.system('cp -R ../ETPack/models ' + DEST)
667
668   def copy_q2(self):
669     # binaries
670     self.system('cp -R install/q2 %s' % (self.SETUP_BIN_DIR))
671
672     # goes in core
673     DEST = self.SETUP_DIR + '/core/q2'
674     self.system('mkdir -p ' + DEST + '/modules')
675     self.system('cp ../Q2Pack/game.xlink ' + DEST)
676     self.system('cp ../Q2Pack/synapse.config ' + DEST)
677     self.system('cp install/q2/q2map install/q2/qdata3 ' + DEST) 
678     self.system('cp -R install/q2/modules ' + DEST )
679
680     # goes in game install path
681     DEST = self.SETUP_DIR + '/q2'
682     self.system('mkdir -p ' + DEST +  '/baseq2')
683     self.system('cp -R ../Q2Pack/baseq2/* ' + DEST + '/baseq2')
684
685   def copy_her2(self):
686     # binaries
687     self.system('cp -R install/heretic2 %s' % (self.SETUP_BIN_DIR))
688
689     # goes in core
690     DEST = self.SETUP_DIR + '/core/heretic2'
691     self.system('mkdir -p ' + DEST + '/modules')
692     self.system('cp ../Her2Pack/game.xlink ' + DEST)
693     self.system('cp ../Her2Pack/synapse.config ' + DEST)
694     self.system('cp install/q2/q2map install/heretic2/qdata3 ' + DEST)
695     self.system('cp -R install/heretic2/modules ' + DEST )
696
697     # goes in game install path
698     DEST = self.SETUP_DIR + '/heretic2'
699     self.system('mkdir -p ' + DEST +  '/base')
700     self.system('cp -R ../Her2Pack/base/* ' + DEST + '/base')
701
702   def build_setup(self):
703     self.system( 'cp -R ' + self.SETUP_IMAGE_OS + '/* ' + self.SETUP_DIR )
704     self.system( 'cp -fR ' + self.SETUP_IMAGE + '/* ' + self.SETUP_DIR )
705     self.system('cp setup/license.txt ' + self.SETUP_DIR)
706     self.system('cp setup/linux/README ' + self.SETUP_DIR)
707     OS_DEFS=''
708     if (self.g_darwin):
709       OS_DEFS='--define=M4_OSX'
710     M4_LINE = OS_DEFS + ' --define=M4_VER_MAJOR=' + self.major + ' --define=M4_VER_MINOR=' + self.minor + ' --define=M4_VER=' + self.line 
711     M4_LINE += ' --define=M4_GAME_ET=%d' % self.DO_GAME_ET
712     M4_LINE += ' --define=M4_GAME_Q2=%d' % self.DO_GAME_Q2
713     if ( self.M4_STDC != '' ):
714       M4_LINE += ' --define=M4_STDC=' + self.M4_STDC 
715     # setup.xml
716     self.system('m4 ' + M4_LINE + ' ' + self.SETUP_DIR + '/setup.data/setup.xml.in > ' + self.SETUP_DIR + '/setup.data/setup.xml')
717     # postinstall.sh
718     self.system('m4 ' + M4_LINE + ' ' + self.SETUP_DIR + '/setup.data/postinstall.sh.in > ' + self.SETUP_DIR + '/setup.data/postinstall.sh')
719     # config.sh
720     self.system('m4 ' + M4_LINE + ' ' + self.SETUP_DIR + '/setup.data/config.sh.in > ' + self.SETUP_DIR + '/setup.data/config.sh')
721     # setup.sh
722     self.system('m4 ' + M4_LINE + ' ' + self.SETUP_DIR + '/setup.sh.in > ' + self.SETUP_DIR + '/setup.sh')
723     self.system('chmod +x ' +self.SETUP_DIR + '/setup.sh')
724     self.system('find ' + self.SETUP_DIR + ' -name .svn | while read i ; do rm -r "$i" ; done')
725     # pack it up
726     self.system('setup/linux/makeself/makeself.sh ' + self.SETUP_DIR + ' ' + self.SETUP_TARGET + ' "GtkRadiant ' + self.line + ' setup" ./setup.sh')
727     if (self.g_darwin):
728       def build_fink_deb(self):
729         print "Building installer .deb\n"
730         self.F_REV = '1'
731         self.FINKINFO_DIR = '/sw/fink/10.2/unstable/main/finkinfo/games'
732         self.TARBALL_DIR='radiant-' + self.F_REV + '.' + self.major 
733         self.TARBALL_NAME='radiant-' + self.F_REV + '.' + self.major + '.tar.gz'
734         self.TARBALL_DEST='/sw/src'
735
736         # prepare package description
737         self.system('mkdir -p ' + self.FINKINFO_DIR)
738         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')
739
740         # build the tarball
741         self.system('if [ -r /tmp/' + self.TARBALL_DIR + ' ] ; then rm -r ' '/tmp/' + self.TARBALL_DIR + ' ; fi')
742         self.system('mkdir -p ' '/tmp/' + self.TARBALL_DIR)
743         self.system('cp ' + self.SETUP_TARGET + ' ' + '/tmp/' + self.TARBALL_DIR)
744         self.system('cd /tmp ; tar -cvzf ' + self.TARBALL_NAME + ' ' + self.TARBALL_DIR + ' ; cp ' + self.TARBALL_NAME + ' ' + self.TARBALL_DEST + '/')
745         self.system('/sw/bin/fink rebuild radiant')
746
747         build_fink_deb(self)
748       
749   def spawn_setup(self, env, target, source):
750     if ( OS == 'Darwin' ):
751       self.g_darwin = 1
752     else:
753       self.g_darwin = 0
754     (self.line, self.major, self.minor) = get_version()
755     print 'Setup: GtkRadiant %s' % self.line  
756     if ( self.g_darwin ):
757       self.SETUP_IMAGE_OS = '../loki_setup/image'
758     else:
759       self.SETUP_IMAGE_OS = 'setup/linux/setup_image.Linux'
760     self.SETUP_IMAGE = 'setup/linux/setup_image'
761     self.SETUP_DIR = '/tmp/radiant-setup.%d' % os.getpid()
762     self.EDITOR_BIN='radiant.' + g_cpu
763     if ( self.g_darwin ):
764       self.SETUP_BIN_DIR = self.SETUP_DIR + '/bin/Darwin/ppc'
765       self.SETUP_TARGET = 'osx-radiant-%s.run' % self.line
766     else:
767       self.SETUP_BIN_DIR = self.SETUP_DIR + '/bin/Linux/x86'
768       self.SETUP_TARGET = 'linux-radiant-%s.run' % self.line
769     # TODO: eval a conf file instead
770     self.DO_CORE=1
771     self.DO_GAME_Q3=1
772     self.DO_GAME_WOLF=1
773     self.DO_GAME_ET=1
774     self.DO_GAME_Q2=1
775     self.DO_GAME_HER2=1
776     if ( self.g_darwin ):
777       self.DO_GAME_Q2=0
778       self.DO_GAME_ET=0
779       self.DO_GAME_HER2=0
780     # verbose a bit
781     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)
782     if (self.DO_CORE):
783       self.copy_core()
784     if (self.DO_GAME_Q3):
785       self.copy_q3()
786     if (self.DO_GAME_WOLF):
787       self.copy_wolf()
788     if (self.DO_GAME_ET):
789       self.copy_et()
790     if (self.DO_GAME_Q2):
791       self.copy_q2()
792     if (self.DO_GAME_HER2):
793       self.copy_her2()
794     self.build_setup()
795     return 0
796     
797 def spawn_setup(env, target, source):
798   setup = setup_builder()
799   setup.spawn_setup(env, target, source)
800
801 # NOTE: could modify g_env to add the deps auto when calling SharedLibrarySafe ..
802 if (SETUP == '1'):
803   g_env.Command('foo', INSTALL + '/radiant.' + g_cpu, [ spawn_setup ] )
804   depends_list = [ 
805     INSTALL + '/modules/entity.so',
806     INSTALL + '/modules/fgd.so',
807     INSTALL + '/modules/imagehl.so',
808     INSTALL + '/modules/image.so',
809     INSTALL + '/modules/imagepng.so',
810     INSTALL + '/modules/map.so',
811     INSTALL + '/modules/mapxml.so',
812     INSTALL + '/modules/model.so',
813     INSTALL + '/modules/shaders.so',
814     INSTALL + '/modules/surface.so',
815     INSTALL + '/modules/vfspk3.so',
816     INSTALL + '/modules/vfswad.so',
817     INSTALL + '/plugins/bobtoolz.so',
818     INSTALL + '/plugins/camera.so',
819     INSTALL + '/plugins/prtview.so',
820     INSTALL + '/plugins/gensurf.so',
821     INSTALL + '/plugins/bkgrnd2d.so',
822     INSTALL + '/q3map2.' + g_cpu,
823     INSTALL + '/radiant.' + g_cpu,
824     INSTALL + '/q3data.' + g_cpu ]
825   if ( OS != 'Darwin' ):
826     depends_list += [
827       INSTALL + '/q2/modules/imagewal.so',
828       INSTALL + '/q2/modules/surface_quake2.so',
829       INSTALL + '/q2/modules/vfspak.so',
830       INSTALL + '/q2/q2map',
831       INSTALL + '/q2/qdata3',
832       INSTALL + '/heretic2/modules/imagem8.so',
833       INSTALL + '/heretic2/modules/surface_heretic2.so',
834       INSTALL + '/heretic2/modules/vfspak.so',
835       INSTALL + '/heretic2/qdata3',
836       INSTALL + '/heretic2/q2map' ]
837   g_env.Depends( 'foo', depends_list )
838
839 # end setup ---------------------------------------------------------------------------------------