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
28import Options
29
30from settings import *
31import wxpresets
32
33import TaskGen
34from TaskGen import taskgen, feature, after
35import Task, ccroot
36
37def 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
58def 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
80def set_options(opt):
81    common_set_options(opt)
82
83def 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
110def 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/LocalizedNumberNone.cpp'
150        ]
151
152        if building_on_win32:
153            # make sure platform/wx comes after this so we get the right
154            # FontPlatformData.h
155            webcore_dirs.extend(['Source/WebCore/platform/wx/wxcode/win', 'Source/WebCore/plugins/win'])
156            webcore_sources['wx-win'] = [
157                   'Source/WebCore/platform/graphics/win/GlyphPageTreeNodeCairoWin.cpp',
158                   'Source/WebCore/platform/graphics/win/TransformationMatrixWin.cpp',
159                   'Source/WebCore/platform/ScrollAnimatorWin.cpp',
160                   # wxTimer on Windows has a bug that causes it to eat crashes in callbacks
161                   # so we need to use the Win port's implementation until the wx bug fix is
162                   # widely available (it was fixed in 2.8.10).
163                   'Source/WebCore/platform/win/SharedTimerWin.cpp',
164                   'Source/WebCore/platform/win/WebCoreInstanceHandle.cpp',
165                   # Use the Windows plugin architecture
166                   #'Source/WebCore/plugins/win/PluginDataWin.cpp',
167                   'Source/WebCore/plugins/win/PluginDatabaseWin.cpp',
168                   'Source/WebCore/plugins/win/PluginMessageThrottlerWin.cpp',
169                   'Source/WebCore/plugins/win/PluginPackageWin.cpp',
170                   'Source/WebCore/plugins/win/PluginViewWin.cpp',
171            ]
172        elif sys.platform.startswith('darwin'):
173            webcore_dirs.append('Source/WebCore/plugins/mac')
174            webcore_dirs.append('Source/WebCore/platform/wx/wxcode/mac/carbon')
175            webcore_dirs.append('Source/WebCore/platform/mac')
176            webcore_dirs.append('Source/WebCore/platform/text/mac')
177            webcore_sources['wx-mac'] = [
178                   'Source/WebCore/platform/mac/PurgeableBufferMac.cpp',
179                   'Source/WebCore/platform/mac/WebCoreNSStringExtras.mm',
180                   'Source/WebCore/platform/mac/WebCoreSystemInterface.mm',
181                   'Source/WebCore/platform/graphics/cg/FloatSizeCG.cpp',
182                   'Source/WebCore/platform/graphics/mac/ComplexTextController.cpp',
183                   'Source/WebCore/platform/graphics/mac/ComplexTextControllerCoreText.cpp',
184                   'Source/WebCore/platform/graphics/mac/ComplexTextControllerATSUI.cpp',
185                   'Source/WebCore/platform/graphics/mac/GlyphPageTreeNodeMac.cpp',
186                   'Source/WebCore/platform/graphics/mac/SimpleFontDataATSUI.mm',
187                   'Source/WebCore/platform/graphics/mac/SimpleFontDataCoreText.cpp',
188                   'Source/WebCore/platform/graphics/wx/FontPlatformDataWxMac.mm',
189                   'Source/WebCore/platform/text/mac/ShapeArabic.c',
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'])
356