Add gtklauncher source to support vuplus platform.
[vuplus_webkit] / 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/mac')
181             webcore_dirs.append('Source/WebCore/platform/text/mac')
182             webcore_sources['wx-mac'] = [
183                    'Source/WebCore/platform/mac/PurgeableBufferMac.cpp',
184                    'Source/WebCore/platform/mac/WebCoreNSStringExtras.mm',
185                    'Source/WebCore/platform/mac/WebCoreSystemInterface.mm',
186                    'Source/WebCore/platform/graphics/cg/FloatSizeCG.cpp',
187                    'Source/WebCore/platform/graphics/mac/ComplexTextController.cpp',
188                    'Source/WebCore/platform/graphics/mac/ComplexTextControllerCoreText.cpp',
189                    'Source/WebCore/platform/graphics/mac/ComplexTextControllerATSUI.cpp',
190                    'Source/WebCore/platform/graphics/mac/GlyphPageTreeNodeMac.cpp',
191                    'Source/WebCore/platform/graphics/mac/SimpleFontDataATSUI.mm',
192                    'Source/WebCore/platform/graphics/mac/SimpleFontDataCoreText.cpp',
193                    'Source/WebCore/platform/graphics/wx/FontPlatformDataWxMac.mm',
194                    'Source/WebCore/platform/wx/wxcode/mac/carbon/fontprops.mm',
195                    'Source/WebCore/plugins/mac/PluginPackageMac.cpp',
196                    'Source/WebCore/plugins/mac/PluginViewMac.mm'
197             ]
198         else:
199             webcore_sources['wx-gtk'] = [
200                    'Source/WebCore/plugins/PluginViewNone.cpp',
201                    'Source/WebCore/plugins/PluginPackageNone.cpp'
202             ]
203             webcore_dirs.append('Source/WebCore/platform/wx/wxcode/gtk')
204             webcore_dirs.append('Source/WebCore/platform/wx/wxcode/cairo')
205         
206
207     import TaskGen
208
209     # FIXME: Does this need to be Source/JavaScriptCore?
210     bld.add_subdirs('Source/JavaScriptCore')
211
212     if sys.platform.startswith('darwin'):
213         TaskGen.task_gen.mappings['.mm'] = TaskGen.task_gen.mappings['.cxx']
214         TaskGen.task_gen.mappings['.m'] = TaskGen.task_gen.mappings['.cxx']
215
216     features = [Options.options.port.lower()]
217     exclude_patterns = ['*AllInOne.cpp', '*Brew.cpp', '*CFNet.cpp', '*Chromium*.cpp', 
218             '*Efl.cpp', '*Gtk.cpp', '*Haiku.cpp', '*Mac.cpp', '*None.cpp', '*Qt.cpp', '*Safari.cpp',
219             'test*bindings.*', '*WinCE.cpp', "WebDOMCanvas*.cpp", "WebDOMSVG*.cpp"]
220     if Options.options.port == 'wx':
221         features.append('curl')
222         exclude_patterns.append('*Win.cpp')
223         
224     if sys.platform.startswith('darwin'):
225         features.append('cf')
226         
227     else:
228         exclude_patterns.append('*CF.cpp')
229
230     full_dirs = get_dirs_for_features(wk_root, features=features, dirs=webcore_dirs)
231
232     jscore_dir = os.path.join(wk_root, 'Source', 'JavaScriptCore')
233     for item in os.listdir(jscore_dir):
234         fullpath = os.path.join(jscore_dir, item)
235         if os.path.isdir(fullpath) and not item == "os-win32" and not item == 'icu':
236             wk_includes.append(fullpath)
237
238     wk_includes.append('Source')
239     wk_includes.append(os.path.join(jscore_dir, 'collector', 'handles'))
240     wk_includes.append(os.path.join(jscore_dir, 'wtf', 'unicode'))
241     wk_includes.append(os.path.join(jscore_dir, 'wtf', 'unicode', 'icu'))
242     wk_includes += common_includes + full_dirs
243     if sys.platform.startswith('darwin'):
244         wk_includes.append(os.path.join(webcore_dir, 'icu'))
245
246     cxxflags = []
247     if building_on_win32:
248         cxxflags.append('/FIWebCorePrefix.h')
249         # FIXME: We do this because in waf, local include dirs take precedence
250         # over global ones. This makes sense, but because unicode/utf8.h is both
251         # an ICU header name and a WebKit header name (in Source/JavaScriptCore/wtf)
252         # we have to make sure <unicode/utf8.h> picks up the ICU one first.
253         global msvclibs_dir
254         wk_includes.append(os.path.join(msvclibs_dir, 'include'))
255     else:
256         cxxflags.extend(['-include', 'WebCorePrefix.h'])
257
258     webcore = bld.new_task_gen(
259         features = 'cc cxx cshlib',
260         includes = ' '.join(wk_includes),
261         source = ' '.join(flattenSources(webcore_sources.values())),
262         cxxflags = cxxflags,
263         defines = ['WXMAKINGDLL_WEBKIT', 'BUILDING_WebCore'],
264         libpath = [output_dir],
265         target = 'wxwebkit',
266         uselib = 'WX ICU XML XSLT CURL SQLITE3 WKINTERFACE ' + get_config(),
267         uselib_local = 'jscore',
268         install_path = output_dir,
269         )
270         
271     excludes = []
272     
273     if Options.options.port == 'wx':
274         excludes = get_excludes(webcore_dir, exclude_patterns)
275         excludes.extend(['UserStyleSheetLoader.cpp', 'RenderMediaControls.cpp'])
276
277         # intermediate sources
278         excludes.append('DocTypeStrings.cpp')
279         excludes.append('HTMLEntityNames.cpp')
280         excludes.append('tokenizer.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         # These files appear not to build with older versions of ICU
322         excludes.append('LocalizedNumberICU.cpp')
323         excludes.append('LocaleToScriptMappingICU.cpp')
324         
325         if building_on_win32:
326             excludes.append('SharedTimerWx.cpp')
327             excludes.append('RenderThemeWin.cpp')
328             excludes.append('KeyEventWin.cpp')
329             
330         if building_on_win32 or sys.platform.startswith('darwin'):
331             excludes.append('GlyphMapWx.cpp')
332         excludes.append('AuthenticationCF.cpp')
333         excludes.append('LoaderRunLoopCF.cpp')
334         excludes.append('ResourceErrorCF.cpp')
335         
336         # once we move over to the new FPD implementation, remove this.
337         excludes.append('FontPlatformData.cpp')
338         
339         # we don't use gestures currently
340         excludes.append('PlatformGestureRecognizer.cpp')
341         
342         if sys.platform.startswith('darwin'):
343             webcore.includes += ' Source/WebKit/mac/WebCoreSupport WebCore/platform/mac'
344             webcore.source += ' Source/WebKit/mac/WebCoreSupport/WebSystemInterface.mm'
345             
346         if building_on_win32:
347             for wxlib in bld.env['LIB_WX']:
348                 wx_version = wxpresets.get_wx_version(os.environ['WXWIN'])
349                 if int(wx_version[1]) % 2 == 1:
350                     wxlib = wxlib.replace(''.join(wx_version[:2]), ''.join(wx_version))
351                 wxlibname = os.path.join(bld.env['LIBPATH_WX'][0], wxlib + '_vc.dll')
352                 print "Copying %s" % wxlibname
353                 if os.path.exists(wxlibname):
354                     bld.install_files(webcore.install_path, [wxlibname])
355         
356             for dep in windows_deps:
357                 bld.install_files(webcore.install_path, [os.path.join(msvclibs_dir, dep)])
358             
359             if "CAIRO_ROOT" in os.environ and Options.options.cairo:
360                 cairo_bin_dir = os.path.join(os.environ["CAIRO_ROOT"], "bin") 
361                 for dep in glob.glob(os.path.join(cairo_bin_dir, "*.dll")):
362                     bld.install_files(webcore.install_path, [os.path.join(cairo_bin_dir, dep)])
363                     
364     webcore.find_sources_in_dirs(full_dirs, excludes = excludes, exts=['.c', '.cpp'])
365
366     bld.add_group()
367     
368     if Options.options.port == "wx":    
369         bld.add_subdirs(['Tools/DumpRenderTree', 'Tools/wx/browser', 'Source/WebKit/wx/bindings/python'])