aboutsummaryrefslogtreecommitdiff
path: root/mesalib/scons/source_list.py
diff options
context:
space:
mode:
authormarha <marha@users.sourceforge.net>2011-08-29 14:48:31 +0200
committermarha <marha@users.sourceforge.net>2011-08-29 14:48:31 +0200
commit924a6ffc82a7af0ca311af711ea2cf973dc6ff15 (patch)
treef5ee6d0aaf321029a4abb12c3c051c0434dde308 /mesalib/scons/source_list.py
parent8e57a7fcbf736b8e437baf0bbccb93095d97617f (diff)
parent01df5d59e56a1b060568f8cad2e89f7eea22fc70 (diff)
downloadvcxsrv-924a6ffc82a7af0ca311af711ea2cf973dc6ff15.tar.gz
vcxsrv-924a6ffc82a7af0ca311af711ea2cf973dc6ff15.tar.bz2
vcxsrv-924a6ffc82a7af0ca311af711ea2cf973dc6ff15.zip
Merge remote-tracking branch 'origin/released'
Conflicts: apps/xwininfo/configure.ac apps/xwininfo/xwininfo.c libX11/configure.ac libX11/specs/libX11/AppC.xml libX11/specs/libX11/AppD.xml libX11/specs/libX11/CH03.xml libX11/specs/libX11/CH04.xml libX11/specs/libX11/CH05.xml libX11/specs/libX11/CH06.xml libX11/specs/libX11/CH07.xml libX11/specs/libX11/CH08.xml libX11/specs/libX11/CH09.xml libX11/specs/libX11/CH11.xml libX11/specs/libX11/CH12.xml libX11/specs/libX11/CH13.xml libX11/specs/libX11/CH14.xml libX11/specs/libX11/CH15.xml libX11/specs/libX11/CH16.xml libxcb/configure.ac libxcb/src/c_client.py libxcb/src/xcb_auth.c libxcb/src/xcb_util.c mesalib/common.py mesalib/configs/linux-dri mesalib/docs/GL3.txt mesalib/docs/download.html mesalib/docs/install.html mesalib/include/GL/internal/dri_interface.h mesalib/scons/custom.py mesalib/scons/gallium.py mesalib/src/gallium/auxiliary/util/u_math.h mesalib/src/gallium/auxiliary/util/u_vbuf_mgr.c mesalib/src/glsl/ast_function.cpp mesalib/src/glsl/ast_to_hir.cpp mesalib/src/glsl/glcpp/glcpp-parse.y mesalib/src/glsl/glsl_parser_extras.cpp mesalib/src/glsl/glsl_parser_extras.h mesalib/src/glsl/ir.cpp mesalib/src/glsl/ir.h mesalib/src/glsl/ir_clone.cpp mesalib/src/glsl/ir_print_visitor.cpp mesalib/src/glsl/ir_validate.cpp mesalib/src/glsl/linker.cpp mesalib/src/glsl/main.cpp mesalib/src/glsl/opt_tree_grafting.cpp mesalib/src/mapi/glapi/gen/Makefile mesalib/src/mapi/glapi/gen/gl_XML.py mesalib/src/mapi/glapi/gen/gl_table.py mesalib/src/mapi/glapi/glapi_mapi_tmp.h mesalib/src/mapi/glapi/glapi_sparc.S mesalib/src/mapi/glapi/glapi_x86-64.S mesalib/src/mapi/glapi/glapi_x86.S mesalib/src/mapi/glapi/glapitemp.h mesalib/src/mapi/glapi/glprocs.h mesalib/src/mapi/mapi/u_thread.c mesalib/src/mapi/mapi/u_thread.h mesalib/src/mesa/SConscript mesalib/src/mesa/drivers/common/driverfuncs.c mesalib/src/mesa/drivers/windows/gldirect/dglcontext.c mesalib/src/mesa/main/api_arrayelt.c mesalib/src/mesa/main/bufferobj.c mesalib/src/mesa/main/compiler.h mesalib/src/mesa/main/dd.h mesalib/src/mesa/main/dlist.c mesalib/src/mesa/main/enums.c mesalib/src/mesa/main/es_generator.py mesalib/src/mesa/main/fbobject.c mesalib/src/mesa/main/imports.h mesalib/src/mesa/main/mtypes.h mesalib/src/mesa/main/pbo.c mesalib/src/mesa/main/remap_helper.h mesalib/src/mesa/main/shared.c mesalib/src/mesa/main/texgetimage.c mesalib/src/mesa/main/teximage.c mesalib/src/mesa/main/uniforms.c mesalib/src/mesa/program/ir_to_mesa.cpp mesalib/src/mesa/program/prog_optimize.c mesalib/src/mesa/program/register_allocate.c mesalib/src/mesa/program/register_allocate.h mesalib/src/mesa/sources.mak mesalib/src/mesa/state_tracker/st_cb_bufferobjects.c mesalib/src/mesa/state_tracker/st_cb_texture.c mesalib/src/mesa/state_tracker/st_texture.h mesalib/src/mesa/swrast/s_context.c mesalib/src/mesa/tnl/t_draw.c mesalib/src/mesa/vbo/vbo_exec_array.c mesalib/src/mesa/vbo/vbo_save_api.c pixman/pixman/pixman-arm-common.h pixman/pixman/pixman-fast-path.c pixman/pixman/pixman-inlines.h pixman/test/Makefile.am pixman/test/utils.c pixman/test/utils.h xorg-server/configure.ac xorg-server/fb/fbblt.c xorg-server/hw/xquartz/darwin.c xorg-server/xkeyboard-config/symbols/de
Diffstat (limited to 'mesalib/scons/source_list.py')
-rw-r--r--mesalib/scons/source_list.py123
1 files changed, 123 insertions, 0 deletions
diff --git a/mesalib/scons/source_list.py b/mesalib/scons/source_list.py
new file mode 100644
index 000000000..fbd3ef7dc
--- /dev/null
+++ b/mesalib/scons/source_list.py
@@ -0,0 +1,123 @@
+"""Source List Parser
+
+The syntax of a source list file is a very small subset of GNU Make. These
+features are supported
+
+ operators: +=, :=
+ line continuation
+ non-nested variable expansion
+ comment
+
+The goal is to allow Makefile's and SConscript's to share source listing.
+"""
+
+class SourceListParser(object):
+ def __init__(self):
+ self._reset()
+
+ def _reset(self, filename=None):
+ self.filename = filename
+
+ self.line_no = 1
+ self.line_cont = ''
+ self.symbol_table = {}
+
+ def _error(self, msg):
+ raise RuntimeError('%s:%d: %s' % (self.filename, self.line_no, msg))
+
+ def _next_dereference(self, val, cur):
+ """Locate the next $(...) in value."""
+ deref_pos = val.find('$', cur)
+ if deref_pos < 0:
+ return (-1, -1)
+ elif val[deref_pos + 1] != '(':
+ self._error('non-variable dereference')
+
+ deref_end = val.find(')', deref_pos + 2)
+ if deref_end < 0:
+ self._error('unterminated variable dereference')
+
+ return (deref_pos, deref_end + 1)
+
+ def _expand_value(self, val):
+ """Perform variable expansion."""
+ expanded = ''
+ cur = 0
+ while True:
+ deref_pos, deref_end = self._next_dereference(val, cur)
+ if deref_pos < 0:
+ expanded += val[cur:]
+ break
+
+ sym = val[(deref_pos + 2):(deref_end - 1)]
+ expanded += val[cur:deref_pos] + self.symbol_table[sym]
+ cur = deref_end
+
+ return expanded
+
+ def _parse_definition(self, line):
+ """Parse a variable definition line."""
+ op_pos = line.find('=')
+ op_end = op_pos + 1
+ if op_pos < 0:
+ self._error('not a variable definition')
+
+ if op_pos > 0 and line[op_pos - 1] in [':', '+']:
+ op_pos -= 1
+ else:
+ self._error('only := and += are supported')
+
+ # set op, sym, and val
+ op = line[op_pos:op_end]
+ sym = line[:op_pos].strip()
+ val = self._expand_value(line[op_end:].lstrip())
+
+ if op == ':=':
+ self.symbol_table[sym] = val
+ elif op == '+=':
+ self.symbol_table[sym] += ' ' + val
+
+ def _parse_line(self, line):
+ """Parse a source list line."""
+ # more lines to come
+ if line and line[-1] == '\\':
+ # spaces around "\\\n" are replaced by a single space
+ if self.line_cont:
+ self.line_cont += line[:-1].strip() + ' '
+ else:
+ self.line_cont = line[:-1].rstrip() + ' '
+ return 0
+
+ # combine with previous lines
+ if self.line_cont:
+ line = self.line_cont + line.lstrip()
+ self.line_cont = ''
+
+ if line:
+ begins_with_tab = (line[0] == '\t')
+
+ line = line.lstrip()
+ if line[0] != '#':
+ if begins_with_tab:
+ self._error('recipe line not supported')
+ else:
+ self._parse_definition(line)
+
+ return 1
+
+ def parse(self, filename):
+ """Parse a source list file."""
+ if self.filename != filename:
+ fp = open(filename)
+ lines = fp.read().splitlines()
+ fp.close()
+
+ try:
+ self._reset(filename)
+ for line in lines:
+ self.line_no += self._parse_line(line)
+ except:
+ self._reset()
+ raise
+
+ return self.symbol_table