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
58 def generate_jscore_derived_sources(conf):
59 # build the derived sources
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)
68 os.chdir(derived_sources_dir)
70 # DerivedSources.make expects Cygwin (i.e. Unix-style) python, so use that instead.
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"])
77 os.environ["PATH"] = oldpath
81 common_set_options(opt)
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'))
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)))
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')
112 webcore_dirs = list(webcore_dirs_common)
114 if Options.options.port == "wx":
115 webcore_dirs.extend(['Source/WebKit/wx', 'Source/WebKit/wx/WebKitSupport'])
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),
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'))
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'))
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',
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'
153 if building_on_win32:
154 # make sure platform/wx comes after this so we get the right
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',
173 if Options.options.cairo:
174 webcore_dirs.append('Source/WebCore/platform/wx/wxcode/cairo')
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/text/mac')
181 webcore_sources['wx-mac'] = [
182 'Source/WebCore/platform/mac/PurgeableBufferMac.cpp',
183 'Source/WebCore/platform/mac/WebCoreNSStringExtras.mm',
184 'Source/WebCore/platform/mac/WebCoreSystemInterface.mm',
185 'Source/WebCore/platform/graphics/cg/FloatSizeCG.cpp',
186 'Source/WebCore/platform/graphics/mac/ComplexTextController.cpp',
187 'Source/WebCore/platform/graphics/mac/ComplexTextControllerCoreText.mm',
188 'Source/WebCore/platform/graphics/mac/ComplexTextControllerATSUI.cpp',
189 'Source/WebCore/platform/graphics/mac/GlyphPageTreeNodeMac.cpp',
190 'Source/WebCore/platform/graphics/mac/SimpleFontDataATSUI.mm',
191 'Source/WebCore/platform/graphics/mac/SimpleFontDataCoreText.cpp',
192 'Source/WebCore/platform/graphics/wx/FontPlatformDataWxMac.mm',
193 'Source/WebCore/platform/wx/wxcode/mac/carbon/fontprops.mm',
194 'Source/WebCore/plugins/mac/PluginPackageMac.cpp',
195 'Source/WebCore/plugins/mac/PluginViewMac.mm'
198 webcore_sources['wx-gtk'] = [
199 'Source/WebCore/plugins/PluginViewNone.cpp',
200 'Source/WebCore/plugins/PluginPackageNone.cpp'
202 webcore_dirs.append('Source/WebCore/platform/wx/wxcode/gtk')
203 webcore_dirs.append('Source/WebCore/platform/wx/wxcode/cairo')
208 # FIXME: Does this need to be Source/JavaScriptCore?
209 bld.add_subdirs('Source/JavaScriptCore')
211 if sys.platform.startswith('darwin'):
212 TaskGen.task_gen.mappings['.mm'] = TaskGen.task_gen.mappings['.cxx']
213 TaskGen.task_gen.mappings['.m'] = TaskGen.task_gen.mappings['.cxx']
215 features = [Options.options.port.lower()]
216 exclude_patterns = ['*AllInOne.cpp', '*CFNet.cpp', '*Chromium*.cpp',
217 '*Efl.cpp', '*Gtk.cpp', '*Mac.cpp', '*None.cpp', '*Qt.cpp', '*Safari.cpp',
218 'test*bindings.*', '*WinCE.cpp', "WebDOMCanvas*.cpp", "WebDOMSVG*.cpp"]
219 if Options.options.port == 'wx':
220 features.append('curl')
221 exclude_patterns.append('*Win.cpp')
223 if sys.platform.startswith('darwin'):
224 features.append('cf')
227 exclude_patterns.append('*CF.cpp')
229 full_dirs = get_dirs_for_features(wk_root, features=features, dirs=webcore_dirs)
231 jscore_dir = os.path.join(wk_root, 'Source', 'JavaScriptCore')
232 for item in os.listdir(jscore_dir):
233 fullpath = os.path.join(jscore_dir, item)
234 if os.path.isdir(fullpath) and not item == "os-win32" and not item == 'icu':
235 wk_includes.append(fullpath)
237 wk_includes.append('Source')
238 wk_includes.append(os.path.join(jscore_dir, 'collector', 'handles'))
239 wk_includes.append(os.path.join(jscore_dir, 'wtf', 'unicode'))
240 wk_includes.append(os.path.join(jscore_dir, 'wtf', 'unicode', 'icu'))
241 wk_includes += common_includes + full_dirs
242 if sys.platform.startswith('darwin'):
243 wk_includes.append(os.path.join(webcore_dir, 'icu'))
246 if building_on_win32:
247 cxxflags.append('/FIWebCorePrefix.h')
248 # FIXME: We do this because in waf, local include dirs take precedence
249 # over global ones. This makes sense, but because unicode/utf8.h is both
250 # an ICU header name and a WebKit header name (in Source/JavaScriptCore/wtf)
251 # we have to make sure <unicode/utf8.h> picks up the ICU one first.
253 wk_includes.append(os.path.join(msvclibs_dir, 'include'))
255 cxxflags.extend(['-include', 'WebCorePrefix.h'])
257 webcore = bld.new_task_gen(
258 features = 'cc cxx cshlib',
259 includes = ' '.join(wk_includes),
260 source = ' '.join(flattenSources(webcore_sources.values())),
262 defines = ['WXMAKINGDLL_WEBKIT', 'BUILDING_WebCore'],
263 libpath = [output_dir],
265 uselib = 'WX ICU XML XSLT CURL SQLITE3 WKINTERFACE ' + get_config(),
266 uselib_local = 'jscore',
267 install_path = output_dir,
272 if Options.options.port == 'wx':
273 excludes = get_excludes(webcore_dir, exclude_patterns)
274 excludes.extend(['UserStyleSheetLoader.cpp', 'RenderMediaControls.cpp'])
276 # intermediate sources
277 excludes.append('DocTypeStrings.cpp')
278 excludes.append('HTMLEntityNames.cpp')
279 excludes.append('tokenizer.cpp')
281 # Qt specific file in common sources
282 excludes.append('ContextShadow.cpp')
284 # FIXME: these three require headers that I can't seem to find in trunk.
285 # Investigate how to resolve these issues.
286 excludes.append('JSAbstractView.cpp')
287 excludes.append('JSPositionCallback.cpp')
288 excludes.append('JSInspectorController.cpp')
290 # The bindings generator seems to think these are ref-counted, while they aren't in trunk.
291 excludes.append('JSElementTimeControl.cpp')
292 excludes.append('JSSVGAnimatedPathData.cpp')
293 excludes.append('JSSVGAnimatedPoints.cpp')
294 excludes.append('JSSVGExternalResourcesRequired.cpp')
295 excludes.append('JSSVGFilterPrimitiveStandardAttributes.cpp')
296 excludes.append('JSSVGLocatable.cpp')
297 excludes.append('JSSVGStyleTable.cpp')
298 excludes.append('JSSVGTests.cpp')
299 excludes.append('JSSVGStylable.cpp')
300 excludes.append('JSSVGZoomAndPan.cpp')
302 # These are files that expect methods not in the base C++ class, usually XYZAnimated methods.
303 excludes.append('JSSVGFitToViewBox.cpp')
304 excludes.append('JSSVGLangSpace.cpp')
305 excludes.append('JSSVGTransformable.cpp')
306 excludes.append('JSSVGURIReference.cpp')
308 # These are C++ DOM Bindings that won't compile because they look for things not in trunk.
309 excludes.append('WebDOMEventTarget.cpp')
310 excludes.append('WebDOMAbstractView.cpp')
311 excludes.append('WebDOMBlobBuilder.cpp')
312 excludes.append('WebDOMEventListenerCustom.cpp')
313 excludes.append('WebDOMElementTimeControl.cpp')
314 excludes.append('WebDOMImageData.cpp')
315 excludes.append('WebDOMInspectorBackend.cpp')
316 excludes.append('WebDOMScriptProfile.cpp')
317 excludes.append('WebDOMScriptProfileNode.cpp')
318 excludes.append('WebNativeEventListener.cpp')
320 # this file is unused by any port, not sure why it was
322 excludes.append('GeneratedImage.cpp')
324 # features we don't build / use
325 excludes.append('JSNavigatorCustom.cpp')
326 excludes.append('WebGLContextEvent.cpp')
327 excludes.append('FileSystemPOSIX.cpp')
328 excludes.append('SharedBufferPOSIX.cpp')
331 # These files appear not to build with older versions of ICU
332 excludes.append('LocalizedNumberICU.cpp')
333 excludes.append('LocaleToScriptMappingICU.cpp')
335 if building_on_win32:
336 excludes.append('SharedTimerWx.cpp')
337 excludes.append('RenderThemeWin.cpp')
338 excludes.append('KeyEventWin.cpp')
340 if building_on_win32 or sys.platform.startswith('darwin'):
341 excludes.append('GlyphMapWx.cpp')
342 excludes.append('AuthenticationCF.cpp')
343 excludes.append('LoaderRunLoopCF.cpp')
344 excludes.append('ResourceErrorCF.cpp')
346 # once we move over to the new FPD implementation, remove this.
347 excludes.append('FontPlatformData.cpp')
349 # we don't use gestures currently
350 excludes.append('PlatformGestureRecognizer.cpp')
352 # we need a better system to exclude CF stuff
353 excludes.append('HyphenationCF.cpp')
355 if sys.platform.startswith('darwin'):
356 webcore.includes += ' Source/WebKit/mac/WebCoreSupport Source/WebCore/platform/mac'
357 webcore.source += ' Source/WebKit/mac/WebCoreSupport/WebSystemInterface.mm'
359 if building_on_win32:
360 for wxlib in bld.env['LIB_WX']:
361 wx_version = wxpresets.get_wx_version(os.environ['WXWIN'])
362 if int(wx_version[1]) % 2 == 1:
363 wxlib = wxlib.replace(''.join(wx_version[:2]), ''.join(wx_version))
364 wxlibname = os.path.join(bld.env['LIBPATH_WX'][0], wxlib + '_vc.dll')
365 print "Copying %s" % wxlibname
366 if os.path.exists(wxlibname):
367 bld.install_files(webcore.install_path, [wxlibname])
369 for dep in windows_deps:
370 bld.install_files(webcore.install_path, [os.path.join(msvclibs_dir, dep)])
372 if "CAIRO_ROOT" in os.environ and Options.options.cairo:
373 cairo_bin_dir = os.path.join(os.environ["CAIRO_ROOT"], "bin")
374 for dep in glob.glob(os.path.join(cairo_bin_dir, "*.dll")):
375 bld.install_files(webcore.install_path, [os.path.join(cairo_bin_dir, dep)])
377 webcore.find_sources_in_dirs(full_dirs, excludes = excludes, exts=['.c', '.cpp'])
381 if Options.options.port == "wx":
382 bld.add_subdirs(['Tools/DumpRenderTree', 'Tools/wx/browser', 'Source/WebKit/wx/bindings/python'])