fixed editor zooming if gui is not active
[twcon.git] / scripts / build.py
blob17911d848d9f45eb3a68792365c84fbacbbb97de
1 import imp, optparse, os, re, shutil, sys, zipfile
2 from optparse import OptionParser
3 if sys.version_info[0] == 2:
4 import urllib
5 url_lib = urllib
6 elif sys.version_info[0] == 3:
7 import urllib.request
8 url_lib = urllib.request
9 match = re.search('(.*)/', sys.argv[0])
10 if match != None:
11 os.chdir(match.group(1))
12 os.chdir('../')
14 url_bam = "http://github.com/matricks/bam/zipball/master"
15 url_teeworlds = "http://github.com/oy/teeworlds/zipball/master"
16 release_type = "server_release client_release"
18 arguments = OptionParser()
19 arguments.add_option("-b", "--url_bam", dest = "url_bam")
20 arguments.add_option("-t", "--url_teeworlds", dest = "url_teeworlds")
21 arguments.add_option("-r", "--release_type", dest = "release_type")
22 (options, arguments) = arguments.parse_args()
23 if options.url_bam == None:
24 options.url_bam = url_bam
25 if options.url_teeworlds == None:
26 options.url_teeworlds = url_teeworlds
27 if options.release_type == None:
28 options.release_type = release_type
30 bam = options.url_bam[7:].split("/")
31 version_bam = re.search(r"\d\.\d\.\d", bam[len(bam)-1])
32 if version_bam:
33 version_bam = version_bam.group(0)
34 else:
35 version_bam = "trunk"
36 teeworlds = options.url_teeworlds[7:].split("/")
37 version_teeworlds = re.search(r"\d\.\d\.\d", teeworlds[len(teeworlds)-1])
38 if version_teeworlds:
39 version_teeworlds = version_teeworlds.group(0)
40 else:
41 version_teeworlds = "trunk"
43 bam_execution_path = ""
44 if version_bam < "0.3.0":
45 bam_execution_path = "src%s" % os.sep
47 name = "teeworlds"
49 flag_clean = True
50 flag_download = True
51 flag_unpack = True
52 flag_build_bam = True
53 flag_build_teeworlds = True
54 flag_make_release = True
56 if os.name == "nt":
57 platform = "win32"
58 else:
59 # get name
60 osname = os.popen("uname").readline().strip().lower()
61 if osname == "darwin":
62 osname = "osx"
64 # get arch
65 machine = os.popen("uname -m").readline().strip().lower()
66 arch = "unknown"
68 if machine[0] == "i" and machine[2:] == "86":
69 arch = "x86"
70 elif machine == "x86_64":
71 arch = "x86_64"
72 elif "power" in machine.lower():
73 arch = "ppc"
75 platform = osname + "_" + arch
77 print("%s-%s-%s" % (name, version_teeworlds, platform))
79 root_dir = os.getcwd() + os.sep
80 work_dir = root_dir + "scripts/work"
82 def fetch_file(url):
83 try:
84 print("trying %s" % url)
85 real_url = url_lib.urlopen(url).geturl()
86 local = real_url.split("/")
87 local = local[len(local)-1].split("?")
88 local = local[0]
89 url_lib.urlretrieve(real_url, local)
90 return local
91 except:
92 return False
94 def unzip(filename, where):
95 try:
96 z = zipfile.ZipFile(filename, "r")
97 except:
98 return False
99 list = "\n"
100 for name in z.namelist():
101 list += "%s\n" % name
102 try: os.makedirs(where+"/"+os.path.dirname(name))
103 except: pass
105 try:
106 f = open(where+"/"+name, "wb")
107 f.write(z.read(name))
108 f.close()
109 except: pass
111 z.close()
113 directory = "[^/\n]*?/"
114 part_1 = "(?<=\n)"
115 part_2 = "[^/\n]+(?=\n)"
116 regular_expression = r"%s%s" % (part_1, part_2)
117 main_directory = re.search(regular_expression, list)
118 while main_directory == None:
119 part_1 += directory
120 regular_expression = r"%s%s" % (part_1, part_2)
121 main_directory = re.search(regular_expression, list)
122 main_directory = re.search(r".*/", "./%s" % main_directory.group(0))
123 return main_directory.group(0)
125 def bail(reason):
126 print(reason)
127 os.chdir(work_dir)
128 sys.exit(-1)
130 def clean():
131 print("*** cleaning ***")
132 try: shutil.rmtree(work_dir)
133 except: pass
135 def file_exists(file):
136 try:
137 open(file).close()
138 return True
139 except:
140 return False;
142 def search_object(directory, object):
143 directory = os.listdir(directory)
144 for entry in directory:
145 match = re.search(object, entry)
146 if match != None:
147 return entry
149 # clean
150 if flag_clean:
151 clean()
153 # make dir
154 try: os.mkdir(work_dir)
155 except: pass
157 # change dir
158 os.chdir(work_dir)
160 # download
161 if flag_download:
162 print("*** downloading bam source package ***")
163 src_package_bam = fetch_file(options.url_bam)
164 if src_package_bam:
165 if version_bam == 'trunk':
166 version = re.search(r"-[^-]*?([^-]*?)\.[^.]*$", src_package_bam)
167 if version:
168 version_bam = version.group(1)
169 else:
170 bail("couldn't find bam source package and couldn't download it")
172 print("*** downloading %s source package ***" % name)
173 src_package_teeworlds = fetch_file(options.url_teeworlds)
174 if src_package_teeworlds:
175 if version_teeworlds == 'trunk':
176 version = re.search(r"-[^-]*?([^-]*?)\.[^.]*$", src_package_teeworlds)
177 if version:
178 version_teeworlds = version.group(1)
179 else:
180 bail("couldn't find %s source package and couldn't download it" % name)
182 # unpack
183 if flag_unpack:
184 print("*** unpacking source ***")
185 if hasattr(locals(), 'src_package_bam') == False:
186 src_package_bam = search_object(work_dir, r"bam.*?\.")
187 if not src_package_bam:
188 bail("couldn't find bam source package")
189 src_dir_bam = unzip(src_package_bam, ".")
190 if not src_dir_bam:
191 bail("couldn't unpack bam source package")
193 if hasattr(locals(), 'src_package_teeworlds') == False:
194 src_package_teeworlds = search_object(work_dir, r"teeworlds.*?\.")
195 if not src_package_bam:
196 bail("couldn't find %s source package" % name)
197 src_dir_teeworlds = unzip(src_package_teeworlds, ".")
198 if not src_dir_teeworlds:
199 bail("couldn't unpack %s source package" % name)
201 # build bam
202 if flag_build_bam:
203 print("*** building bam ***")
204 os.chdir("%s/%s" % (work_dir, src_dir_bam))
205 if os.name == "nt":
206 bam_compiled = False
207 compiler_bam = ["cl", "gcc"]
208 for compiler in compiler_bam:
209 if compiler == "cl":
210 os.system("make_win32_msvc.bat")
211 elif compiler == "gcc":
212 os.system("make_win32_mingw.bat")
213 if file_exists("%sbam.exe" % bam_execution_path) == True:
214 bam_compiled = True
215 break
216 if bam_compiled == False:
217 bail("failed to build bam")
218 else:
219 os.system("sh make_unix.sh")
220 if file_exists("%sbam" % bam_execution_path) == False:
221 bail("failed to build bam")
222 os.chdir(work_dir)
224 # build the game
225 if flag_build_teeworlds:
226 print("*** building %s ***" % name)
227 if hasattr(locals(), 'src_dir_bam') == False:
228 src_dir_bam = search_object(work_dir, r"bam[^\.]*$") + os.sep
229 if src_dir_bam:
230 directory = src_dir_bam + bam_execution_path
231 file = r"bam"
232 if os.name == "nt":
233 file += r"\.exe"
234 if not search_object(directory, file):
235 bail("couldn't find bam")
236 else:
237 bail("couldn't find bam")
238 if hasattr(locals(), 'src_dir_teeworlds') == False:
239 src_dir_teeworlds = search_object(work_dir, r"teeworlds[^\.]*$")
240 if not src_dir_teeworlds:
241 bail("couldn't find %s source" % name)
242 command = 1
243 if os.name == "nt":
244 file = open("build.bat", "wb")
245 content = "@echo off\n"
246 content += "@REM check if we already have the tools in the environment\n"
247 content += "if exist \"%VCINSTALLDIR%\" (\ngoto compile\n)\n"
248 content += "@REM Check for Visual Studio\n"
249 content += "if exist \"%VS100COMNTOOLS%\" (\nset VSPATH=\"%VS100COMNTOOLS%\"\ngoto set_env\n)\n"
250 content += "if exist \"%VS90COMNTOOLS%\" (\nset VSPATH=\"%VS90COMNTOOLS%\"\ngoto set_env\n)\n"
251 content += "if exist \"%VS80COMNTOOLS%\" (\nset VSPATH=\"%VS80COMNTOOLS%\"\ngoto set_env\n)\n\n"
252 content += "echo You need Microsoft Visual Studio 8, 9 or 10 installed\n"
253 content += "exit\n"
254 content += "@ setup the environment\n"
255 content += ":set_env\n"
256 content += "call %VSPATH%vsvars32.bat\n\n"
257 content += ":compile\n"
258 content += 'cd %s\n"%s\\%s%sbam" config\n"%s\\%s%sbam" %s' % (src_dir_teeworlds, work_dir, src_dir_bam, bam_execution_path, work_dir, src_dir_bam, bam_execution_path, options.release_type)
259 file.write(content.encode())
260 file.close()
261 command = os.system("build.bat")
262 else:
263 os.chdir(src_dir_teeworlds)
264 command = os.system("%s/%s%sbam %s" % (work_dir, src_dir_bam, bam_execution_path, options.release_type))
265 if command != 0:
266 bail("failed to build %s" % name)
267 os.chdir(work_dir)
269 # make release
270 if flag_make_release:
271 print("*** making release ***")
272 if hasattr(locals(), 'src_dir_teeworlds') == False:
273 src_dir_teeworlds = search_object(work_dir, r"teeworlds[^\.]*$")
274 if not src_dir_teeworlds:
275 bail("couldn't find %s source" % name)
276 os.chdir(src_dir_teeworlds)
277 command = '"%s/%s/scripts/make_release.py" %s %s' % (work_dir, src_dir_teeworlds, version_teeworlds, platform)
278 if os.name != "nt":
279 command = "python %s" % command
280 if os.system(command) != 0:
281 bail("failed to make a relase of %s" % name)
282 final_output = "FAIL"
283 for f in os.listdir("."):
284 if version_teeworlds in f and platform in f and name in f and (".zip" in f or ".tar.gz" in f):
285 final_output = f
286 os.chdir(work_dir)
287 shutil.copy("%s/%s" % (src_dir_teeworlds, final_output), "../"+final_output)
288 os.chdir(root_dir)
289 clean()
291 print("*** all done ***")