source: 2011/26/build_games.py @ 2326

Revision 2326, 3.9 KB checked in by tekrjant, 8 years ago (diff)

jotain

Line 
1from __future__ import with_statement
2import sys
3import os
4from os.path import *
5import shutil
6from shutil import *
7from glob import *
8from subprocess import *
9from xml.dom.minidom import Document
10
11
12report_location = "\\\\eppu.it.jyu.fi\\kurssit\\npo\\temp"
13output_dir = abspath("pelit")
14lib_dir_x86 = abspath('lib\\x86')
15personal_dirs = [d for d in os.listdir(".") if isdir(d) and d not in ("lib", basename(output_dir), ".svn")]
16projects_that_did_not_build = []
17report = Document()
18table = None
19msbuild = "msbuild"
20
21
22def check_requirements():
23        if not exists("lib\\x86\\Jypeli4.dll"):
24                raise Exception("lib\\x86\\Jypeli4.dll expected")
25        return_code = call(msbuild + "/?", shell=True)
26        if return_code != 0:
27                # etsitaan
28                foo = join(os.getenv("SystemRoot"), "Microsoft.NET\\Framework")
29                print "NO MSBUILD!"
30
31
32def create_output_directory():
33        if not exists(output_dir):
34                os.mkdir(output_dir)
35        for d in personal_dirs:
36                if not exists(join(output_dir, d)):
37                        os.mkdir(join(output_dir, d))
38
39def build_games():
40        for d in personal_dirs:
41                build_games_in_personal_dir(abspath(d))
42
43
44def addElement(parent, name):
45        node = report.createElement(name)
46        parent.appendChild(node)
47        return node
48
49
50def addTextElement(parent, name, value):
51        node = report.createElement(name)
52        parent.appendChild(node)
53        node.appendChild(report.createTextNode(str(value)))
54        return node
55
56
57def add_to_report(author, name, success):
58        style = "success"
59        if not success:
60                style = "fail"
61        tr = addElement(table, "tr")
62        tr.setAttribute("class", style)
63        addTextElement(tr, "td", author)
64        addTextElement(tr, "td", name)
65
66
67def build_games_in_personal_dir(personal_dir):
68        for root, dirs, files in os.walk(personal_dir):
69                if '.svn' in dirs:
70                        dirs.remove('.svn')
71                projects = glob(join(root, '*.csproj'))
72                if projects:
73                        if len(projects) > 1:
74                                print "NOTE: There is more than one project file in", root
75
76                        project_name = splitext(basename(projects[0]))[0]
77                        author = basename(personal_dir)
78
79                        success = build(projects[0])
80                        add_to_report(author, project_name, success)
81
82                        if success:
83                                dst_dir = join(output_dir, author)
84                                copy_game(project_name, root, dst_dir)
85                                print author + ": " + project_name
86                        else:
87                                projects_that_did_not_build.append(projects[0])
88
89
90def build(project_file_path):
91        build_cmd = 'msbuild /nologo /verbosity:quiet /p:XnaProfile=Reach /p:Configuration=Release /p:"ReferencePath=%s" /t:Build "%s"' % (lib_dir_x86, project_file_path)
92        return call(build_cmd, shell=True) == 0
93
94
95def copy_game(project_name, project_dir, dst_dir):
96        bin = join(project_dir, "bin\\x86\\Release")
97        if not exists(bin):
98                print "NO BIN DIR FOUND IN", project_dir
99        dst = join(dst_dir, project_name)
100        if exists(dst):
101                rmtree(dst)
102        copytree(bin, dst, ignore=shutil.ignore_patterns('.svn', '*.pdb', 'jypeli4.xml'))
103
104
105def initialize_report():
106        html = addElement(report, "html")
107
108        refresh_tag = addElement(html, "meta")
109        refresh_tag.setAttribute("http-equiv", "refresh")
110        refresh_tag.setAttribute("content", "30")
111
112        head = addElement(html, "head")
113        css_link = addElement(head, "link")
114        css_link.setAttribute("href", "build.css")
115        css_link.setAttribute("rel", "StyleSheet")
116        css_link.setAttribute("type", "text/css")
117        addTextElement(head, "title", "Build")
118
119        body = addElement(html, "body")
120        global table
121        table = addElement(body, "table")
122
123
124def write_report():
125        with open(join(report_location, "build_report.html"), "w") as f:
126                f.write(report.toprettyxml())
127
128
129def main():
130        try:
131                check_requirements()
132                initialize_report()
133                create_output_directory()
134                build_games()
135                write_report()
136        except KeyboardInterrupt:
137                print "BUILD CANCELLED"
138        except Exception, e:
139                print
140                print "NOT SUCCESSFUL:", e
141                return 1
142
143        print
144        print 'Projects that did not build (%d):' % len(projects_that_did_not_build)
145        for p in projects_that_did_not_build:
146                print p
147
148
149if __name__ == '__main__':
150        sys.exit(main())
Note: See TracBrowser for help on using the repository browser.