e2231af5c40fe12ee71192b59925b8132978e9fd
[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             if Options.options.cairo:
174                 webcore_dirs.append('Source/WebCore/platform/wx/wxcode/cairo')
175             else:
176                 webcore_dirs.append('Source/WebCore/platform/wx/wxcode/gdiplus')
177         elif sys.platform.startswith('darwin'):
178             webcore_dirs.append('Source/WebCore/plugins/mac')
179             webcore_dirs.append('Source/WebCore/platform/wx/wxcode/mac/carbon')
180             webcore_dirs.append('Source/WebCore/platform/text/mac')
181             webcore_sources['wx-mac'] = [
182                    'Source/WebCore/platform/mac/PurgeableBufferMac.cpp',
183                    'Source/WebCore/platform/mac/WebCoreNSStringExtras.mm',
184                    'Source/WebCore/platform/mac/WebCoreSystemInterface.mm',
185                    'Source/WebCore/platform/graphics/cg/FloatSizeCG.cpp',
186                    'Source/WebCore/platform/graphics/mac/ComplexTextController.cpp',
187                    'Source/WebCore/platform/graphics/mac/ComplexTextControllerCoreText.mm',
188                    'Source/WebCore/platform/graphics/mac/ComplexTextControllerATSUI.cpp',
189                    'Source/WebCore/platform/graphics/mac/GlyphPageTreeNodeMac.cpp',
190                    'Source/WebCore/platform/graphics/mac/SimpleFontDataATSUI.mm',
191                    'Source/WebCore/platform/graphics/mac/SimpleFontDataCoreText.cpp',
192                    'Source/WebCore/platform/graphics/wx/FontPlatformDataWxMac.mm',
193                    'Source/WebCore/platform/wx/wxcode/mac/carbon/fontprops.mm',
194                    'Source/WebCore/plugins/mac/PluginPackageMac.cpp',
195                    'Source/WebCore/plugins/mac/PluginViewMac.mm'
196             ]
197         else:
198             webcore_sources['wx-gtk'] = [
199                    'Source/WebCore/plugins/PluginViewNone.cpp',
200                    'Source/WebCore/plugins/PluginPackageNone.cpp'
201             ]
202             webcore_dirs.append('Source/WebCore/platform/wx/wxcode/gtk')
203             webcore_dirs.append('Source/WebCore/platform/wx/wxcode/cairo')
204         
205
206     import TaskGen
207
208     # FIXME: Does this need to be Source/JavaScriptCore?
209     bld.add_subdirs('Source/JavaScriptCore')
210
211     if sys.platform.startswith('darwin'):
212         TaskGen.task_gen.mappings['.mm'] = TaskGen.task_gen.mappings['.cxx']
213         TaskGen.task_gen.mappings['.m'] = TaskGen.task_gen.mappings['.cxx']
214
215     features = [Options.options.port.lower()]
216     exclude_patterns = ['*AllInOne.cpp', '*CFNet.cpp', '*Chromium*.cpp', 
217             '*Efl.cpp', '*Gtk.cpp', '*Mac.cpp', '*None.cpp', '*Qt.cpp', '*Safari.cpp',
218             'test*bindings.*', '*WinCE.cpp', "WebDOMCanvas*.cpp", "WebDOMSVG*.cpp"]
219     if Options.options.port == 'wx':
220         features.append('curl')
221         exclude_patterns.append('*Win.cpp')
222         
223     if sys.platform.startswith('darwin'):
224         features.append('cf')
225         
226     else:
227         exclude_patterns.append('*CF.cpp')
228
229     full_dirs = get_dirs_for_features(wk_root, features=features, dirs=webcore_dirs)
230
231     jscore_dir = os.path.join(wk_root, 'Source', 'JavaScriptCore')
232     for item in os.listdir(jscore_dir):
233         fullpath = os.path.join(jscore_dir, item)
234         if os.path.isdir(fullpath) and not item == "os-win32" and not item == 'icu':
235             wk_includes.append(fullpath)
236
237     wk_includes.append('Source')
238     wk_includes.append(os.path.join(jscore_dir, 'collector', 'handles'))
239     wk_includes.append(os.path.join(jscore_dir, 'wtf', 'unicode'))
240     wk_includes.append(os.path.join(jscore_dir, 'wtf', 'unicode', 'icu'))
241     wk_includes += common_includes + full_dirs
242     if sys.platform.startswith('darwin'):
243         wk_includes.append(os.path.join(webcore_dir, 'icu'))
244
245     cxxflags = []
246     if building_on_win32:
247         cxxflags.append('/FIWebCorePrefix.h')
248         # FIXME: We do this because in waf, local include dirs take precedence
249         # over global ones. This makes sense, but because unicode/utf8.h is both
250         # an ICU header name and a WebKit header name (in Source/JavaScriptCore/wtf)
251         # we have to make sure <unicode/utf8.h> picks up the ICU one first.
252         global msvclibs_dir
253         wk_includes.append(os.path.join(msvclibs_dir, 'include'))
254     else:
255         cxxflags.extend(['-include', 'WebCorePrefix.h'])
256
257     webcore = bld.new_task_gen(
258         features = 'cc cxx cshlib',
259         includes = ' '.join(wk_includes),
260         source = ' '.join(flattenSources(webcore_sources.values())),
261         cxxflags = cxxflags,
262         defines = ['WXMAKINGDLL_WEBKIT', 'BUILDING_WebCore'],
263         libpath = [output_dir],
264         target = 'wxwebkit',
265         uselib = 'WX ICU XML XSLT CURL SQLITE3 WKINTERFACE ' + get_config(),
266         uselib_local = 'jscore',
267         install_path = output_dir,
268         )
269         
270     excludes = []
271     
272     if Options.options.port == 'wx':
273         excludes = get_excludes(webcore_dir, exclude_patterns)
274         excludes.extend(['UserStyleSheetLoader.cpp', 'RenderMediaControls.cpp'])
275
276         # intermediate sources
277         excludes.append('DocTypeStrings.cpp')
278         excludes.append('HTMLEntityNames.cpp')
279         excludes.append('tokenizer.cpp')
280
281         # Qt specific file in common sources
282         excludes.append('ContextShadow.cpp')
283
284         # FIXME: these three require headers that I can't seem to find in trunk.
285         # Investigate how to resolve these issues.
286         excludes.append('JSAbstractView.cpp')
287         excludes.append('JSPositionCallback.cpp')
288         excludes.append('JSInspectorController.cpp')
289         
290         # The bindings generator seems to think these are ref-counted, while they aren't in trunk.
291         excludes.append('JSElementTimeControl.cpp')
292         excludes.append('JSSVGAnimatedPathData.cpp')
293         excludes.append('JSSVGAnimatedPoints.cpp')
294         excludes.append('JSSVGExternalResourcesRequired.cpp')
295         excludes.append('JSSVGFilterPrimitiveStandardAttributes.cpp')
296         excludes.append('JSSVGLocatable.cpp')
297         excludes.append('JSSVGStyleTable.cpp')
298         excludes.append('JSSVGTests.cpp')
299         excludes.append('JSSVGStylable.cpp')
300         excludes.append('JSSVGZoomAndPan.cpp')
301         
302         # These are files that expect methods not in the base C++ class, usually XYZAnimated methods.
303         excludes.append('JSSVGFitToViewBox.cpp')
304         excludes.append('JSSVGLangSpace.cpp')
305         excludes.append('JSSVGTransformable.cpp')
306         excludes.append('JSSVGURIReference.cpp')
307         
308         # These are C++ DOM Bindings that won't compile because they look for things not in trunk.
309         excludes.append('WebDOMEventTarget.cpp')
310         excludes.append('WebDOMAbstractView.cpp')
311         excludes.append('WebDOMBlobBuilder.cpp')
312         excludes.append('WebDOMEventListenerCustom.cpp')
313         excludes.append('WebDOMElementTimeControl.cpp')
314         excludes.append('WebDOMImageData.cpp')
315         excludes.append('WebDOMInspectorBackend.cpp')
316         excludes.append('WebDOMScriptProfile.cpp')
317         excludes.append('WebDOMScriptProfileNode.cpp')
318         excludes.append('WebNativeEventListener.cpp')
319         
320         # this file is unused by any port, not sure why it was
321         # left in the tree
322         excludes.append('GeneratedImage.cpp')
323         
324         # features we don't build / use
325         excludes.append('JSNavigatorCustom.cpp')
326         excludes.append('WebGLContextEvent.cpp')
327         excludes.append('FileSystemPOSIX.cpp')
328         excludes.append('SharedBufferPOSIX.cpp')
329         
330         
331         # These files appear not to build with older versions of ICU
332         excludes.append('LocalizedNumberICU.cpp')
333         excludes.append('LocaleToScriptMappingICU.cpp')
334         
335         if building_on_win32:
336             excludes.append('SharedTimerWx.cpp')
337             excludes.append('RenderThemeWin.cpp')
338             excludes.append('KeyEventWin.cpp')
339             
340         if building_on_win32 or sys.platform.startswith('darwin'):
341             excludes.append('GlyphMapWx.cpp')
342         excludes.append('AuthenticationCF.cpp')
343         excludes.append('LoaderRunLoopCF.cpp')
344         excludes.append('ResourceErrorCF.cpp')
345         
346         # once we move over to the new FPD implementation, remove this.
347         excludes.append('FontPlatformData.cpp')
348         
349         # we don't use gestures currently
350         excludes.append('PlatformGestureRecognizer.cpp')
351         
352         # we need a better system to exclude CF stuff
353         excludes.append('HyphenationCF.cpp')
354         
355         if sys.platform.startswith('darwin'):
356             webcore.includes += ' Source/WebKit/mac/WebCoreSupport Source/WebCore/platform/mac'
357             webcore.source += ' Source/WebKit/mac/WebCoreSupport/WebSystemInterface.mm'
358             
359         if building_on_win32:
360             for wxlib in bld.env['LIB_WX']:
361                 wx_version = wxpresets.get_wx_version(os.environ['WXWIN'])
362                 if int(wx_version[1]) % 2 == 1:
363                     wxlib = wxlib.replace(''.join(wx_version[:2]), ''.join(wx_version))
364                 wxlibname = os.path.join(bld.env['LIBPATH_WX'][0], wxlib + '_vc.dll')
365                 print "Copying %s" % wxlibname
366                 if os.path.exists(wxlibname):
367                     bld.install_files(webcore.install_path, [wxlibname])
368         
369             for dep in windows_deps:
370                 bld.install_files(webcore.install_path, [os.path.join(msvclibs_dir, dep)])
371             
372             if "CAIRO_ROOT" in os.environ and Options.options.cairo:
373                 cairo_bin_dir = os.path.join(os.environ["CAIRO_ROOT"], "bin") 
374                 for dep in glob.glob(os.path.join(cairo_bin_dir, "*.dll")):
375                     bld.install_files(webcore.install_path, [os.path.join(cairo_bin_dir, dep)])
376                     
377     webcore.find_sources_in_dirs(full_dirs, excludes = excludes, exts=['.c', '.cpp'])
378
379     bld.add_group()
380     
381     if Options.options.port == "wx":    
382         bld.add_subdirs(['Tools/DumpRenderTree', 'Tools/wx/browser', 'Source/WebKit/wx/bindings/python'])