source: 2011/24/build_games.py @ 2248

Revision 2248, 3.1 KB checked in by tekrjant, 8 years ago (diff)

A report is created of the build.

Line 
1import sys
2import os
3from os.path import *
4import shutil
5from shutil import *
6from glob import *
7from subprocess import *
8from xml.dom.minidom import Document
9
10
11output_dir = abspath("pelit")
12lib_dir_x86 = abspath('lib\\x86')
13personal_dirs = [d for d in os.listdir(".") if isdir(d) and d not in ("lib", basename(output_dir), ".svn")]
14projects_that_did_not_build = []
15report = Document()
16document_root = ""
17
18def check_requirements():
19        if not exists("lib\\x86\\Jypeli4.dll"):
20                raise Exception("lib\\x86\\Jypeli4.dll expected")
21
22
23def create_output_directory():
24        if not exists(output_dir):
25                os.mkdir(output_dir)
26        for d in personal_dirs:
27                if not exists(join(output_dir, d)):
28                        os.mkdir(join(output_dir, d))
29
30def build_games():
31        for d in personal_dirs:
32                build_games_in_personal_dir(abspath(d))
33
34
35def addElement(parent, name, value):
36        node = report.createElement(name)
37        parent.appendChild(node)
38        node.appendChild(report.createTextNode(str(value)))
39
40
41def add_to_report(author, name, success):
42        e = report.createElement("game")
43        document_root.appendChild(e)
44
45        addElement(e, "author", author)
46        addElement(e, "name", name)
47        addElement(e, "success", success)
48
49
50def build_games_in_personal_dir(personal_dir):
51        for root, dirs, files in os.walk(personal_dir):
52                if '.svn' in dirs:
53                        dirs.remove('.svn')
54                projects = glob(join(root, '*.csproj'))
55                if projects:
56                        if len(projects) > 1:
57                                print "NOTE: There is more than one project file in", root
58
59                        project_name = splitext(basename(projects[0]))[0]
60                        author = basename(personal_dir)
61
62                        success = build(projects[0])
63                        add_to_report(author, project_name, success)
64
65                        if success:
66                                dst_dir = join(output_dir, author)
67                                copy_game(project_name, root, dst_dir)
68                                print author + ": " + project_name
69                        else:
70                                projects_that_did_not_build.append(projects[0])
71
72
73def build(project_file_path):
74        build_cmd = 'msbuild /nologo /verbosity:quiet /p:XnaProfile=Reach /p:Configuration=Release /p:"ReferencePath={0}" /t:Build "{1}"'.format(lib_dir_x86, project_file_path)
75        return call(build_cmd, shell=True) == 0
76
77
78def copy_game(project_name, project_dir, dst_dir):
79        bin = join(project_dir, "bin\\x86\\Release")
80        if not exists(bin):
81                print "NO BIN DIR FOUND IN", project_dir
82        dst = join(dst_dir, project_name)
83        if exists(dst):
84                rmtree(dst)
85        copytree(bin, dst, ignore=shutil.ignore_patterns('.svn', '*.pdb', 'jypeli4.xml'))
86
87
88def initialize_report():
89        global document_root
90        document_root = report.createElement("games")
91        report.appendChild(document_root)
92       
93
94def write_report():
95        with open("build_report.xml", "w") as f:
96                f.write(report.toprettyxml())
97
98
99def main():
100        try:
101                initialize_report()
102                check_requirements()
103                create_output_directory()
104                build_games()
105                write_report()
106        except KeyboardInterrupt:
107                print "BUILD CANCELLED"
108        except Exception as e:
109                print
110                print "NOT SUCCESSFUL:", e
111                return 1
112
113        print
114        print 'Projects that did not build ({0}):'.format(len(projects_that_did_not_build))
115        for p in projects_that_did_not_build:
116                print p
117
118
119if __name__ == '__main__':
120        sys.exit(main())
Note: See TracBrowser for help on using the repository browser.