Import Chromium's dom_perf test
[WebKit-https.git] / wscript
1 #! /usr/bin/env python
2
3 # Copyright (C) 2009 Kevin Ollivier  All rights reserved.
4 #
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
7 # are met:
8 # 1. Redistributions of source code must retain the above copyright
9 #    notice, this list of conditions and the following disclaimer.
10 # 2. Redistributions in binary form must reproduce the above copyright
11 #    notice, this list of conditions and the following disclaimer in the
12 #    documentation and/or other materials provided with the distribution.
13 #
14 # THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
25 #
26 # WebCore build script for the waf build system
27
28 import Options
29
30 from settings import *
31 import wxpresets
32
33 import TaskGen
34 from TaskGen import taskgen, feature, after
35 import Task, ccroot
36
37 def generate_webcore_derived_sources(conf):
38     # build the derived sources
39     derived_sources_dir = os.path.join(webcore_dir, 'DerivedSources')
40     wc_dir = webcore_dir
41     if building_on_win32:
42         wc_dir = get_output('cygpath --unix "%s"' % wc_dir)
43     if not os.path.exists(derived_sources_dir):
44         os.mkdir(derived_sources_dir)
45
46     olddir = os.getcwd()
47     os.chdir(derived_sources_dir)
48     
49     # DerivedSources.make expects Cygwin (i.e. Unix-style) python, so use that instead.
50     if building_on_win32:
51         oldpath = os.environ["PATH"]
52         os.environ["PATH"] = "/usr/bin" + os.pathsep + os.environ["PATH"]
53     os.system('make -f %s/DerivedSources.make WebCore=%s SOURCE_ROOT=%s all FEATURE_DEFINES="%s"' % (wc_dir, wc_dir, wc_dir, conf.env["FEATURE_DEFINES"]))
54     if building_on_win32:
55         os.environ["PATH"] = oldpath
56     os.system('perl %s/Source/WebKit/scripts/generate-webkitversion.pl --outputDir=%s --config %s/Source/WebKit/mac/Configurations/Version.xcconfig' % (wk_root, derived_sources_dir, wk_root))
57     os.chdir(olddir)
58
59 def generate_jscore_derived_sources(conf):
60     # build the derived sources
61     js_dir = jscore_dir
62     if building_on_win32:
63         js_dir = get_output('cygpath --unix "%s"' % js_dir)
64     derived_sources_dir = os.path.join(jscore_dir, 'DerivedSources')
65     if not os.path.exists(derived_sources_dir):
66         os.mkdir(derived_sources_dir)
67
68     olddir = os.getcwd()
69     os.chdir(derived_sources_dir)
70
71     # DerivedSources.make expects Cygwin (i.e. Unix-style) python, so use that instead.
72     if building_on_win32:
73         oldpath = os.environ["PATH"]
74         os.environ["PATH"] = "/usr/bin" + os.pathsep + os.environ["PATH"]
75     command = 'make -f %s/DerivedSources.make JavaScriptCore=%s BUILT_PRODUCTS_DIR=%s all FEATURE_DEFINES="%s"' % (js_dir, js_dir, js_dir, conf.env["FEATURE_DEFINES"])
76     os.system(command)
77     if building_on_win32:
78         os.environ["PATH"] = oldpath
79     os.chdir(olddir)
80
81 def set_options(opt):
82     common_set_options(opt)
83
84 def configure(conf):
85     common_configure(conf)
86     generate_jscore_derived_sources(conf)
87     generate_webcore_derived_sources(conf)
88     if Options.options.port == "wx" and sys.platform.startswith('win'):
89         graphics_dir = os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'graphics')
90         # HACK ALERT: MSVC automatically adds the source file's directory as the first entry in the
91         # path. Unfortunately, that means when compiling these files we will end up including
92         # win/FontPlatformData.h, which breaks wx compilation. So we copy the files to the wx dir.
93         for afile in ['UniscribeController.h', 'UniscribeController.cpp', 'GlyphPageTreeNodeCairoWin.cpp']:
94             shutil.copy(os.path.join(graphics_dir, 'win', afile), os.path.join(graphics_dir, 'wx'))
95
96     webcore_out_dir = os.path.join(output_dir, 'WebCore')
97     if not os.path.exists(webcore_out_dir):
98         os.makedirs(webcore_out_dir)
99     shutil.copy('Source/WebCore/platform/mac/WebCoreSystemInterface.h', os.path.join(output_dir, 'WebCore', 'WebCoreSystemInterface.h'))
100     jscore_out_dir = os.path.join(output_dir, 'JavaScriptCore')
101     if not os.path.exists(jscore_out_dir):
102         os.makedirs(jscore_out_dir)
103     for api_file in glob.glob(os.path.join(jscore_dir, 'API/*.h')):
104         shutil.copy(api_file, os.path.join(jscore_out_dir, os.path.basename(api_file)))
105
106     if Options.options.port == "wx" and Options.options.wxpython:
107         common_configure(conf)
108         conf.check_tool('swig', tooldir='Source/WebKit/wx/bindings/python')
109         conf.check_swig_version('1.3.29')
110
111 def build(bld):
112
113     webcore_dirs = list(webcore_dirs_common)
114
115     if Options.options.port == "wx":
116         webcore_dirs.extend(['Source/WebKit/wx', 'Source/WebKit/wx/WebKitSupport'])
117     
118     wk_includes = ['.',
119                     os.path.join(wk_root, 'Source', 'JavaScriptCore'),
120                     os.path.join(wk_root, 'Source', 'JavaScriptCore', 'wtf', 'text'),
121                     os.path.join(wk_root, 'Source', 'WebCore'),
122                     os.path.join(wk_root, 'Source', 'WebCore', 'DerivedSources'),
123                     os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'image-decoders'),
124                     os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'win'),
125                     os.path.join(wk_root, 'Source', 'WebCore', 'workers'),
126                     os.path.join(output_dir),
127             ]
128     
129     if Options.options.port == "wx":
130         wk_includes.append(os.path.join(wk_root, 'Source', 'WebKit', 'wx'))
131         wk_includes.append(os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'wx', 'wxcode'))
132     
133     if sys.platform.startswith("win"):
134         wk_includes.append(os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'win'))
135         wk_includes.append(os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'graphics', 'win'))
136     
137     windows_deps = [
138                     'lib/pthreadVC2.dll',
139                     'bin/icuuc40.dll', 'bin/icudt40.dll', 'bin/icuin40.dll',
140                     'bin/libcurl.dll', 'bin/libeay32.dll', 'bin/ssleay32.dll', 'bin/zlib1.dll',
141                     'lib/sqlite3.dll', 'bin/libxml2.dll', 'bin/libxslt.dll', 'bin/iconv.dll',
142                     ]
143     
144     webcore_sources = {}
145     
146     if Options.options.port == "wx":
147         webcore_sources['wx'] = [
148             'Source/WebCore/bindings/cpp/WebDOMEventTarget.cpp',
149             'Source/WebCore/platform/KillRingNone.cpp',
150             'Source/WebCore/platform/text/LocalizedDateNone.cpp',
151             'Source/WebCore/platform/text/LocalizedNumberNone.cpp'
152         ]  
153     
154         if building_on_win32:
155             # make sure platform/wx comes after this so we get the right
156             # FontPlatformData.h
157             webcore_dirs.extend(['Source/WebCore/platform/wx/wxcode/win', 'Source/WebCore/plugins/win'])
158             webcore_sources['wx-win'] = [
159                    'Source/WebCore/platform/graphics/win/GlyphPageTreeNodeCairoWin.cpp',
160                    'Source/WebCore/platform/graphics/win/TransformationMatrixWin.cpp',
161                    'Source/WebCore/platform/ScrollAnimatorWin.cpp',
162                    # wxTimer on Windows has a bug that causes it to eat crashes in callbacks
163                    # so we need to use the Win port's implementation until the wx bug fix is
164                    # widely available (it was fixed in 2.8.10).
165                    'Source/WebCore/platform/win/SharedTimerWin.cpp',
166                    'Source/WebCore/platform/win/SystemInfo.cpp',
167                    'Source/WebCore/platform/win/WebCoreInstanceHandle.cpp',
168                    # Use the Windows plugin architecture
169                    #'Source/WebCore/plugins/win/PluginDataWin.cpp',
170                    'Source/WebCore/plugins/win/PluginDatabaseWin.cpp',
171                    'Source/WebCore/plugins/win/PluginMessageThrottlerWin.cpp',
172                    'Source/WebCore/plugins/win/PluginPackageWin.cpp',
173                    'Source/WebCore/plugins/win/PluginViewWin.cpp',
174             ]
175             if Options.options.cairo:
176                 webcore_dirs.append('Source/WebCore/platform/wx/wxcode/cairo')
177             else:
178                 webcore_dirs.append('Source/WebCore/platform/wx/wxcode/gdiplus')
179         elif sys.platform.startswith('darwin'):
180             webcore_dirs.append('Source/WebCore/plugins/mac')
181             webcore_dirs.append('Source/WebCore/platform/wx/wxcode/mac/carbon')
182             webcore_dirs.append('Source/WebCore/platform/text/mac')
183             webcore_sources['wx-mac'] = [
184                    'Source/WebCore/platform/mac/PurgeableBufferMac.cpp',
185                    'Source/WebCore/platform/mac/WebCoreNSStringExtras.mm',
186                    'Source/WebCore/platform/mac/WebCoreSystemInterface.mm',
187                    'Source/WebCore/platform/graphics/cg/FloatSizeCG.cpp',
188                    'Source/WebCore/platform/graphics/mac/ComplexTextController.cpp',
189                    'Source/WebCore/platform/graphics/mac/ComplexTextControllerCoreText.mm',
190                    'Source/WebCore/platform/graphics/mac/ComplexTextControllerATSUI.cpp',
191                    'Source/WebCore/platform/graphics/mac/GlyphPageTreeNodeMac.cpp',
192                    'Source/WebCore/platform/graphics/mac/SimpleFontDataATSUI.mm',
193                    'Source/WebCore/platform/graphics/mac/SimpleFontDataCoreText.cpp',
194                    'Source/WebCore/platform/graphics/wx/FontPlatformDataWxMac.mm',
195                    'Source/WebCore/platform/wx/wxcode/mac/carbon/fontprops.mm',
196                    'Source/WebCore/plugins/mac/PluginPackageMac.cpp',
197                    'Source/WebCore/plugins/mac/PluginViewMac.mm'
198             ]
199         else:
200             webcore_sources['wx-gtk'] = [
201                    'Source/WebCore/plugins/PluginViewNone.cpp',
202                    'Source/WebCore/plugins/PluginPackageNone.cpp'
203             ]
204             webcore_dirs.append('Source/WebCore/platform/wx/wxcode/gtk')
205             webcore_dirs.append('Source/WebCore/platform/wx/wxcode/cairo')
206         
207
208     import TaskGen
209
210     # FIXME: Does this need to be Source/JavaScriptCore?
211     bld.add_subdirs('Source/JavaScriptCore')
212
213     if sys.platform.startswith('darwin'):
214         TaskGen.task_gen.mappings['.mm'] = TaskGen.task_gen.mappings['.cxx']
215         TaskGen.task_gen.mappings['.m'] = TaskGen.task_gen.mappings['.cxx']
216
217     features = [Options.options.port.lower()]
218     exclude_patterns = ['*AllInOne.cpp', '*CFNet.cpp', '*Chromium*.cpp', 
219             '*Efl.cpp', '*Gtk.cpp', '*Mac.cpp', '*None.cpp', '*Qt.cpp', '*Safari.cpp',
220             'test*bindings.*', '*WinCE.cpp', "WebDOMCanvas*.cpp", "WebDOMSVG*.cpp"]
221     if Options.options.port == 'wx':
222         features.append('curl')
223         exclude_patterns.append('*Win.cpp')
224         
225     if sys.platform.startswith('darwin'):
226         features.append('cf')
227         
228     else:
229         exclude_patterns.append('*CF.cpp')
230
231     full_dirs = get_dirs_for_features(wk_root, features=features, dirs=webcore_dirs)
232
233     jscore_dir = os.path.join(wk_root, 'Source', 'JavaScriptCore')
234     for item in os.listdir(jscore_dir):
235         fullpath = os.path.join(jscore_dir, item)
236         if os.path.isdir(fullpath) and not item == "os-win32" and not item == 'icu':
237             wk_includes.append(fullpath)
238
239     wk_includes.append('Source')
240     wk_includes.append(os.path.join(jscore_dir, 'collector', 'handles'))
241     wk_includes.append(os.path.join(jscore_dir, 'wtf', 'unicode'))
242     wk_includes.append(os.path.join(jscore_dir, 'wtf', 'unicode', 'icu'))
243     wk_includes += common_includes + full_dirs
244     if sys.platform.startswith('darwin'):
245         wk_includes.append(os.path.join(webcore_dir, 'icu'))
246
247     cxxflags = []
248     if building_on_win32:
249         cxxflags.append('/FIWebCorePrefix.h')
250         # FIXME: We do this because in waf, local include dirs take precedence
251         # over global ones. This makes sense, but because unicode/utf8.h is both
252         # an ICU header name and a WebKit header name (in Source/JavaScriptCore/wtf)
253         # we have to make sure <unicode/utf8.h> picks up the ICU one first.
254         global msvclibs_dir
255         wk_includes.append(os.path.join(msvclibs_dir, 'include'))
256     else:
257         cxxflags.extend(['-include', 'WebCorePrefix.h'])
258
259     webcore = bld.new_task_gen(
260         features = 'cc cxx cshlib',
261         includes = ' '.join(wk_includes),
262         source = ' '.join(flattenSources(webcore_sources.values())),
263         cxxflags = cxxflags,
264         defines = ['WXMAKINGDLL_WEBKIT', 'BUILDING_WebCore'],
265         libpath = [output_dir],
266         target = 'wxwebkit',
267         uselib = 'WX ICU XML XSLT CURL SQLITE3 WKINTERFACE ' + get_config(),
268         uselib_local = 'jscore',
269         install_path = output_dir,
270         )
271         
272     excludes = []
273     
274     if Options.options.port == 'wx':
275         excludes = get_excludes(webcore_dir, exclude_patterns)
276         excludes.extend(['UserStyleSheetLoader.cpp', 'RenderMediaControls.cpp'])
277
278         # intermediate sources
279         excludes.append('DocTypeStrings.cpp')
280         excludes.append('HTMLEntityNames.cpp')
281         excludes.append('tokenizer.cpp')
282
283         # Qt specific file in common sources
284         excludes.append('ContextShadow.cpp')
285
286         # FIXME: these three require headers that I can't seem to find in trunk.
287         # Investigate how to resolve these issues.
288         excludes.append('JSAbstractView.cpp')
289         excludes.append('JSPositionCallback.cpp')
290         excludes.append('JSInspectorController.cpp')
291         
292         # The bindings generator seems to think these are ref-counted, while they aren't in trunk.
293         excludes.append('JSElementTimeControl.cpp')
294         excludes.append('JSSVGAnimatedPathData.cpp')
295         excludes.append('JSSVGAnimatedPoints.cpp')
296         excludes.append('JSSVGExternalResourcesRequired.cpp')
297         excludes.append('JSSVGFilterPrimitiveStandardAttributes.cpp')
298         excludes.append('JSSVGLocatable.cpp')
299         excludes.append('JSSVGStyleTable.cpp')
300         excludes.append('JSSVGTests.cpp')
301         excludes.append('JSSVGStylable.cpp')
302         excludes.append('JSSVGZoomAndPan.cpp')
303         
304         # These are files that expect methods not in the base C++ class, usually XYZAnimated methods.
305         excludes.append('JSSVGFitToViewBox.cpp')
306         excludes.append('JSSVGLangSpace.cpp')
307         excludes.append('JSSVGTransformable.cpp')
308         excludes.append('JSSVGURIReference.cpp')
309         
310         # These are C++ DOM Bindings that won't compile because they look for things not in trunk.
311         excludes.append('WebDOMEventTarget.cpp')
312         excludes.append('WebDOMAbstractView.cpp')
313         excludes.append('WebDOMBlobBuilder.cpp')
314         excludes.append('WebDOMEventListenerCustom.cpp')
315         excludes.append('WebDOMElementTimeControl.cpp')
316         excludes.append('WebDOMImageData.cpp')
317         excludes.append('WebDOMInspectorBackend.cpp')
318         excludes.append('WebDOMScriptProfile.cpp')
319         excludes.append('WebDOMScriptProfileNode.cpp')
320         excludes.append('WebNativeEventListener.cpp')
321         
322         # FIXME: It appears these are no longer needed by any port, once this is confirmed,
323         # we should remove these sources from the tree.
324         excludes.append('WebDOMDOMWindowCustom.cpp')
325         excludes.append('WebDOMHTMLOptionsCollectionCustom.cpp')
326         excludes.append('WebDOMNodeCustom.cpp')
327         excludes.append('WebDOMHTMLDocumentCustom.cpp')
328         excludes.append('WebDOMHTMLCollectionCustom.cpp')
329         
330         # this file is unused by any port, not sure why it was
331         # left in the tree
332         excludes.append('GeneratedImage.cpp')
333         
334         # features we don't build / use
335         excludes.append('JSNavigatorCustom.cpp')
336         excludes.append('WebGLContextEvent.cpp')
337         excludes.append('FileSystemPOSIX.cpp')
338         excludes.append('SharedBufferPOSIX.cpp')
339         
340         
341         # These files appear not to build with older versions of ICU
342         excludes.append('LocalizedNumberICU.cpp')
343         excludes.append('LocaleToScriptMappingICU.cpp')
344         
345         if building_on_win32:
346             excludes.append('SharedTimerWx.cpp')
347             excludes.append('RenderThemeWin.cpp')
348             excludes.append('KeyEventWin.cpp')
349             
350         if building_on_win32 or sys.platform.startswith('darwin'):
351             excludes.append('GlyphMapWx.cpp')
352         excludes.append('AuthenticationCF.cpp')
353         excludes.append('LoaderRunLoopCF.cpp')
354         excludes.append('ResourceErrorCF.cpp')
355         
356         # once we move over to the new FPD implementation, remove this.
357         excludes.append('FontPlatformData.cpp')
358         
359         # we don't use gestures currently
360         excludes.append('PlatformGestureRecognizer.cpp')
361         
362         # we need a better system to exclude CF stuff
363         excludes.append('HyphenationCF.cpp')
364         
365         if sys.platform.startswith('darwin'):
366             webcore.includes += ' Source/WebKit/mac/WebCoreSupport Source/WebCore/platform/mac'
367             webcore.source += ' Source/WebKit/mac/WebCoreSupport/WebSystemInterface.mm'
368             
369         if building_on_win32:
370             for wxlib in bld.env['LIB_WX']:
371                 wx_version = wxpresets.get_wx_version(os.environ['WXWIN'])
372                 if int(wx_version[1]) % 2 == 1:
373                     wxlib = wxlib.replace(''.join(wx_version[:2]), ''.join(wx_version))
374                 wxlibname = os.path.join(bld.env['LIBPATH_WX'][0], wxlib + '_vc.dll')
375                 print "Copying %s" % wxlibname
376                 if os.path.exists(wxlibname):
377                     bld.install_files(webcore.install_path, [wxlibname])
378         
379             for dep in windows_deps:
380                 bld.install_files(webcore.install_path, [os.path.join(msvclibs_dir, dep)])
381             
382             if "CAIRO_ROOT" in os.environ and Options.options.cairo:
383                 cairo_bin_dir = os.path.join(os.environ["CAIRO_ROOT"], "bin") 
384                 for dep in glob.glob(os.path.join(cairo_bin_dir, "*.dll")):
385                     bld.install_files(webcore.install_path, [os.path.join(cairo_bin_dir, dep)])
386                     
387     webcore.find_sources_in_dirs(full_dirs, excludes = excludes, exts=['.c', '.cpp'])
388
389     bld.add_group()
390     
391     if Options.options.port == "wx":    
392         bld.add_subdirs(['Tools/DumpRenderTree', 'Tools/wx/browser', 'Source/WebKit/wx/bindings/python'])