source: 2011/26/build_games.py @ 2340

Revision 2327, 4.1 KB checked in by tekrjant, 8 years ago (diff)

MSBuild is looked for if it is not in PATH.

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