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