You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
3.2 KiB
109 lines
3.2 KiB
#!/usr/bin/env python
|
|
from __future__ import print_function
|
|
|
|
import os
|
|
import re
|
|
import sys
|
|
import glob
|
|
from fnmatch import fnmatch
|
|
from os.path import join as pathjoin, relpath, dirname, \
|
|
abspath, basename, splitext
|
|
|
|
|
|
HERE = dirname(abspath(__file__))
|
|
AUTOGEN_WARNING = ('# ******** AUTOGENERATED by {0} ' +
|
|
('*' * 20)).format(basename(sys.argv[0]))
|
|
PATTERN_RULE_MXMLC = \
|
|
'$(MXMLC) {primary_dep} -warnings -l+={parent_dir} -output {target}'
|
|
|
|
|
|
def main(sysargs=sys.argv[:]):
|
|
targets_mk = pathjoin(HERE, 'targets.mk')
|
|
os.chmod(targets_mk, 0600)
|
|
targetmaker = TargetMaker(outstream=open(targets_mk, 'wb'))
|
|
targetmaker.make()
|
|
os.chmod(targets_mk, 0444)
|
|
return 0
|
|
|
|
|
|
class TargetMaker(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 = {}
|
|
|
|
def make(self):
|
|
for pattern in self._to_glob:
|
|
for mxml in glob.glob(pattern):
|
|
self._add_target_from_mxml(mxml)
|
|
self._write_out_targets()
|
|
|
|
def _add_target_from_mxml(self, mxml):
|
|
rel_mxml = relpath(mxml, HERE)
|
|
as_swf = re.sub('(.*)\.mxml$', '\\1.swf', rel_mxml)
|
|
self.targets[as_swf] = set([rel_mxml])
|
|
|
|
self._add_deps_from_alt_source_file_extensions(as_swf, rel_mxml)
|
|
|
|
def _add_deps_from_alt_source_file_extensions(self, as_swf, rel_mxml):
|
|
basedir = dirname(rel_mxml)
|
|
for dirpath, dirnames, filenames in os.walk(basedir):
|
|
for filename in filenames:
|
|
if ext(filename) in self._source_fileexts:
|
|
rel_source = relpath(pathjoin(dirpath, filename), HERE)
|
|
self.targets[as_swf].add(rel_source)
|
|
|
|
def _write_out_targets(self):
|
|
print(AUTOGEN_WARNING, file=self.outstream)
|
|
for target in sorted(self.targets.iterkeys()):
|
|
deps = self._get_deps_for_target(target)
|
|
primary_dep = self._get_primary_dep(target, deps)
|
|
pattern_rule_kwargs = \
|
|
self._get_pattern_rule_kwargs(primary_dep, target)
|
|
|
|
print('{target}: {deps}'.format(target=target,
|
|
deps=' '.join(deps)), file=self.outstream)
|
|
print('\t' + PATTERN_RULE_MXMLC.format(**pattern_rule_kwargs) +
|
|
'\n\n', 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),
|
|
target=target
|
|
)
|
|
return ret
|
|
|
|
def ext(filename):
|
|
return splitext(filename)[-1]
|
|
|
|
|
|
def namebase(filename):
|
|
return splitext(filename)[0]
|
|
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(main())
|
|
|
|
# vim:filetype=python
|