blob: fe5cabc040797a9ccdfb69aaa7af788adf1c8685 [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 Prijonof44f79b2010-03-23 14:03:30 +000015
16#
17# Get gcc version
18#
19def gcc_version(gcc):
20 proc = subprocess.Popen(gcc + " -v", stdout=subprocess.PIPE,
21 stderr=subprocess.STDOUT, shell=True)
22 ver = ""
23 while True:
24 s = proc.stdout.readline()
25 if not s:
26 break
27 if s.find("gcc version") >= 0:
28 ver = s.split(None, 3)[2]
29 break
30 proc.wait()
31 return "gcc-" + ver
32
Benny Prijonof9ebaf62010-03-27 02:35:06 +000033#
Benny Prijono462a67c2010-03-27 07:49:18 +000034# Get Visual Studio info
Benny Prijonof9ebaf62010-03-27 02:35:06 +000035#
36class VSVersion:
37 def __init__(self):
38 self.version = "8"
39 self.release = "2005"
40
41 proc = subprocess.Popen("cl", stdout=subprocess.PIPE,
42 stderr=subprocess.STDOUT)
43 while True:
44 s = proc.stdout.readline()
45 if s=="":
46 break
47 pos = s.find("Version")
48 if pos > 0:
49 proc.wait()
50 s = s[pos+8:]
51 ver = s.split(None, 1)[0]
52 major = ver[0:2]
53 if major=="12":
54 self.version = "6"
55 self.release = "98"
56 break
57 elif major=="13":
58 self.version = "7"
59 self.release = "2003"
60 break
61 elif major=="14":
62 self.version = "8"
63 self.release = "2005"
64 break
65 elif major=="15":
66 self.version = "9"
67 self.release = "2008"
68 break
Benny Prijono3d71eb02010-03-30 13:02:40 +000069 elif major=="16":
Benny Prijonof9ebaf62010-03-27 02:35:06 +000070 self.version = "10"
71 self.release = "2010"
72 break
Benny Prijono3d71eb02010-03-30 13:02:40 +000073 else:
74 self.version = "11"
75 self.release = "2012"
76 break
Benny Prijonof9ebaf62010-03-27 02:35:06 +000077 proc.wait()
78 self.vs_version = "vs" + self.version
79 self.vs_release = "vs" + self.release
80
81
Benny Prijono462a67c2010-03-27 07:49:18 +000082#
83# Get S60 SDK info
84#
85class S60SDK:
86 def __init__(self):
Benny Prijonodc4ccca2010-08-26 08:17:01 +000087 self.epocroot = ""
88 self.sdk = ""
89 self.device = ""
90
Benny Prijono462a67c2010-03-27 07:49:18 +000091 # Check that EPOCROOT is set
92 if not "EPOCROOT" in os.environ:
Benny Prijonod9998a92010-04-20 10:05:09 +000093 sys.stderr.write("Error: EPOCROOT environment variable is not set\n")
Benny Prijono462a67c2010-03-27 07:49:18 +000094 sys.exit(1)
95 epocroot = os.environ["EPOCROOT"]
96 # EPOCROOT must have trailing backslash
97 if epocroot[-1] != "\\":
98 epocroot = epocroot + "\\"
99 os.environ["EPOCROOT"] = epocroot
Benny Prijonodc4ccca2010-08-26 08:17:01 +0000100 self.epocroot = epocroot
101 self.sdk = sdk1 = epocroot.split("\\")[-2]
102 self.device = "@" + self.sdk + ":com.nokia.s60"
Benny Prijono462a67c2010-03-27 07:49:18 +0000103
104 # Check that correct device is set
105 proc = subprocess.Popen("devices", stdout=subprocess.PIPE,
106 stderr=subprocess.STDOUT, shell=True)
107 sdk2 = ""
108 while True:
109 line = proc.stdout.readline()
110 if line.find("- default") > 0:
111 sdk2 = line.split(":",1)[0]
112 break
113 proc.wait()
114
115 if sdk1 != sdk2:
Benny Prijonod9998a92010-04-20 10:05:09 +0000116 sys.stderr.write("Error: default SDK in device doesn't match EPOCROOT\n")
Benny Prijonoc7d28602010-08-25 03:53:52 +0000117 sys.stderr.write("Default device SDK = '" + sdk2 + "'\n")
118 sys.stderr.write("EPOCROOT SDK = '" + sdk1 + "'\n")
Benny Prijono462a67c2010-03-27 07:49:18 +0000119 sys.exit(1)
120
121 self.name = sdk2.replace("_", "-")
122
123
124
Benny Prijonof44f79b2010-03-23 14:03:30 +0000125def replace_vars(text):
Benny Prijono462a67c2010-03-27 07:49:18 +0000126 global vs_target, s60_target, build_type
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000127 suffix = ""
Benny Prijono462a67c2010-03-27 07:49:18 +0000128
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000129 os_info = platform.system() + platform.release() + "-" + platform.machine()
130
131 # osinfo
Benny Prijonodc4ccca2010-08-26 08:17:01 +0000132 s60sdk_var = None
Benny Prijono462a67c2010-03-27 07:49:18 +0000133 if build_type == "s60":
Benny Prijonodc4ccca2010-08-26 08:17:01 +0000134 s60sdk_var = S60SDK()
135 os_info = s60sdk_var.name
Benny Prijono462a67c2010-03-27 07:49:18 +0000136 elif platform.system().lower() == "windows" or platform.system().lower() == "microsoft":
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000137 if platform.system().lower() == "microsoft":
138 os_info = platform.release() + "-" + platform.version() + "-" + platform.win32_ver()[2]
139 elif platform.system().lower() == "linux":
Benny Prijonod9998a92010-04-20 10:05:09 +0000140 os_info = "-" + "-".join(platform.linux_distribution()[0:2])
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000141
Benny Prijono462a67c2010-03-27 07:49:18 +0000142 # vs_target
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000143 if not vs_target and text.find("$(VSTARGET)") >= 0:
144 if build_type != "vs":
Benny Prijono462a67c2010-03-27 07:49:18 +0000145 sys.stderr.write("Warning: $(VSTARGET) only valid for Visual Studio\n")
146 print "Enter Visual Studio vs_target name (e.g. Release, Debug) [Release]: ",
147 vs_target = sys.stdin.readline().replace("\n", "").replace("\r", "")
148 if not vs_target:
149 vs_target = "Release"
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000150
Benny Prijono462a67c2010-03-27 07:49:18 +0000151 # s60_target
152 if not s60_target and text.find("$(S60TARGET)") >= 0:
153 if build_type != "s60":
154 sys.stderr.write("Warning: $(S60TARGET) only valid for S60\n")
155 print "Enter S60 target name (e.g. \"gcce urel\") [gcce urel]: ",
156 s60_target = sys.stdin.readline().replace("\n", "").replace("\r", "")
157 if not s60_target:
158 s60_target = "gcce urel"
159
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000160 # Suffix
161 if build_type == "vs":
162 suffix = "i386-Win32-vc8-" + vs_target
Benny Prijono462a67c2010-03-27 07:49:18 +0000163 elif build_type == "s60":
Benny Prijonodc4ccca2010-08-26 08:17:01 +0000164 suffix = s60sdk_var.name + "-" + s60_target.replace(" ", "-")
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000165 elif build_type == "gnu":
166 proc = subprocess.Popen("sh config.guess", cwd="../..",
167 shell=True, stdout=subprocess.PIPE)
168 suffix = proc.stdout.readline().rstrip(" \r\n")
169 else:
Benny Prijonod9998a92010-04-20 10:05:09 +0000170 sys.stderr.write("Error: unsupported build type '" + build_type + "'\n")
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000171 sys.exit(1)
172
Benny Prijonof44f79b2010-03-23 14:03:30 +0000173 while True:
174 if text.find("$(PJSUA-TESTS)") >= 0:
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000175 # Determine pjsua exe to use
176 exe = "../../pjsip-apps/bin/pjsua-" + suffix
177 proc = subprocess.Popen(PYTHON + " runall.py --list-xml -e " + exe,
178 cwd="../pjsua",
Benny Prijonof44f79b2010-03-23 14:03:30 +0000179 shell=True, stdout=subprocess.PIPE)
180 content = proc.stdout.read()
181 text = text.replace("$(PJSUA-TESTS)", content)
182 elif text.find("$(GCC)") >= 0:
183 text = text.replace("$(GCC)", gcc_version("gcc"))
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000184 elif text.find("$(VS)") >= 0:
185 vsver = VSVersion()
Benny Prijono462a67c2010-03-27 07:49:18 +0000186 text = text.replace("$(VS)", VSVersion().vs_release)
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000187 elif text.find("$(VSTARGET)") >= 0:
188 text = text.replace("$(VSTARGET)", vs_target)
Benny Prijono462a67c2010-03-27 07:49:18 +0000189 elif text.find("$(S60TARGET)") >= 0:
190 text = text.replace("$(S60TARGET)", s60_target)
191 elif text.find("$(S60TARGETNAME)") >= 0:
192 text = text.replace("$(S60TARGETNAME)", s60_target.replace(" ", "-"))
Benny Prijonodc4ccca2010-08-26 08:17:01 +0000193 elif text.find("$(S60DEVICE)") >= 0:
194 text = text.replace("$(S60DEVICE)", s60sdk_var.device)
195 elif text.find("$(EPOCROOT)") >= 0:
196 text = text.replace("$(EPOCROOT)", s60sdk_var.epocroot)
Benny Prijonof44f79b2010-03-23 14:03:30 +0000197 elif text.find("$(DISABLED)") >= 0:
198 text = text.replace("$(DISABLED)", "0")
Benny Prijonod9998a92010-04-20 10:05:09 +0000199 elif text.find("$(IPPROOT)") >= 0:
200 if not os.environ.has_key("IPPROOT"):
201 sys.stderr.write("Error: environment variable IPPROOT is needed but not set\n")
202 sys.exit(1)
203 text = text.replace("$(IPPROOT)", os.environ["IPPROOT"])
204 elif text.find("$(IPPSAMPLES)") >= 0:
205 if not os.environ.has_key("IPPSAMPLES"):
206 sys.stderr.write("Error: environment variable IPPSAMPLES is needed but not set\n")
207 sys.exit(1)
208 text = text.replace("$(IPPSAMPLES)", os.environ["IPPSAMPLES"])
209 elif text.find("$(IPPARCH)") >= 0:
210 if not os.environ.has_key("IPPARCH"):
211 text = text.replace("$(IPPARCH)", "")
212 else:
213 text = text.replace("$(IPPARCH)", os.environ["IPPARCH"])
Benny Prijonof44f79b2010-03-23 14:03:30 +0000214 elif text.find("$(OS)") >= 0:
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000215 text = text.replace("$(OS)", os_info)
Benny Prijonof44f79b2010-03-23 14:03:30 +0000216 elif text.find("$(SUFFIX)") >= 0:
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000217 text = text.replace("$(SUFFIX)", suffix)
Benny Prijonof44f79b2010-03-23 14:03:30 +0000218 elif text.find("$(HOSTNAME)") >= 0:
219 text = text.replace("$(HOSTNAME)", socket.gethostname())
220 elif text.find("$(PJDIR)") >= 0:
221 wdir = os.path.join(os.getcwd(), "../..")
222 wdir = os.path.normpath(wdir)
223 text = text.replace("$(PJDIR)", wdir)
Benny Prijonoc7d28602010-08-25 03:53:52 +0000224 elif text.find("$(NOP)") >= 0:
225 if platform.system().lower() == "windows" or platform.system().lower() == "microsoft":
226 cmd = "CMD /C echo Success"
227 else:
228 cmd = "echo Success"
229 text = text.replace("$(NOP)", cmd)
Benny Prijonof44f79b2010-03-23 14:03:30 +0000230 else:
231 break
232 return text
233
234
235def main(args):
Benny Prijono462a67c2010-03-27 07:49:18 +0000236 global vs_target, s60_target, build_type
Benny Prijonod9998a92010-04-20 10:05:09 +0000237 output = sys.stdout
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000238 usage = """Usage: configure.py [OPTIONS] scenario_template_file
239
240Where OPTIONS:
Benny Prijonod9998a92010-04-20 10:05:09 +0000241 -o FILE Output to file, otherwise to stdout.
242 -t TYPE Specify build type. If not specified, it will be
Benny Prijono462a67c2010-03-27 07:49:18 +0000243 asked if necessary. Values are:
244 vs: Visual Studio
245 gnu: Makefile based
246 s60: Symbian S60
247 -vstarget TARGETNAME Specify Visual Studio target name if build type is set
248 to vs. If not specified then it will be asked.
249 Sample target names:
250 - Debug
251 - Release
252 - or any other target in the project file
253 -s60target TARGETNAME Specify S60 target name if build type is set to s60.
254 If not specified then it will be asked. Sample target
255 names:
256 - "gcce udeb"
257 - "gcce urel"
Benny Prijonof44f79b2010-03-23 14:03:30 +0000258"""
259
260 args.pop(0)
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000261 while len(args):
Benny Prijonod9998a92010-04-20 10:05:09 +0000262 if args[0]=='-o':
263 args.pop(0)
264 if len(args):
265 output = open(args[0], "wt")
266 args.pop(0)
267 else:
268 sys.stderr.write("Error: needs value for -o\n")
269 sys.exit(1)
270 elif args[0]=='-vstarget':
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000271 args.pop(0)
272 if len(args):
273 vs_target = args[0]
274 args.pop(0)
275 else:
Benny Prijono462a67c2010-03-27 07:49:18 +0000276 sys.stderr.write("Error: needs value for -vstarget\n")
277 sys.exit(1)
278 elif args[0]=='-s60target':
279 args.pop(0)
280 if len(args):
281 s60_target = args[0]
282 args.pop(0)
283 else:
284 sys.stderr.write("Error: needs value for -s60target\n")
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000285 sys.exit(1)
286 elif args[0]=='-t':
287 args.pop(0)
288 if len(args):
289 build_type = args[0].lower()
290 args.pop(0)
291 else:
292 sys.stderr.write("Error: needs value for -t\n")
293 sys.exit(1)
Benny Prijono462a67c2010-03-27 07:49:18 +0000294 if not ["vs", "gnu", "s60"].count(build_type):
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000295 sys.stderr.write("Error: invalid -t argument value\n")
296 sys.exit(1)
297 else:
298 break
299
300 if len(args) != 1:
Benny Prijonod9998a92010-04-20 10:05:09 +0000301 sys.stderr.write(usage + "\n")
Benny Prijonof44f79b2010-03-23 14:03:30 +0000302 return 1
303
Benny Prijonod9998a92010-04-20 10:05:09 +0000304 if not build_type:
Benny Prijono1de150f2010-08-18 04:16:04 +0000305 defval = "vs"
306 if "SHELL" in os.environ:
307 shell = os.environ["SHELL"]
308 if shell.find("sh") > -1:
309 defval = "gnu"
310 print "Enter the build type (values: vs, gnu, s60) [%s]: " % (defval),
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000311 build_type = sys.stdin.readline().replace("\n", "").replace("\r", "")
312 if not build_type:
Benny Prijono1de150f2010-08-18 04:16:04 +0000313 build_type = defval
Benny Prijonof9ebaf62010-03-27 02:35:06 +0000314
315
Benny Prijonof44f79b2010-03-23 14:03:30 +0000316 tpl_file = args[len(args)-1]
317 if not os.path.isfile(tpl_file):
318 print "Error: unable to find template file '%s'" % (tpl_file)
319 return 1
320
321 f = open(tpl_file, "r")
322 tpl = f.read()
323 f.close()
324
325 tpl = replace_vars(tpl)
Benny Prijonod9998a92010-04-20 10:05:09 +0000326 output.write(tpl)
327 if output != sys.stdout:
328 output.close()
Benny Prijonof44f79b2010-03-23 14:03:30 +0000329 return 0
330
331
332if __name__ == "__main__":
333 rc = main(sys.argv)
334 sys.exit(rc)
335