OLD | NEW |
| (Empty) |
1 # Copyright (c) 2008-2009 The Chromium Authors. All rights reserved. | |
2 # Use of this source code is governed by a BSD-style license that can be | |
3 # found in the LICENSE file. | |
4 | |
5 """This is the Linux implementation of the layout_package.platform_utils | |
6 package. This file should only be imported by that package.""" | |
7 | |
8 import os | |
9 import signal | |
10 import subprocess | |
11 import sys | |
12 import logging | |
13 | |
14 import path_utils | |
15 import platform_utils_win | |
16 | |
17 | |
18 def PlatformName(): | |
19 """Returns the name of the platform we're currently running on.""" | |
20 return 'chromium-linux' + PlatformVersion() | |
21 | |
22 | |
23 def PlatformVersion(): | |
24 """Returns the version string for the platform, e.g. '-vista' or | |
25 '-snowleopard'. If the platform does not distinguish between | |
26 minor versions, it returns ''.""" | |
27 return '' | |
28 | |
29 | |
30 def GetNumCores(): | |
31 """Returns the number of cores on the machine. For hyperthreaded machines, | |
32 this will be double the number of actual processors.""" | |
33 num_cores = os.sysconf("SC_NPROCESSORS_ONLN") | |
34 if isinstance(num_cores, int) and num_cores > 0: | |
35 return num_cores | |
36 return 1 | |
37 | |
38 | |
39 def BaselinePath(platform=None): | |
40 """Returns the path relative to the top of the source tree for the | |
41 baselines for the specified platform version. If |platform| is None, | |
42 then the version currently in use is used.""" | |
43 if platform is None: | |
44 platform = PlatformName() | |
45 return path_utils.PathFromBase('webkit', 'data', 'layout_tests', | |
46 'platform', platform, 'LayoutTests') | |
47 | |
48 | |
49 def BaselineSearchPath(platform=None): | |
50 """Returns the list of directories to search for baselines/results, in | |
51 order of preference. Paths are relative to the top of the source tree.""" | |
52 return [BaselinePath(platform), | |
53 platform_utils_win.BaselinePath('chromium-win'), | |
54 path_utils.WebKitBaselinePath('win'), | |
55 path_utils.WebKitBaselinePath('mac')] | |
56 | |
57 | |
58 def ApacheExecutablePath(): | |
59 """Returns the executable path to start Apache""" | |
60 path = os.path.join("/usr", "sbin", "apache2") | |
61 if os.path.exists(path): | |
62 return path | |
63 print "Unable to fine Apache executable %s" % path | |
64 _MissingApache() | |
65 | |
66 | |
67 def ApacheConfigFilePath(): | |
68 """Returns the path to Apache config file""" | |
69 return path_utils.PathFromBase("third_party", "WebKit", "LayoutTests", | |
70 "http", "conf", "apache2-debian-httpd.conf") | |
71 | |
72 | |
73 def LigHTTPdExecutablePath(): | |
74 """Returns the executable path to start LigHTTPd""" | |
75 binpath = "/usr/sbin/lighttpd" | |
76 if os.path.exists(binpath): | |
77 return binpath | |
78 print "Unable to find LigHTTPd executable %s" % binpath | |
79 _MissingLigHTTPd() | |
80 | |
81 | |
82 def LigHTTPdModulePath(): | |
83 """Returns the library module path for LigHTTPd""" | |
84 modpath = "/usr/lib/lighttpd" | |
85 if os.path.exists(modpath): | |
86 return modpath | |
87 print "Unable to find LigHTTPd modules %s" % modpath | |
88 _MissingLigHTTPd() | |
89 | |
90 | |
91 def LigHTTPdPHPPath(): | |
92 """Returns the PHP executable path for LigHTTPd""" | |
93 binpath = "/usr/bin/php-cgi" | |
94 if os.path.exists(binpath): | |
95 return binpath | |
96 print "Unable to find PHP CGI executable %s" % binpath | |
97 _MissingLigHTTPd() | |
98 | |
99 | |
100 def WDiffPath(): | |
101 """Path to the WDiff executable, which we assume is already installed and | |
102 in the user's $PATH.""" | |
103 return 'wdiff' | |
104 | |
105 | |
106 def ImageDiffPath(target): | |
107 """Path to the image_diff binary. | |
108 | |
109 Args: | |
110 target: Build target mode (debug or release)""" | |
111 return _PathFromBuildResults(target, 'image_diff') | |
112 | |
113 | |
114 def LayoutTestHelperPath(target): | |
115 """Path to the layout_test helper binary, if needed, empty otherwise""" | |
116 return '' | |
117 | |
118 | |
119 def TestShellPath(target): | |
120 """Return the platform-specific binary path for our TestShell. | |
121 | |
122 Args: | |
123 target: Build target mode (debug or release) """ | |
124 if target in ('Debug', 'Release'): | |
125 try: | |
126 debug_path = _PathFromBuildResults('Debug', 'test_shell') | |
127 release_path = _PathFromBuildResults('Release', 'test_shell') | |
128 | |
129 debug_mtime = os.stat(debug_path).st_mtime | |
130 release_mtime = os.stat(release_path).st_mtime | |
131 | |
132 if debug_mtime > release_mtime and target == 'Release' or \ | |
133 release_mtime > debug_mtime and target == 'Debug': | |
134 logging.info('\x1b[31mWarning: you are not running the most ' | |
135 'recent test_shell binary. You need to pass ' | |
136 '--debug or not to select between Debug and ' | |
137 'Release.\x1b[0m') | |
138 # This will fail if we don't have both a debug and release binary. | |
139 # That's fine because, in this case, we must already be running the | |
140 # most up-to-date one. | |
141 except path_utils.PathNotFound: | |
142 pass | |
143 | |
144 return _PathFromBuildResults(target, 'test_shell') | |
145 | |
146 | |
147 def FuzzyMatchPath(): | |
148 """Return the path to the fuzzy matcher binary.""" | |
149 return path_utils.PathFromBase('third_party', 'fuzzymatch', 'fuzzymatch') | |
150 | |
151 | |
152 def ShutDownHTTPServer(server_pid): | |
153 """Shut down the lighttpd web server. Blocks until it's fully shut down. | |
154 | |
155 Args: | |
156 server_pid: The process ID of the running server. | |
157 """ | |
158 # server_pid is not set when "http_server.py stop" is run manually. | |
159 if server_pid is None: | |
160 # This isn't ideal, since it could conflict with web server processes | |
161 # not started by http_server.py, but good enough for now. | |
162 KillAllProcess('lighttpd') | |
163 KillAllProcess('apache2') | |
164 else: | |
165 try: | |
166 os.kill(server_pid, signal.SIGTERM) | |
167 #TODO(mmoss) Maybe throw in a SIGKILL just to be sure? | |
168 except OSError: | |
169 # Sometimes we get a bad PID (e.g. from a stale httpd.pid file), | |
170 # so if kill fails on the given PID, just try to 'killall' web | |
171 # servers. | |
172 ShutDownHTTPServer(None) | |
173 | |
174 | |
175 def KillProcess(pid): | |
176 """Forcefully kill the process. | |
177 | |
178 Args: | |
179 pid: The id of the process to be killed. | |
180 """ | |
181 os.kill(pid, signal.SIGKILL) | |
182 | |
183 | |
184 def KillAllProcess(process_name): | |
185 null = open(os.devnull) | |
186 subprocess.call(['killall', '-TERM', '-u', os.getenv('USER'), | |
187 process_name], stderr=null) | |
188 null.close() | |
189 | |
190 | |
191 def KillAllTestShells(): | |
192 """Kills all instances of the test_shell binary currently running.""" | |
193 KillAllProcess('test_shell') | |
194 | |
195 # | |
196 # Private helper functions | |
197 # | |
198 | |
199 | |
200 def _MissingLigHTTPd(): | |
201 print 'Please install using: "sudo apt-get install lighttpd php5-cgi"' | |
202 print 'For complete Linux build requirements, please see:' | |
203 print 'http://code.google.com/p/chromium/wiki/LinuxBuildInstructions' | |
204 sys.exit(1) | |
205 | |
206 | |
207 def _MissingApache(): | |
208 print ('Please install using: "sudo apt-get install apache2 ' | |
209 'libapache2-mod-php5"') | |
210 print 'For complete Linux build requirements, please see:' | |
211 print 'http://code.google.com/p/chromium/wiki/LinuxBuildInstructions' | |
212 sys.exit(1) | |
213 | |
214 | |
215 def _PathFromBuildResults(*pathies): | |
216 # FIXME(dkegel): use latest or warn if more than one found? | |
217 for dir in ["sconsbuild", "out", "xcodebuild"]: | |
218 try: | |
219 return path_utils.PathFromBase(dir, *pathies) | |
220 except: | |
221 pass | |
222 raise path_utils.PathNotFound("Unable to find %s in build tree" % | |
223 (os.path.join(*pathies))) | |
OLD | NEW |