blob: d277471be300c2937a4efe0cd82caf6e49f2be24 [file] [log] [blame]
Benny Prijonof44f79b2010-03-23 14:03:30 +00001#!/usr/bin/python
2
3import optparse
4import os
5import platform
6import socket
7import subprocess
8import sys
9
10PROG = "r" + "$Rev: 17 $".strip("$ ").replace("Rev: ", "")
Benny Prijonof9ebaf62010-03-27 02:35:06 +000011PYTHON = os.path.basename(sys.executable)
12build_type = ""
13vs_target = ""
Benny Prijono462a67c2010-03-27 07:49:18 +000014s60_target = ""
Benny Prijono1f3c1b02010-08-27 13:27:55 +000015no_test = False
16no_pjsua_test = False
Benny Prijonof44f79b2010-03-23 14:03:30 +000017
18#
19# Get gcc version
20#
21def gcc_version(gcc):
22 proc = subprocess.Popen(gcc + " -v", stdout=subprocess.PIPE,
23 stderr=subprocess.STDOUT, shell=True)
24 ver = ""
25 while True:
26 s = proc.stdout.readline()
27 if not s:
28 break
29 if s.find("gcc version") >= 0:
30 ver = s.split(None, 3)[2]
31 break
32 proc.wait()
33 return "gcc-" + ver
34
Benny Prijonof9ebaf62010-03-27 02:35:06 +000035#
Benny Prijono462a67c2010-03-27 07:49:18 +000036# Get Visual Studio info
Benny Prijonof9ebaf62010-03-27 02:35:06 +000037#
38class VSVersion:
39 def __init__(self):
40 self.version = "8"
41 self.release = "2005"
42
43 proc = subprocess.Popen("cl", stdout=subprocess.PIPE,
44 stderr=subprocess.STDOUT)
45 while True:
46 s = proc.stdout.readline()
47 if s=="":
48 break
49 pos = s.find("Version")
50 if pos > 0:
51 proc.wait()
52 s = s[pos+8:]
53 ver = s.split(None, 1)[0]
54 major = ver[0:2]
55 if major=="12":
56 self.version = "6"
57 self.release = "98"
58 break
59 elif major=="13":
60 self.version = "7"
61 self.release = "2003"
62 break
63 elif major=="14":
64 self.version = "8"
65 self.release = "2005"
66 break
67 elif major=="15":
68 self.version = "9"
69 self.release = "2008"
70 break
Benny Prijono3d71eb02010-03-30 13:02:40 +000071 elif major=="16":
Benny Prijonof9ebaf62010-03-27 02:35:06 +000072 self.version = "10"
73 self.release = "2010"
74 break
Benny Prijono3d71eb02010-03-30 13:02:40 +000075 else:
76 self.version = "11"
77 self.release = "2012"
78 break
Benny Prijonof9ebaf62010-03-27 02:35:06 +000079 proc.wait()
80 self.vs_version = "vs" + self.version
81 self.vs_release = "vs" + self.release
82
83
Benny Prijono462a67c2010-03-27 07:49:18 +000084#
85# Get S60 SDK info
86#
87class S60SDK:
88 def __init__(self):
Benny Prijonodc4ccca2010-08-26 08:17:01 +000089 self.epocroot = ""
90 self.sdk = ""
91 self.device = ""
92
Benny Prijono462a67c2010-03-27 07:49:18 +000093 # Check that EPOCROOT is set
94 if not "EPOCROOT" in os.environ:
Benny Prijonod9998a92010-04-20 10:05:09 +000095 sys.stderr.write("Error: EPOCROOT environment variable is not set\n")
Benny Prijono462a67c2010-03-27 07:49:18 +000096 sys.exit(1)
97 epocroot = os.environ["EPOCROOT"]
98 # EPOCROOT must have trailing backslash
99 if epocroot[-1] != "\\":
100 epocroot = epocroot + "\\"
101 os.environ["EPOCROOT"] = epocroot
Benny Prijonodc4ccca2010-08-26 08:17:01 +0000102 self.epocroot = epocroot
103 self.sdk = sdk1 = epocroot.split("\\")[-2]
104 self.device = "@" + self.sdk + ":com.nokia.s60"
Benny Prijono462a67c2010-03-27 07:49:18 +0000105
106 # Check that correct device is set
107 proc = subprocess.Popen("devices", stdout=subprocess.PIPE,
108 stderr=subprocess.STDOUT, shell=True)
109 sdk2 = ""
110 while True:
111 line = proc.stdout.readline()
112 if line.find("- default") > 0:
113 sdk2 = line.split(":",1)[0]
114 break
115 proc.wait()
116
117 if sdk1 != sdk2:
Benny Prijonod9998a92010-04-20 10:05:09 +0000118 sys.stderr.write("Error: default SDK in device doesn't match EPOCROOT\n")
Benny Prijonoc7d28602010-08-25 03:53:52 +0000119 sys.stderr.write("Default device SDK = '" + sdk2 + "'\n")
120 sys.stderr.write("EPOCROOT SDK = '" + sdk1 + "'\n")
Benny Prijono462a67c2010-03-27 07:49:18 +0000121 sys.exit(1)
122
123 self.name = sdk2.replace("_", "-")
124
125
126
Benny Prijonof44f79b2010-03-23 14:03:30 +0000127def replace_vars(text):
Benny Prijono1f3c1b02010-08-27 13:27:55 +0000128 global vs_target, s60_target, build_type, no_test, no_pjsua_test
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000129 suffix = ""
Benny Prijono462a67c2010-03-27 07:49:18 +0000130
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000131 os_info = platform.system() + platform.release() + "-" + platform.machine()
132
133 # osinfo
Benny Prijonodc4ccca2010-08-26 08:17:01 +0000134 s60sdk_var = None
Benny Prijono462a67c2010-03-27 07:49:18 +0000135 if build_type == "s60":
Benny Prijonodc4ccca2010-08-26 08:17:01 +0000136 s60sdk_var = S60SDK()
137 os_info = s60sdk_var.name
Benny Prijono462a67c2010-03-27 07:49:18 +0000138 elif platform.system().lower() == "windows" or platform.system().lower() == "microsoft":
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000139 if platform.system().lower() == "microsoft":
140 os_info = platform.release() + "-" + platform.version() + "-" + platform.win32_ver()[2]
141 elif platform.system().lower() == "linux":
Benny Prijonod9998a92010-04-20 10:05:09 +0000142 os_info = "-" + "-".join(platform.linux_distribution()[0:2])
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000143
Benny Prijono462a67c2010-03-27 07:49:18 +0000144 # vs_target
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000145 if not vs_target and text.find("$(VSTARGET)") >= 0:
146 if build_type != "vs":
Benny Prijono462a67c2010-03-27 07:49:18 +0000147 sys.stderr.write("Warning: $(VSTARGET) only valid for Visual Studio\n")
148 print "Enter Visual Studio vs_target name (e.g. Release, Debug) [Release]: ",
149 vs_target = sys.stdin.readline().replace("\n", "").replace("\r", "")
150 if not vs_target:
151 vs_target = "Release"
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000152
Benny Prijono462a67c2010-03-27 07:49:18 +0000153 # s60_target
154 if not s60_target and text.find("$(S60TARGET)") >= 0:
155 if build_type != "s60":
156 sys.stderr.write("Warning: $(S60TARGET) only valid for S60\n")
157 print "Enter S60 target name (e.g. \"gcce urel\") [gcce urel]: ",
158 s60_target = sys.stdin.readline().replace("\n", "").replace("\r", "")
159 if not s60_target:
160 s60_target = "gcce urel"
161
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000162 # Suffix
163 if build_type == "vs":
164 suffix = "i386-Win32-vc8-" + vs_target
Benny Prijono462a67c2010-03-27 07:49:18 +0000165 elif build_type == "s60":
Benny Prijonodc4ccca2010-08-26 08:17:01 +0000166 suffix = s60sdk_var.name + "-" + s60_target.replace(" ", "-")
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000167 elif build_type == "gnu":
168 proc = subprocess.Popen("sh config.guess", cwd="../..",
169 shell=True, stdout=subprocess.PIPE)
170 suffix = proc.stdout.readline().rstrip(" \r\n")
171 else:
Benny Prijonod9998a92010-04-20 10:05:09 +0000172 sys.stderr.write("Error: unsupported build type '" + build_type + "'\n")
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000173 sys.exit(1)
174
Benny Prijonof44f79b2010-03-23 14:03:30 +0000175 while True:
176 if text.find("$(PJSUA-TESTS)") >= 0:
Benny Prijono1f3c1b02010-08-27 13:27:55 +0000177 if no_test==False and no_pjsua_test==False:
178 # Determine pjsua exe to use
179 exe = "../../pjsip-apps/bin/pjsua-" + suffix
180 proc = subprocess.Popen(PYTHON + " runall.py --list-xml -e " + exe,
181 cwd="../pjsua",
182 shell=True, stdout=subprocess.PIPE)
183 content = proc.stdout.read()
184 else:
185 content = ""
Benny Prijonof44f79b2010-03-23 14:03:30 +0000186 text = text.replace("$(PJSUA-TESTS)", content)
187 elif text.find("$(GCC)") >= 0:
188 text = text.replace("$(GCC)", gcc_version("gcc"))
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000189 elif text.find("$(VS)") >= 0:
190 vsver = VSVersion()
Benny Prijono462a67c2010-03-27 07:49:18 +0000191 text = text.replace("$(VS)", VSVersion().vs_release)
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000192 elif text.find("$(VSTARGET)") >= 0:
193 text = text.replace("$(VSTARGET)", vs_target)
Benny Prijono462a67c2010-03-27 07:49:18 +0000194 elif text.find("$(S60TARGET)") >= 0:
195 text = text.replace("$(S60TARGET)", s60_target)
196 elif text.find("$(S60TARGETNAME)") >= 0:
197 text = text.replace("$(S60TARGETNAME)", s60_target.replace(" ", "-"))
Benny Prijonodc4ccca2010-08-26 08:17:01 +0000198 elif text.find("$(S60DEVICE)") >= 0:
199 text = text.replace("$(S60DEVICE)", s60sdk_var.device)
200 elif text.find("$(EPOCROOT)") >= 0:
201 text = text.replace("$(EPOCROOT)", s60sdk_var.epocroot)
Benny Prijonof44f79b2010-03-23 14:03:30 +0000202 elif text.find("$(DISABLED)") >= 0:
203 text = text.replace("$(DISABLED)", "0")
Benny Prijonod9998a92010-04-20 10:05:09 +0000204 elif text.find("$(IPPROOT)") >= 0:
205 if not os.environ.has_key("IPPROOT"):
206 sys.stderr.write("Error: environment variable IPPROOT is needed but not set\n")
207 sys.exit(1)
208 text = text.replace("$(IPPROOT)", os.environ["IPPROOT"])
209 elif text.find("$(IPPSAMPLES)") >= 0:
210 if not os.environ.has_key("IPPSAMPLES"):
211 sys.stderr.write("Error: environment variable IPPSAMPLES is needed but not set\n")
212 sys.exit(1)
213 text = text.replace("$(IPPSAMPLES)", os.environ["IPPSAMPLES"])
214 elif text.find("$(IPPARCH)") >= 0:
215 if not os.environ.has_key("IPPARCH"):
216 text = text.replace("$(IPPARCH)", "")
217 else:
218 text = text.replace("$(IPPARCH)", os.environ["IPPARCH"])
Benny Prijonof44f79b2010-03-23 14:03:30 +0000219 elif text.find("$(OS)") >= 0:
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000220 text = text.replace("$(OS)", os_info)
Benny Prijonof44f79b2010-03-23 14:03:30 +0000221 elif text.find("$(SUFFIX)") >= 0:
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000222 text = text.replace("$(SUFFIX)", suffix)
Benny Prijonof44f79b2010-03-23 14:03:30 +0000223 elif text.find("$(HOSTNAME)") >= 0:
224 text = text.replace("$(HOSTNAME)", socket.gethostname())
225 elif text.find("$(PJDIR)") >= 0:
226 wdir = os.path.join(os.getcwd(), "../..")
227 wdir = os.path.normpath(wdir)
228 text = text.replace("$(PJDIR)", wdir)
Benny Prijonoc7d28602010-08-25 03:53:52 +0000229 elif text.find("$(NOP)") >= 0:
230 if platform.system().lower() == "windows" or platform.system().lower() == "microsoft":
231 cmd = "CMD /C echo Success"
232 else:
233 cmd = "echo Success"
234 text = text.replace("$(NOP)", cmd)
Benny Prijono1f3c1b02010-08-27 13:27:55 +0000235 elif text.find("$(NOTEST)") >= 0:
236 if no_test:
237 str = '"1"'
238 else:
239 str = '"0"'
240 text = text.replace("$(NOTEST)", str)
Benny Prijonof44f79b2010-03-23 14:03:30 +0000241 else:
242 break
243 return text
244
245
246def main(args):
Benny Prijono1f3c1b02010-08-27 13:27:55 +0000247 global vs_target, s60_target, build_type, no_test, no_pjsua_test
Benny Prijonod9998a92010-04-20 10:05:09 +0000248 output = sys.stdout
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000249 usage = """Usage: configure.py [OPTIONS] scenario_template_file
250
251Where OPTIONS:
Benny Prijonod9998a92010-04-20 10:05:09 +0000252 -o FILE Output to file, otherwise to stdout.
253 -t TYPE Specify build type. If not specified, it will be
Benny Prijono462a67c2010-03-27 07:49:18 +0000254 asked if necessary. Values are:
255 vs: Visual Studio
256 gnu: Makefile based
257 s60: Symbian S60
258 -vstarget TARGETNAME Specify Visual Studio target name if build type is set
259 to vs. If not specified then it will be asked.
260 Sample target names:
261 - Debug
262 - Release
263 - or any other target in the project file
264 -s60target TARGETNAME Specify S60 target name if build type is set to s60.
265 If not specified then it will be asked. Sample target
266 names:
267 - "gcce udeb"
268 - "gcce urel"
Benny Prijono1f3c1b02010-08-27 13:27:55 +0000269 -notest Disable all tests in the scenario.
270 -nopjsuatest Disable pjsua tests in the scenario.
Benny Prijonof44f79b2010-03-23 14:03:30 +0000271"""
272
273 args.pop(0)
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000274 while len(args):
Benny Prijonod9998a92010-04-20 10:05:09 +0000275 if args[0]=='-o':
276 args.pop(0)
277 if len(args):
278 output = open(args[0], "wt")
279 args.pop(0)
280 else:
281 sys.stderr.write("Error: needs value for -o\n")
282 sys.exit(1)
283 elif args[0]=='-vstarget':
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000284 args.pop(0)
285 if len(args):
286 vs_target = args[0]
287 args.pop(0)
288 else:
Benny Prijono462a67c2010-03-27 07:49:18 +0000289 sys.stderr.write("Error: needs value for -vstarget\n")
290 sys.exit(1)
291 elif args[0]=='-s60target':
292 args.pop(0)
293 if len(args):
294 s60_target = args[0]
295 args.pop(0)
296 else:
297 sys.stderr.write("Error: needs value for -s60target\n")
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000298 sys.exit(1)
299 elif args[0]=='-t':
300 args.pop(0)
301 if len(args):
302 build_type = args[0].lower()
303 args.pop(0)
304 else:
305 sys.stderr.write("Error: needs value for -t\n")
306 sys.exit(1)
Benny Prijono462a67c2010-03-27 07:49:18 +0000307 if not ["vs", "gnu", "s60"].count(build_type):
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000308 sys.stderr.write("Error: invalid -t argument value\n")
309 sys.exit(1)
Benny Prijono1f3c1b02010-08-27 13:27:55 +0000310 elif args[0]=='-notest' or args[0]=='-notests':
311 args.pop(0)
312 no_test = True
313 elif args[0]=='-nopjsuatest' or args[0]=='-nopjsuatests':
314 args.pop(0)
315 no_pjsua_test = True
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000316 else:
317 break
318
319 if len(args) != 1:
Benny Prijonod9998a92010-04-20 10:05:09 +0000320 sys.stderr.write(usage + "\n")
Benny Prijonof44f79b2010-03-23 14:03:30 +0000321 return 1
322
Benny Prijonod9998a92010-04-20 10:05:09 +0000323 if not build_type:
Benny Prijono1de150f2010-08-18 04:16:04 +0000324 defval = "vs"
325 if "SHELL" in os.environ:
326 shell = os.environ["SHELL"]
327 if shell.find("sh") > -1:
328 defval = "gnu"
329 print "Enter the build type (values: vs, gnu, s60) [%s]: " % (defval),
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000330 build_type = sys.stdin.readline().replace("\n", "").replace("\r", "")
331 if not build_type:
Benny Prijono1de150f2010-08-18 04:16:04 +0000332 build_type = defval
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000333
334
Benny Prijonof44f79b2010-03-23 14:03:30 +0000335 tpl_file = args[len(args)-1]
336 if not os.path.isfile(tpl_file):
337 print "Error: unable to find template file '%s'" % (tpl_file)
338 return 1
339
340 f = open(tpl_file, "r")
341 tpl = f.read()
342 f.close()
343
344 tpl = replace_vars(tpl)
Benny Prijonod9998a92010-04-20 10:05:09 +0000345 output.write(tpl)
346 if output != sys.stdout:
347 output.close()
Benny Prijonof44f79b2010-03-23 14:03:30 +0000348 return 0
349
350
351if __name__ == "__main__":
352 rc = main(sys.argv)
353 sys.exit(rc)
354