Clang/Mac build fix after r108119
[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
282         # Qt specific file in common sources
283         excludes.append('ContextShadow.cpp')
284
285         # FIXME: these three require headers that I can't seem to find in trunk.
286         # Investigate how to resolve these issues.
287         excludes.append('JSAbstractView.cpp')
288         excludes.append('JSPositionCallback.cpp')
289         excludes.append('JSInspectorController.cpp')
290         
291         # The bindings generator seems to think these are ref-counted, while they aren't in trunk.
292         excludes.append('JSElementTimeControl.cpp')
293         excludes.append('JSSVGAnimatedPathData.cpp')
294         excludes.append('JSSVGAnimatedPoints.cpp')
295         excludes.append('JSSVGExternalResourcesRequired.cpp')
296         excludes.append('JSSVGFilterPrimitiveStandardAttributes.cpp')
297         excludes.append('JSSVGLocatable.cpp')
298         excludes.append('JSSVGStyleTable.cpp')
299         excludes.append('JSSVGTests.cpp')
300         excludes.append('JSSVGStylable.cpp')
301         excludes.append('JSSVGZoomAndPan.cpp')
302         
303         # These are files that expect methods not in the base C++ class, usually XYZAnimated methods.
304         excludes.append('JSSVGFitToViewBox.cpp')
305         excludes.append('JSSVGLangSpace.cpp')
306         excludes.append('JSSVGTransformable.cpp')
307         excludes.append('JSSVGURIReference.cpp')
308         
309         # These are C++ DOM Bindings that won't compile because they look for things not in trunk.
310         excludes.append('WebDOMEventTarget.cpp')
311         excludes.append('WebDOMAbstractView.cpp')
312         excludes.append('WebDOMBlobBuilder.cpp')
313         excludes.append('WebDOMEventListenerCustom.cpp')
314         excludes.append('WebDOMElementTimeControl.cpp')
315         excludes.append('WebDOMImageData.cpp')
316         excludes.append('WebDOMInspectorBackend.cpp')
317         excludes.append('WebDOMScriptProfile.cpp')
318         excludes.append('WebDOMScriptProfileNode.cpp')
319         excludes.append('WebNativeEventListener.cpp')
320         
321         # FIXME: It appears these are no longer needed by any port, once this is confirmed,
322         # we should remove these sources from the tree.
323         excludes.append('WebDOMDOMWindowCustom.cpp')
324         excludes.append('WebDOMHTMLOptionsCollectionCustom.cpp')
325         excludes.append('WebDOMNodeCustom.cpp')
326         excludes.append('WebDOMHTMLDocumentCustom.cpp')
327         excludes.append('WebDOMHTMLCollectionCustom.cpp')
328         
329         # this file is unused by any port, not sure why it was
330         # left in the tree
331         excludes.append('GeneratedImage.cpp')
332         
333         # features we don't build / use
334         excludes.append('JSNavigatorCustom.cpp')
335         excludes.append('WebGLContextEvent.cpp')
336         excludes.append('FileSystemPOSIX.cpp')
337         excludes.append('SharedBufferPOSIX.cpp')
338         
339         
340         # These files appear not to build with older versions of ICU
341         excludes.append('LocalizedNumberICU.cpp')
342         excludes.append('LocaleToScriptMappingICU.cpp')
343         
344         if building_on_win32:
345             excludes.append('SharedTimerWx.cpp')
346             excludes.append('RenderThemeWin.cpp')
347             excludes.append('KeyEventWin.cpp')
348             
349         if building_on_win32 or sys.platform.startswith('darwin'):
350             excludes.append('GlyphMapWx.cpp')
351         excludes.append('AuthenticationCF.cpp')
352         excludes.append('LoaderRunLoopCF.cpp')
353         excludes.append('ResourceErrorCF.cpp')
354         
355         # once we move over to the new FPD implementation, remove this.
356         excludes.append('FontPlatformData.cpp')
357         
358         # we don't use gestures currently
359         excludes.append('PlatformGestureRecognizer.cpp')
360         
361         # we need a better system to exclude CF stuff
362         excludes.append('HyphenationCF.cpp')
363         
364         if sys.platform.startswith('darwin'):
365             webcore.includes += ' Source/WebKit/mac/WebCoreSupport Source/WebCore/platform/mac'
366             webcore.source += ' Source/WebKit/mac/WebCoreSupport/WebSystemInterface.mm'
367             
368         if building_on_win32:
369             for wxlib in bld.env['LIB_WX']:
370                 wx_version = wxpresets.get_wx_version(os.environ['WXWIN'])
371                 if int(wx_version[1]) % 2 == 1:
372                     wxlib = wxlib.replace(''.join(wx_version[:2]), ''.join(wx_version))
373                 wxlibname = os.path.join(bld.env['LIBPATH_WX'][0], wxlib + '_vc.dll')
374                 print "Copying %s" % wxlibname
375                 if os.path.exists(wxlibname):
376                     bld.install_files(webcore.install_path, [wxlibname])
377         
378             for dep in windows_deps:
379                 bld.install_files(webcore.install_path, [os.path.join(msvclibs_dir, dep)])
380             
381             if "CAIRO_ROOT" in os.environ and Options.options.cairo:
382                 cairo_bin_dir = os.path.join(os.environ["CAIRO_ROOT"], "bin") 
383                 for dep in glob.glob(os.path.join(cairo_bin_dir, "*.dll")):
384                     bld.install_files(webcore.install_path, [os.path.join(cairo_bin_dir, dep)])
385                     
386     webcore.find_sources_in_dirs(full_dirs, excludes = excludes, exts=['.c', '.cpp'])
387
388     bld.add_group()
389     
390     if Options.options.port == "wx":    
391         bld.add_subdirs(['Tools/DumpRenderTree', 'Tools/wx/browser', 'Source/WebKit/wx/bindings/python'])