SConscript revision a010215463c63680c69e90202fe3fcd2e5b25fa6
1#######################################################################
2# SConscript for Mesa
3
4
5Import('*')
6import filecmp
7import os
8import subprocess
9from sys import executable as python_cmd
10
11env = env.Clone()
12
13env.Append(CPPPATH = [
14    '#/src/mapi',
15    '#/src/glsl',
16    '#/src/mesa',
17])
18
19env.Append(CPPDEFINES = [
20    'FEATURE_GL=1',
21])
22
23if env['platform'] == 'windows':
24    env.Append(CPPDEFINES = [
25        '_GDI32_', # prevent gl* being declared __declspec(dllimport) in MS headers
26        'BUILD_GL32', # declare gl* as __declspec(dllexport) in Mesa headers
27    ])
28    if not env['gles']:
29        # prevent _glapi_* from being declared __declspec(dllimport)
30        env.Append(CPPDEFINES = ['_GLAPI_NO_EXPORTS'])
31else:
32    env.Append(CPPDEFINES = [
33        'IN_DRI_DRIVER', # enable the remap table (for DRI drivers)
34    ])
35
36#
37# Source files
38#
39
40main_sources = [
41    'main/api_arrayelt.c',
42    'main/api_exec.c',
43    'main/api_loopback.c',
44    'main/api_validate.c',
45    'main/accum.c',
46    'main/arbprogram.c',
47    'main/atifragshader.c',
48    'main/attrib.c',
49    'main/arrayobj.c',
50    'main/blend.c',
51    'main/bufferobj.c',
52    'main/buffers.c',
53    'main/clear.c',
54    'main/clip.c',
55    'main/colortab.c',
56    'main/condrender.c',
57    'main/context.c',
58    'main/convolve.c',
59    'main/cpuinfo.c',
60    'main/debug.c',
61    'main/depth.c',
62    'main/dlist.c',
63    'main/drawpix.c',
64    'main/drawtex.c',
65    'main/enable.c',
66    'main/enums.c',
67    'main/errors.c',
68    'main/eval.c',
69    'main/execmem.c',
70    'main/extensions.c',
71    'main/fbobject.c',
72    'main/feedback.c',
73    'main/ff_fragment_shader.cpp',
74    'main/ffvertex_prog.c',
75    'main/fog.c',
76    'main/formats.c',
77    'main/format_pack.c',
78    'main/format_unpack.c',
79    'main/framebuffer.c',
80    'main/get.c',
81    'main/getstring.c',
82    'main/glformats.c',
83    'main/hash.c',
84    'main/hint.c',
85    'main/histogram.c',
86    'main/image.c',
87    'main/imports.c',
88    'main/light.c',
89    'main/lines.c',
90    'main/matrix.c',
91    'main/mipmap.c',
92    'main/mm.c',
93    'main/multisample.c',
94    'main/nvprogram.c',
95    'main/pack.c',
96    'main/pbo.c',
97    'main/pixel.c',
98    'main/pixelstore.c',
99    'main/pixeltransfer.c',
100    'main/points.c',
101    'main/polygon.c',
102    'main/querymatrix.c',
103    'main/queryobj.c',
104    'main/rastpos.c',
105    'main/readpix.c',
106    'main/remap.c',
107    'main/renderbuffer.c',
108    'main/samplerobj.c',
109    'main/scissor.c',
110    'main/shaderapi.c',
111    'main/shaderobj.c',
112    'main/shader_query.cpp',
113    'main/shared.c',
114    'main/state.c',
115    'main/stencil.c',
116    'main/syncobj.c',
117    'main/texcompress.c',
118    'main/texcompress_cpal.c',
119    'main/texcompress_rgtc.c',
120    'main/texcompress_s3tc.c',
121    'main/texcompress_fxt1.c',
122    'main/texcompress_etc.c',
123    'main/texenv.c',
124    'main/texformat.c',
125    'main/texgen.c',
126    'main/texgetimage.c',
127    'main/teximage.c',
128    'main/texobj.c',
129    'main/texparam.c',
130    'main/texstate.c',
131    'main/texstorage.c',
132    'main/texstore.c',
133    'main/texturebarrier.c',
134    'main/transformfeedback.c',
135    'main/uniform_query.cpp',
136    'main/uniforms.c',
137    'main/varray.c',
138    'main/version.c',
139    'main/viewport.c',
140    'main/vtxfmt.c',
141]
142
143math_sources = [
144    'math/m_debug_clip.c',
145    'math/m_debug_norm.c',
146    'math/m_debug_xform.c',
147    'math/m_eval.c',
148    'math/m_matrix.c',
149    'math/m_translate.c',
150    'math/m_vector.c',
151    'math/m_xform.c',
152]
153
154swrast_sources = [
155    'swrast/s_aaline.c',
156    'swrast/s_aatriangle.c',
157    'swrast/s_alpha.c',
158    'swrast/s_atifragshader.c',
159    'swrast/s_bitmap.c',
160    'swrast/s_blend.c',
161    'swrast/s_blit.c',
162    'swrast/s_clear.c',
163    'swrast/s_copypix.c',
164    'swrast/s_context.c',
165    'swrast/s_depth.c',
166    'swrast/s_drawpix.c',
167    'swrast/s_feedback.c',
168    'swrast/s_fog.c',
169    'swrast/s_fragprog.c',
170    'swrast/s_lines.c',
171    'swrast/s_logic.c',
172    'swrast/s_masking.c',
173    'swrast/s_points.c',
174    'swrast/s_renderbuffer.c',
175    'swrast/s_span.c',
176    'swrast/s_stencil.c',
177    'swrast/s_texcombine.c',
178    'swrast/s_texfetch.c',
179    'swrast/s_texfilter.c',
180    'swrast/s_texrender.c',
181    'swrast/s_texture.c',
182    'swrast/s_triangle.c',
183    'swrast/s_zoom.c',
184]
185
186swrast_setup_sources = [
187    'swrast_setup/ss_context.c',
188    'swrast_setup/ss_triangle.c',
189]
190
191tnl_sources = [
192    'tnl/t_context.c',
193    'tnl/t_pipeline.c',
194    'tnl/t_draw.c',
195    'tnl/t_rasterpos.c',
196    'tnl/t_vb_program.c',
197    'tnl/t_vb_render.c',
198    'tnl/t_vb_texgen.c',
199    'tnl/t_vb_texmat.c',
200    'tnl/t_vb_vertex.c',
201    'tnl/t_vb_fog.c',
202    'tnl/t_vb_light.c',
203    'tnl/t_vb_normals.c',
204    'tnl/t_vb_points.c',
205    'tnl/t_vp_build.c',
206    'tnl/t_vertex.c',
207    'tnl/t_vertex_sse.c',
208    'tnl/t_vertex_generic.c',
209]
210
211vbo_sources = [
212    'vbo/vbo_context.c',
213    'vbo/vbo_exec.c',
214    'vbo/vbo_exec_api.c',
215    'vbo/vbo_exec_array.c',
216    'vbo/vbo_exec_draw.c',
217    'vbo/vbo_exec_eval.c',
218    'vbo/vbo_noop.c',
219    'vbo/vbo_primitive_restart.c',
220    'vbo/vbo_rebase.c',
221    'vbo/vbo_split.c',
222    'vbo/vbo_split_copy.c',
223    'vbo/vbo_split_inplace.c',
224    'vbo/vbo_save.c',
225    'vbo/vbo_save_api.c',
226    'vbo/vbo_save_draw.c',
227    'vbo/vbo_save_loopback.c',
228]
229
230statetracker_sources = [
231    'state_tracker/st_atom.c',
232    'state_tracker/st_atom_array.c',
233    'state_tracker/st_atom_blend.c',
234    'state_tracker/st_atom_clip.c',
235    'state_tracker/st_atom_constbuf.c',
236    'state_tracker/st_atom_depth.c',
237    'state_tracker/st_atom_framebuffer.c',
238    'state_tracker/st_atom_msaa.c',
239    'state_tracker/st_atom_pixeltransfer.c',
240    'state_tracker/st_atom_sampler.c',
241    'state_tracker/st_atom_scissor.c',
242    'state_tracker/st_atom_shader.c',
243    'state_tracker/st_atom_rasterizer.c',
244    'state_tracker/st_atom_stipple.c',
245    'state_tracker/st_atom_texture.c',
246    'state_tracker/st_atom_viewport.c',
247    'state_tracker/st_cb_bitmap.c',
248    'state_tracker/st_cb_blit.c',
249    'state_tracker/st_cb_bufferobjects.c',
250    'state_tracker/st_cb_clear.c',
251    'state_tracker/st_cb_condrender.c',
252    'state_tracker/st_cb_flush.c',
253    'state_tracker/st_cb_drawpixels.c',
254    'state_tracker/st_cb_drawtex.c',
255    'state_tracker/st_cb_eglimage.c',
256    'state_tracker/st_cb_fbo.c',
257    'state_tracker/st_cb_feedback.c',
258    'state_tracker/st_cb_program.c',
259    'state_tracker/st_cb_queryobj.c',
260    'state_tracker/st_cb_rasterpos.c',
261    'state_tracker/st_cb_readpixels.c',
262    'state_tracker/st_cb_syncobj.c',
263    'state_tracker/st_cb_strings.c',
264    'state_tracker/st_cb_texture.c',
265    'state_tracker/st_cb_texturebarrier.c',
266    'state_tracker/st_cb_viewport.c',
267    'state_tracker/st_cb_xformfb.c',
268    'state_tracker/st_context.c',
269    'state_tracker/st_debug.c',
270    'state_tracker/st_draw.c',
271    'state_tracker/st_draw_feedback.c',
272    'state_tracker/st_extensions.c',
273    'state_tracker/st_format.c',
274    'state_tracker/st_glsl_to_tgsi.cpp',
275    'state_tracker/st_gen_mipmap.c',
276    'state_tracker/st_manager.c',
277    'state_tracker/st_mesa_to_tgsi.c',
278    'state_tracker/st_program.c',
279    'state_tracker/st_texture.c',
280]
281
282env.Append(YACCFLAGS = '-d')
283program_lex = env.CFile('program/lex.yy.c', 'program/program_lexer.l')
284program_parse = env.CFile('program/program_parse.tab.c',
285                          'program/program_parse.y')
286
287# Make program/program_parse.tab.h reacheable from the include path
288env.Append(CPPPATH = [Dir('.').abspath])
289
290program_sources = [
291    'program/arbprogparse.c',
292    'program/hash_table.c',
293    'program/ir_to_mesa.cpp',
294    'program/nvfragparse.c',
295    'program/nvvertparse.c',
296    'program/program.c',
297    'program/program_parse_extra.c',
298    'program/prog_cache.c',
299    'program/prog_execute.c',
300    'program/prog_instruction.c',
301    'program/prog_noise.c',
302    'program/prog_optimize.c',
303    'program/prog_opt_constant_fold.c',
304    'program/prog_parameter.c',
305    'program/prog_parameter_layout.c',
306    'program/prog_print.c',
307    'program/prog_statevars.c',
308    'program/programopt.c',
309    'program/sampler.cpp',
310    'program/symbol_table.c',
311    'program/string_to_uint_map.cpp',
312    program_lex,
313    program_parse[0],
314]
315
316common_driver_sources =	[
317    'drivers/common/driverfuncs.c',
318    'drivers/common/meta.c',
319]
320
321mesa_sources = (
322    main_sources +
323    math_sources +
324    program_sources +
325    vbo_sources +
326    tnl_sources +
327    swrast_sources +
328    swrast_setup_sources +
329    common_driver_sources +
330    statetracker_sources
331)
332
333GLAPI = '#src/mapi/glapi/'
334
335if env['gles']:
336
337    env.Append(CPPDEFINES = ['FEATURE_ES1=1', 'FEATURE_ES2=1'])
338
339    # generate GLES sources
340    gles_sources = ['main/es1_conversion.c',]
341    gles_sources += env.CodeGenerate(
342        target = 'main/api_exec_es1.c',
343        script = 'main/es_generator.py',
344        source = 'main/APIspec.xml',
345        command = python_cmd + ' $SCRIPT -S $SOURCE -V GLES1.1 > $TARGET'
346    )
347
348    # generate GLES headers
349    gles_headers = []
350    gles_headers += env.CodeGenerate(
351        target = 'main/api_exec_es1_dispatch.h',
352        script = GLAPI + 'gen/gl_table.py',
353        source = GLAPI + 'gen/gl_and_es_API.xml',
354        command = python_cmd + ' $SCRIPT -c es1 -m remap_table -f $SOURCE > $TARGET',
355    )
356    gles_headers += env.CodeGenerate(
357        target = 'main/api_exec_es1_remap_helper.h',
358        script = GLAPI + 'gen/remap_helper.py',
359        source = GLAPI + 'gen/gl_and_es_API.xml',
360        command = python_cmd + ' $SCRIPT -c es1 -f $SOURCE > $TARGET',
361    )
362
363    env.Depends(gles_sources, gles_headers)
364
365    # gles_sources #include gles_headers with full path
366    env.Append(CPPPATH = [gles_headers[0].dir.up().up()])
367
368    mesa_sources += gles_sources
369
370#
371# Assembly sources
372#
373if env['gcc'] and env['platform'] not in ('darwin', 'windows'):
374    if env['machine'] == 'x86':
375        env.Append(CPPDEFINES = [
376            'USE_X86_ASM',
377            'USE_MMX_ASM',
378            'USE_3DNOW_ASM',
379            'USE_SSE_ASM',
380        ])
381        mesa_sources += [
382            'x86/common_x86.c',
383            'x86/x86_xform.c',
384            'x86/3dnow.c',
385            'x86/sse.c',
386            'x86/common_x86_asm.S',
387            'x86/x86_xform2.S',
388            'x86/x86_xform3.S',
389            'x86/x86_xform4.S',
390            'x86/x86_cliptest.S',
391            'x86/mmx_blend.S',
392            'x86/3dnow_xform1.S',
393            'x86/3dnow_xform2.S',
394            'x86/3dnow_xform3.S',
395            'x86/3dnow_xform4.S',
396            'x86/3dnow_normal.S',
397            'x86/sse_xform1.S',
398            'x86/sse_xform2.S',
399            'x86/sse_xform3.S',
400            'x86/sse_xform4.S',
401            'x86/sse_normal.S',
402            'x86/read_rgba_span_x86.S',
403        ]
404    elif env['machine'] == 'x86_64':
405        env.Append(CPPDEFINES = [
406            'USE_X86_64_ASM',
407        ])
408        mesa_sources += [
409            'x86-64/x86-64.c',
410            'x86-64/xform4.S',
411        ]
412    elif env['machine'] == 'sparc':
413        mesa_sources += [
414            'sparc/sparc.c',
415            'sparc/sparc_clip.S',
416            'sparc/norm.S',
417            'sparc/xform.S',
418        ]
419    else:
420        pass
421
422    # Generate matypes.h
423    if env['machine'] in ('x86', 'x86_64'):
424        # See http://www.scons.org/wiki/UsingCodeGenerators
425        gen_matypes = env.Program(
426            target = 'gen_matypes',
427            source = 'x86/gen_matypes.c',
428        )
429        matypes = env.Command(
430            'matypes.h',
431            gen_matypes,
432            gen_matypes[0].abspath + ' > $TARGET',
433        )
434        # Add the dir containing the generated header (somewhere inside  the
435        # build dir) to the include path
436        env.Append(CPPPATH = [matypes[0].dir])
437
438
439# The enums.c file is generated from the GL/ES API.xml file
440env.CodeGenerate(
441    target = 'main/enums.c',
442    script = GLAPI + 'gen/gl_enums.py',
443    source = GLAPI + 'gen/gl_and_es_API.xml',
444    command = python_cmd + ' $SCRIPT -f $SOURCE > $TARGET'
445    )
446
447# We also depend on the auto-generated GL API headers
448env.Depends(mesa_sources, glapi_headers)
449
450
451def write_git_sha1_h_file(filename):
452    """Mesa looks for a git_sha1.h file at compile time in order to display
453    the current git hash id in the GL_VERSION string.  This function tries
454    to retrieve the git hashid and write the header file.  An empty file
455    will be created if anything goes wrong."""
456
457    args = [ 'git', 'log', '-n', '1', '--oneline' ]
458    try:
459        (commit, foo) = subprocess.Popen(args, stdout=subprocess.PIPE).communicate()
460    except:
461        # git log command didn't work
462        if not os.path.exists(filename):
463            # create an empty file if none already exists
464            f = open(filename, "w")
465            f.close()
466        return
467
468    commit = '#define MESA_GIT_SHA1 "git-%s"\n' % commit[0:7]
469    tempfile = "git_sha1.h.tmp"
470    f = open(tempfile, "w")
471    f.write(commit)
472    f.close()
473    if not os.path.exists(filename) or not filecmp.cmp(tempfile, filename):
474        # The filename does not exist or it's different from the new file,
475        # so replace old file with new.
476        if os.path.exists(filename):
477            os.remove(filename)
478        os.rename(tempfile, filename)
479    return
480
481
482# Create the git_sha1.h header file
483write_git_sha1_h_file("main/git_sha1.h")
484# and update CPPPATH so the git_sha1.h header can be found
485env.Append(CPPPATH = ["#" + env['build_dir'] + "/mesa/main"])
486
487
488#
489# Libraries
490#
491
492mesa = env.ConvenienceLibrary(
493    target = 'mesa',
494    source = mesa_sources,
495)
496
497env.Alias('mesa', mesa)
498
499Export('mesa')
500
501SConscript('drivers/SConscript')
502