NRWT doesn't store the svn revision in full_results.json on chromium-win
[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.chdir(olddir)
57
58 def generate_jscore_derived_sources(conf):
59     # build the derived sources
60     js_dir = jscore_dir
61     if building_on_win32:
62         js_dir = get_output('cygpath --unix "%s"' % js_dir)
63     derived_sources_dir = os.path.join(jscore_dir, 'DerivedSources')
64     if not os.path.exists(derived_sources_dir):
65         os.mkdir(derived_sources_dir)
66
67     olddir = os.getcwd()
68     os.chdir(derived_sources_dir)
69
70     # DerivedSources.make expects Cygwin (i.e. Unix-style) python, so use that instead.
71     if building_on_win32:
72         oldpath = os.environ["PATH"]
73         os.environ["PATH"] = "/usr/bin" + os.pathsep + os.environ["PATH"]
74     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"])
75     os.system(command)
76     if building_on_win32:
77         os.environ["PATH"] = oldpath
78     os.chdir(olddir)
79
80 def set_options(opt):
81     common_set_options(opt)
82
83 def configure(conf):
84     common_configure(conf)
85     generate_jscore_derived_sources(conf)
86     generate_webcore_derived_sources(conf)
87     if Options.options.port == "wx" and sys.platform.startswith('win'):
88         graphics_dir = os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'graphics')
89         # HACK ALERT: MSVC automatically adds the source file's directory as the first entry in the
90         # path. Unfortunately, that means when compiling these files we will end up including
91         # win/FontPlatformData.h, which breaks wx compilation. So we copy the files to the wx dir.
92         for afile in ['UniscribeController.h', 'UniscribeController.cpp', 'GlyphPageTreeNodeCairoWin.cpp']:
93             shutil.copy(os.path.join(graphics_dir, 'win', afile), os.path.join(graphics_dir, 'wx'))
94
95     webcore_out_dir = os.path.join(output_dir, 'WebCore')
96     if not os.path.exists(webcore_out_dir):
97         os.makedirs(webcore_out_dir)
98     shutil.copy('Source/WebCore/platform/mac/WebCoreSystemInterface.h', os.path.join(output_dir, 'WebCore', 'WebCoreSystemInterface.h'))
99     jscore_out_dir = os.path.join(output_dir, 'JavaScriptCore')
100     if not os.path.exists(jscore_out_dir):
101         os.makedirs(jscore_out_dir)
102     for api_file in glob.glob(os.path.join(jscore_dir, 'API/*.h')):
103         shutil.copy(api_file, os.path.join(jscore_out_dir, os.path.basename(api_file)))
104
105     if Options.options.port == "wx" and Options.options.wxpython:
106         common_configure(conf)
107         conf.check_tool('swig', tooldir='Source/WebKit/wx/bindings/python')
108         conf.check_swig_version('1.3.29')
109
110 def build(bld):
111
112     webcore_dirs = list(webcore_dirs_common)
113
114     if Options.options.port == "wx":
115         webcore_dirs.extend(['Source/WebKit/wx', 'Source/WebKit/wx/WebKitSupport'])
116     
117     wk_includes = ['.',
118                     os.path.join(wk_root, 'Source', 'JavaScriptCore'),
119                     os.path.join(wk_root, 'Source', 'JavaScriptCore', 'wtf', 'text'),
120                     os.path.join(wk_root, 'Source', 'WebCore'),
121                     os.path.join(wk_root, 'Source', 'WebCore', 'DerivedSources'),
122                     os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'image-decoders'),
123                     os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'win'),
124                     os.path.join(wk_root, 'Source', 'WebCore', 'workers'),
125                     os.path.join(output_dir),
126             ]
127     
128     if Options.options.port == "wx":
129         wk_includes.append(os.path.join(wk_root, 'Source', 'WebKit', 'wx'))
130         wk_includes.append(os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'wx', 'wxcode'))
131     
132     if sys.platform.startswith("win"):
133         wk_includes.append(os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'win'))
134         wk_includes.append(os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'graphics', 'win'))
135     
136     windows_deps = [
137                     'lib/pthreadVC2.dll',
138                     'bin/icuuc40.dll', 'bin/icudt40.dll', 'bin/icuin40.dll',
139                     'bin/libcurl.dll', 'bin/libeay32.dll', 'bin/ssleay32.dll', 'bin/zlib1.dll',
140                     'lib/sqlite3.dll', 'bin/libxml2.dll', 'bin/libxslt.dll', 'bin/iconv.dll',
141                     ]
142     
143     webcore_sources = {}
144     
145     if Options.options.port == "wx":
146         webcore_sources['wx'] = [
147             'Source/WebCore/bindings/cpp/WebDOMEventTarget.cpp',
148             'Source/WebCore/platform/KillRingNone.cpp',
149             'Source/WebCore/platform/text/LocalizedDateNone.cpp',
150             'Source/WebCore/platform/text/LocalizedNumberNone.cpp'
151         ]  
152     
153         if building_on_win32:
154             # make sure platform/wx comes after this so we get the right
155             # FontPlatformData.h
156             webcore_dirs.extend(['Source/WebCore/platform/wx/wxcode/win', 'Source/WebCore/plugins/win'])
157             webcore_sources['wx-win'] = [
158                    'Source/WebCore/platform/graphics/win/GlyphPageTreeNodeCairoWin.cpp',
159                    'Source/WebCore/platform/graphics/win/TransformationMatrixWin.cpp',
160                    'Source/WebCore/platform/ScrollAnimatorWin.cpp',
161                    # wxTimer on Windows has a bug that causes it to eat crashes in callbacks
162                    # so we need to use the Win port's implementation until the wx bug fix is
163                    # widely available (it was fixed in 2.8.10).
164                    'Source/WebCore/platform/win/SharedTimerWin.cpp',
165                    'Source/WebCore/platform/win/WebCoreInstanceHandle.cpp',
166                    # Use the Windows plugin architecture
167                    #'Source/WebCore/plugins/win/PluginDataWin.cpp',
168                    'Source/WebCore/plugins/win/PluginDatabaseWin.cpp',
169                    'Source/WebCore/plugins/win/PluginMessageThrottlerWin.cpp',
170                    'Source/WebCore/plugins/win/PluginPackageWin.cpp',
171                    'Source/WebCore/plugins/win/PluginViewWin.cpp',
172             ]
173         elif sys.platform.startswith('darwin'):
174             webcore_dirs.append('Source/WebCore/plugins/mac')
175             webcore_dirs.append('Source/WebCore/platform/wx/wxcode/mac/carbon')
176             webcore_dirs.append('Source/WebCore/platform/mac')
177             webcore_dirs.append('Source/WebCore/platform/text/mac')
178             webcore_sources['wx-mac'] = [
179                    'Source/WebCore/platform/mac/PurgeableBufferMac.cpp',
180                    'Source/WebCore/platform/mac/WebCoreNSStringExtras.mm',
181                    'Source/WebCore/platform/mac/WebCoreSystemInterface.mm',
182                    'Source/WebCore/platform/graphics/cg/FloatSizeCG.cpp',
183                    'Source/WebCore/platform/graphics/mac/ComplexTextController.cpp',
184                    'Source/WebCore/platform/graphics/mac/ComplexTextControllerCoreText.cpp',
185                    'Source/WebCore/platform/graphics/mac/ComplexTextControllerATSUI.cpp',
186                    'Source/WebCore/platform/graphics/mac/GlyphPageTreeNodeMac.cpp',
187                    'Source/WebCore/platform/graphics/mac/SimpleFontDataATSUI.mm',
188                    'Source/WebCore/platform/graphics/mac/SimpleFontDataCoreText.cpp',
189                    'Source/WebCore/platform/graphics/wx/FontPlatformDataWxMac.mm',
190                    'Source/WebCore/platform/wx/wxcode/mac/carbon/fontprops.mm',
191                    'Source/WebCore/plugins/mac/PluginPackageMac.cpp',
192                    'Source/WebCore/plugins/mac/PluginViewMac.mm'
193             ]
194         else:
195             webcore_sources['wx-gtk'] = [
196                    'Source/WebCore/plugins/PluginViewNone.cpp',
197                    'Source/WebCore/plugins/PluginPackageNone.cpp'
198             ]
199             webcore_dirs.append('Source/WebCore/platform/wx/wxcode/gtk')
200         
201
202     import TaskGen
203
204     # FIXME: Does this need to be Source/JavaScriptCore?
205     bld.add_subdirs('Source/JavaScriptCore')
206
207     if sys.platform.startswith('darwin'):
208         TaskGen.task_gen.mappings['.mm'] = TaskGen.task_gen.mappings['.cxx']
209         TaskGen.task_gen.mappings['.m'] = TaskGen.task_gen.mappings['.cxx']
210
211     features = [Options.options.port.lower()]
212     exclude_patterns = ['*AllInOne.cpp', '*Brew.cpp', '*CFNet.cpp', '*Chromium*.cpp', 
213             '*Efl.cpp', '*Gtk.cpp', '*Haiku.cpp', '*Mac.cpp', '*None.cpp', '*Qt.cpp', '*Safari.cpp',
214             'test*bindings.*', '*WinCE.cpp', "WebDOMCanvas*.cpp", "WebDOMSVG*.cpp"]
215     if Options.options.port == 'wx':
216         features.append('curl')
217         exclude_patterns.append('*Win.cpp')
218         
219     if sys.platform.startswith('darwin'):
220         features.append('cf')
221         
222     else:
223         exclude_patterns.append('*CF.cpp')
224
225     full_dirs = get_dirs_for_features(wk_root, features=features, dirs=webcore_dirs)
226
227     jscore_dir = os.path.join(wk_root, 'Source', 'JavaScriptCore')
228     for item in os.listdir(jscore_dir):
229         fullpath = os.path.join(jscore_dir, item)
230         if os.path.isdir(fullpath) and not item == "os-win32" and not item == 'icu':
231             wk_includes.append(fullpath)
232
233     wk_includes.append('Source')
234     wk_includes.append(os.path.join(jscore_dir, 'collector', 'handles'))
235     wk_includes.append(os.path.join(jscore_dir, 'wtf', 'unicode'))
236     wk_includes.append(os.path.join(jscore_dir, 'wtf', 'unicode', 'icu'))
237     wk_includes += common_includes + full_dirs
238     if sys.platform.startswith('darwin'):
239         wk_includes.append(os.path.join(webcore_dir, 'icu'))
240
241     cxxflags = []
242     if building_on_win32:
243         cxxflags.append('/FIWebCorePrefix.h')
244         # FIXME: We do this because in waf, local include dirs take precedence
245         # over global ones. This makes sense, but because unicode/utf8.h is both
246         # an ICU header name and a WebKit header name (in Source/JavaScriptCore/wtf)
247         # we have to make sure <unicode/utf8.h> picks up the ICU one first.
248         global msvclibs_dir
249         wk_includes.append(os.path.join(msvclibs_dir, 'include'))
250     else:
251         cxxflags.extend(['-include', 'WebCorePrefix.h'])
252
253     webcore = bld.new_task_gen(
254         features = 'cc cxx cshlib',
255         includes = ' '.join(wk_includes),
256         source = ' '.join(flattenSources(webcore_sources.values())),
257         cxxflags = cxxflags,
258         defines = ['WXMAKINGDLL_WEBKIT', 'BUILDING_WebCore'],
259         libpath = [output_dir],
260         target = 'wxwebkit',
261         uselib = 'WX ICU XML XSLT CURL SQLITE3 WKINTERFACE ' + get_config(),
262         uselib_local = 'jscore',
263         install_path = output_dir,
264         )
265         
266     excludes = []
267     
268     if Options.options.port == 'wx':
269         excludes = get_excludes(webcore_dir, exclude_patterns)
270         excludes.extend(['UserStyleSheetLoader.cpp', 'RenderMediaControls.cpp'])
271
272         # intermediate sources
273         excludes.append('DocTypeStrings.cpp')
274         excludes.append('HTMLEntityNames.cpp')
275         excludes.append('tokenizer.cpp')
276
277         # Qt specific file in common sources
278         excludes.append('ContextShadow.cpp')
279
280         # FIXME: these three require headers that I can't seem to find in trunk.
281         # Investigate how to resolve these issues.
282         excludes.append('JSAbstractView.cpp')
283         excludes.append('JSPositionCallback.cpp')
284         excludes.append('JSInspectorController.cpp')
285         
286         # The bindings generator seems to think these are ref-counted, while they aren't in trunk.
287         excludes.append('JSElementTimeControl.cpp')
288         excludes.append('JSSVGAnimatedPathData.cpp')
289         excludes.append('JSSVGAnimatedPoints.cpp')
290         excludes.append('JSSVGExternalResourcesRequired.cpp')
291         excludes.append('JSSVGFilterPrimitiveStandardAttributes.cpp')
292         excludes.append('JSSVGLocatable.cpp')
293         excludes.append('JSSVGStyleTable.cpp')
294         excludes.append('JSSVGTests.cpp')
295         excludes.append('JSSVGStylable.cpp')
296         excludes.append('JSSVGZoomAndPan.cpp')
297         
298         # These are files that expect methods not in the base C++ class, usually XYZAnimated methods.
299         excludes.append('JSSVGFitToViewBox.cpp')
300         excludes.append('JSSVGLangSpace.cpp')
301         excludes.append('JSSVGTransformable.cpp')
302         excludes.append('JSSVGURIReference.cpp')
303         
304         # These are C++ DOM Bindings that won't compile because they look for things not in trunk.
305         excludes.append('WebDOMEventTarget.cpp')
306         excludes.append('WebDOMAbstractView.cpp')
307         excludes.append('WebDOMBlobBuilder.cpp')
308         excludes.append('WebDOMEventListenerCustom.cpp')
309         excludes.append('WebDOMElementTimeControl.cpp')
310         excludes.append('WebDOMImageData.cpp')
311         excludes.append('WebDOMInspectorBackend.cpp')
312         excludes.append('WebDOMScriptProfile.cpp')
313         excludes.append('WebDOMScriptProfileNode.cpp')
314         excludes.append('WebNativeEventListener.cpp')
315         
316         # This file appears not to build with older versions of ICU
317         excludes.append('LocalizedNumberICU.cpp')
318         
319         if building_on_win32:
320             excludes.append('SharedTimerWx.cpp')
321             excludes.append('RenderThemeWin.cpp')
322             excludes.append('KeyEventWin.cpp')
323             
324         if building_on_win32 or sys.platform.startswith('darwin'):
325             excludes.append('GlyphMapWx.cpp')
326         excludes.append('AuthenticationCF.cpp')
327         excludes.append('LoaderRunLoopCF.cpp')
328         excludes.append('ResourceErrorCF.cpp')
329         
330         # once we move over to the new FPD implementation, remove this.
331         excludes.append('FontPlatformData.cpp')
332         
333         if sys.platform.startswith('darwin'):
334             webcore.includes += ' Source/WebKit/mac/WebCoreSupport WebCore/platform/mac'
335             webcore.source += ' Source/WebKit/mac/WebCoreSupport/WebSystemInterface.mm'
336             
337         if building_on_win32:
338             for wxlib in bld.env['LIB_WX']:
339                 wx_version = wxpresets.get_wx_version(os.environ['WXWIN'])
340                 if int(wx_version[1]) % 2 == 1:
341                     wxlib = wxlib.replace(''.join(wx_version[:2]), ''.join(wx_version))
342                 wxlibname = os.path.join(bld.env['LIBPATH_WX'][0], wxlib + '_vc.dll')
343                 print "Copying %s" % wxlibname
344                 if os.path.exists(wxlibname):
345                     bld.install_files(webcore.install_path, [wxlibname])
346         
347             for dep in windows_deps:
348                 bld.install_files(webcore.install_path, [os.path.join(msvclibs_dir, dep)])
349
350     webcore.find_sources_in_dirs(full_dirs, excludes = excludes, exts=['.c', '.cpp'])
351
352     bld.add_group()
353     
354     if Options.options.port == "wx":    
355         bld.add_subdirs(['Tools/DumpRenderTree', 'Tools/wx/browser', 'Source/WebKit/wx/bindings/python'])