diff --git a/.gitignore b/.gitignore
index b970591..7a51d17 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
+*.pyc
*.swf
*.swc
*.swf.cache
diff --git a/build.xml b/build.xml
new file mode 100644
index 0000000..20c755c
--- /dev/null
+++ b/build.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mkbuildxml.py b/mkbuildxml.py
new file mode 100755
index 0000000..268d93d
--- /dev/null
+++ b/mkbuildxml.py
@@ -0,0 +1,182 @@
+#!/usr/bin/env python
+from __future__ import print_function
+
+import os
+import re
+import sys
+import glob
+from io import BytesIO
+from fnmatch import fnmatch
+from itertools import ifilter
+from os.path import join as pathjoin, relpath, dirname, \
+ abspath, basename, splitext, sep as pathsep
+
+import lxml.etree as ET
+
+
+HERE = dirname(abspath(__file__))
+AUTOGEN_WARNING = ('').format(basename(sys.argv[0]))
+
+ROOT = BytesIO(''.join([_line.strip() for _line in """\
+
+
+
+
+
+
+
+
+
+""".splitlines() if _line.strip()]))
+# TARGET_FMT = '{target}:' + DEP_SEP + '{deps}'
+# RULE_FMT = '\\\n\t'.join([
+# '\t$(MXMLC) {primary_dep} ',
+# '$(MXMLC_FLAGS) ',
+# '-l+={parent_dir} ',
+# '-l+={package_base} ',
+# '-l+={flexunit} ',
+# '-sp+={package_base} ',
+# '-sp+={flexunit} ',
+# '-o {target}',
+# ])
+
+
+def main(sysargs=sys.argv[:]):
+ build_xml = pathjoin(HERE, 'build.xml')
+ os.chmod(build_xml, 0600)
+ buildxml_maker = BuildXMLMaker(outstream=open(build_xml, 'wb'))
+ buildxml_maker.make()
+ os.chmod(build_xml, 0444)
+ return 0
+
+
+class BuildXMLMaker(object):
+ _to_glob = (
+ pathjoin(HERE, '[0-9]*-*', '*.mxml'),
+ pathjoin(HERE, 'custom-*', '*.mxml'),
+ )
+ _source_fileexts = ('.mxml', '.as', '.css')
+
+ def __init__(self, outstream=sys.stdout):
+ self.outstream = outstream
+ self.targets = {'compc': {}, 'mxmlc': {}}
+ self.tree = ET.parse(ROOT)
+ self.root = self.tree.getroot()
+ self.build = self.tree.xpath('//target[@name="build"]')[0]
+
+ def make(self):
+ self._glob_for_top_level_mxml_targets()
+ self._find_test_suite_targets()
+ self._write_out_targets()
+
+ def _glob_for_top_level_mxml_targets(self):
+ for pattern in self._to_glob:
+ for mxml in glob.glob(pattern):
+ self._add_target_from_mxml(mxml)
+
+ def _find_test_suite_targets(self):
+ for dirpath, dirnames, filenames in os.walk(HERE):
+ filter_generated_dirs(dirnames)
+ for filename in filenames:
+ if is_test_suite(filename):
+ test_suite = pathjoin(dirpath, filename)
+ self._add_target_from_test_suite(test_suite)
+
+ def _add_target_from_test_suite(self, test_suite):
+ rel_class = relpath(test_suite, HERE)
+ self.targets['compc'][rel_class] = dict()
+
+ def _add_target_from_mxml(self, mxml):
+ rel_mxml = relpath(mxml, HERE)
+ self.targets['mxmlc'][rel_mxml] = {} #dict(sources='')
+ self._add_deps_from_alt_source_file_extensions(rel_mxml)
+
+ def _add_deps_from_alt_source_file_extensions(self, rel_mxml):
+ basedir = dirname(rel_mxml)
+ # sources = self.targets['mxmlc'][rel_mxml]['sources']
+
+ for dirpath, dirnames, filenames in os.walk(basedir):
+ filter_generated_dirs(dirnames)
+ filter_test_suitees(filenames)
+ for filename in filenames:
+ if ext(filename) in self._source_fileexts:
+ rel_source = relpath(pathjoin(dirpath, filename), HERE)
+ # sources += (' ' + rel_source)
+
+ def _write_out_targets(self):
+ for mxml in sorted(self.targets['mxmlc'].iterkeys()):
+ rel_target = './' + mxml.lstrip('./')
+ attrs = dict(file=rel_target, as3='true')
+ attrs.update(self.targets['mxmlc'][mxml])
+ ET.SubElement(self.build, 'mxmlc', **attrs)
+
+ for as3 in sorted(self.targets['compc'].iterkeys()):
+ rel_target = './' + as3.lstrip('./')
+ as_swf = re.sub('(.*).as$', '\\1.swf', rel_target)
+ attrs = {'output': as_swf, 'source-path': '${basedir}'}
+ attrs.update(self.targets['compc'][as3])
+ ET.SubElement(self.build, 'compc', **attrs)
+
+ print(ET.tostring(self.root, pretty_print=True),
+ file=self.outstream)
+
+ def _get_deps_for_target(self, target):
+ deps = []
+ for dep in reversed(sorted(list(self.targets[target]), key=ext)):
+ deps.append(dep)
+ return deps
+
+ def _get_primary_dep(self, target, deps):
+ primary_dep = deps[0]
+
+ for dependency in deps:
+ if fnmatch(target, namebase(dependency) + '.*'):
+ primary_dep = dependency
+
+ return primary_dep
+
+ def _get_pattern_rule_kwargs(self, primary_dep, target):
+ ret = dict(
+ primary_dep=primary_dep,
+ parent_dir=dirname(primary_dep),
+ package_base=primary_dep.strip('./').split(pathsep)[0],
+ target=target,
+ flexunit=FLEXUNIT
+ )
+ return ret
+
+
+def ext(filename):
+ return splitext(filename)[-1]
+
+
+def namebase(filename):
+ return splitext(filename)[0]
+
+
+def filter_generated_dirs(dirnames):
+ for i, directory in enumerate(dirnames[:]):
+ if directory == 'generated':
+ dirnames[i] = None
+ dirnames[:] = list(ifilter(None, dirnames))
+
+
+def filter_test_suitees(filenames):
+ for i, filename in enumerate(filenames[:]):
+ if is_test_suite(filename):
+ filenames[i] = None
+ filenames[:] = list(ifilter(None, filenames))
+
+
+def is_test_suite(filename):
+ base_filename = basename(filename)
+ return base_filename.startswith('TestSuite') and \
+ ext(filename) == '.as'
+
+
+if __name__ == '__main__':
+ sys.exit(main())
+
+# vim:filetype=python