ocarina/design/Sconscript

110 lines
2.3 KiB
Python

#!/usr/bin/python
import os
created_files = dict()
node_names = dict()
class DesignFile:
def read_files(self, file):
lastkey = ""
for line in file:
if line == "\n":
return
if line[0] == " " and line[1] == " ":
created_files[lastkey] += [line.strip()]
created_files[lastkey].sort()
else:
lastkey = line.strip()
created_files.setdefault(lastkey, [])
def read_depends(self, file):
for line in file:
if line == "\n":
return;
else:
self.depends += line.strip().split()
def __init__(self, file):
self.name = ""
self.lines = []
self.depends = []
self.depend_nodes = set()
if file == None:
return
self.name = file.rsplit(".", 1)[0]
f = open("design/%s" % file)
for line in f:
if line == "== Files ==\n":
self.read_files(f)
elif line == "== Depends ==\n":
self.read_depends(f)
else:
self.lines += [line]
node_names[self.name] = self
def pump_depends(nodes):
options = []
res = None
for n in nodes:
if len(n.depend_nodes) == 0:
options += [ n.name ]
options.sort()
res = node_names[ options[0] ]
nodes.remove(res)
for n in nodes:
if res in n.depend_nodes:
n.depend_nodes.remove(res)
return res
def resolve_dependencies():
tmp = set()
res = []
for key, node in node_names.items():
tmp.add(node)
for depend in node.depends:
if depend == "*":
node.depend_nodes = set(node_names.values())
else:
node.depend_nodes.add(node_names[depend])
node.depend_nodes.discard(node_names[node.name])
while len(tmp) > 0:
res += [ pump_depends(tmp) ]
return res
def gen_files_list(parsed):
design = DesignFile(None)
design.lines += [ "Files:\n"]
keys = created_files.keys()
keys.sort()
for key in keys:
design.lines += [ " %s\n" % key ]
for val in created_files[key]:
design.lines += [ " %s\n" % val ]
parsed.insert(1, design)
def merge_design(target, source, env):
files = os.listdir("design/")
files.sort()
for file in files:
if file.endswith(".txt"):
DesignFile(file)
node_list = resolve_dependencies()
gen_files_list(node_list)
f = open("design.txt", 'w')
for index, design in enumerate(node_list):
if index != 0:
f.write("\n\n\n")
for line in design.lines:
f.write(line)
design = Command("design.txt", None, merge_design)
Alias("design", design)