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