3 # Copyright (C) 2009 Kevin Ollivier All rights reserved.
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
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.
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.
26 # WebCore build script for the waf build system
30 from settings import *
34 from TaskGen import taskgen, feature, after
37 def generate_webcore_derived_sources(conf):
38 # build the derived sources
39 derived_sources_dir = os.path.join(webcore_dir, 'DerivedSources')
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)
47 os.chdir(derived_sources_dir)
49 # DerivedSources.make expects Cygwin (i.e. Unix-style) python, so use that instead.
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"]))
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))
59 def generate_jscore_derived_sources(conf):
60 # build the derived sources
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)
69 os.chdir(derived_sources_dir)
71 # DerivedSources.make expects Cygwin (i.e. Unix-style) python, so use that instead.
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"])
78 os.environ["PATH"] = oldpath
82 common_set_options(opt)
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'))
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)))
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')
113 webcore_dirs = list(webcore_dirs_common)
115 if Options.options.port == "wx":
116 webcore_dirs.extend(['Source/WebKit/wx', 'Source/WebKit/wx/WebKitSupport'])
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),
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'))
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'))
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',
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'
154 if building_on_win32:
155 # make sure platform/wx comes after this so we get the right
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',
175 if Options.options.cairo:
176 webcore_dirs.append('Source/WebCore/platform/wx/wxcode/cairo')
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'
200 webcore_sources['wx-gtk'] = [
201 'Source/WebCore/plugins/PluginViewNone.cpp',
202 'Source/WebCore/plugins/PluginPackageNone.cpp'
204 webcore_dirs.append('Source/WebCore/platform/wx/wxcode/gtk')
205 webcore_dirs.append('Source/WebCore/platform/wx/wxcode/cairo')
210 # FIXME: Does this need to be Source/JavaScriptCore?
211 bld.add_subdirs('Source/JavaScriptCore')
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']
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')
225 if sys.platform.startswith('darwin'):
226 features.append('cf')
229 exclude_patterns.append('*CF.cpp')
231 full_dirs = get_dirs_for_features(wk_root, features=features, dirs=webcore_dirs)
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)
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'))
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.
255 wk_includes.append(os.path.join(msvclibs_dir, 'include'))
257 cxxflags.extend(['-include', 'WebCorePrefix.h'])
259 webcore = bld.new_task_gen(
260 features = 'cc cxx cshlib',
261 includes = ' '.join(wk_includes),
262 source = ' '.join(flattenSources(webcore_sources.values())),
264 defines = ['WXMAKINGDLL_WEBKIT', 'BUILDING_WebCore'],
265 libpath = [output_dir],
267 uselib = 'WX ICU XML XSLT CURL SQLITE3 WKINTERFACE ' + get_config(),
268 uselib_local = 'jscore',
269 install_path = output_dir,
274 if Options.options.port == 'wx':
275 excludes = get_excludes(webcore_dir, exclude_patterns)
276 excludes.extend(['UserStyleSheetLoader.cpp', 'RenderMediaControls.cpp'])
278 # intermediate sources
279 excludes.append('DocTypeStrings.cpp')
280 excludes.append('HTMLEntityNames.cpp')
282 # Qt specific file in common sources
283 excludes.append('ContextShadow.cpp')
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')
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')
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')
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')
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 excludes.append('WebNativeNodeFilterCondition.cpp')
329 excludes.append('WebDOMNodeFilterCustom.cpp')
331 # this file is unused by any port, not sure why it was
333 excludes.append('GeneratedImage.cpp')
335 # features we don't build / use
336 excludes.append('JSNavigatorCustom.cpp')
337 excludes.append('WebGLContextEvent.cpp')
338 excludes.append('FileSystemPOSIX.cpp')
339 excludes.append('SharedBufferPOSIX.cpp')
342 # These files appear not to build with older versions of ICU
343 excludes.append('LocalizedNumberICU.cpp')
344 excludes.append('LocaleToScriptMappingICU.cpp')
346 if building_on_win32:
347 excludes.append('SharedTimerWx.cpp')
348 excludes.append('RenderThemeWin.cpp')
349 excludes.append('KeyEventWin.cpp')
351 if building_on_win32 or sys.platform.startswith('darwin'):
352 excludes.append('GlyphMapWx.cpp')
353 excludes.append('AuthenticationCF.cpp')
354 excludes.append('LoaderRunLoopCF.cpp')
355 excludes.append('ResourceErrorCF.cpp')
357 # once we move over to the new FPD implementation, remove this.
358 excludes.append('FontPlatformData.cpp')
360 # we don't use gestures currently
361 excludes.append('PlatformGestureRecognizer.cpp')
363 # we need a better system to exclude CF stuff
364 excludes.append('HyphenationCF.cpp')
366 if sys.platform.startswith('darwin'):
367 webcore.includes += ' Source/WebKit/mac/WebCoreSupport Source/WebCore/platform/mac'
368 webcore.source += ' Source/WebKit/mac/WebCoreSupport/WebSystemInterface.mm'
370 if building_on_win32:
371 for wxlib in bld.env['LIB_WX']:
372 wx_version = wxpresets.get_wx_version(os.environ['WXWIN'])
373 if int(wx_version[1]) % 2 == 1:
374 wxlib = wxlib.replace(''.join(wx_version[:2]), ''.join(wx_version))
375 wxlibname = os.path.join(bld.env['LIBPATH_WX'][0], wxlib + '_vc.dll')
376 print "Copying %s" % wxlibname
377 if os.path.exists(wxlibname):
378 bld.install_files(webcore.install_path, [wxlibname])
380 for dep in windows_deps:
381 bld.install_files(webcore.install_path, [os.path.join(msvclibs_dir, dep)])
383 if "CAIRO_ROOT" in os.environ and Options.options.cairo:
384 cairo_bin_dir = os.path.join(os.environ["CAIRO_ROOT"], "bin")
385 for dep in glob.glob(os.path.join(cairo_bin_dir, "*.dll")):
386 bld.install_files(webcore.install_path, [os.path.join(cairo_bin_dir, dep)])
388 webcore.find_sources_in_dirs(full_dirs, excludes = excludes, exts=['.c', '.cpp'])
392 if Options.options.port == "wx":
393 bld.add_subdirs(['Tools/DumpRenderTree', 'Tools/wx/browser', 'Source/WebKit/wx/bindings/python'])