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 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'
196 webcore_sources['wx-gtk'] = [
197 'Source/WebCore/plugins/PluginViewNone.cpp',
198 'Source/WebCore/plugins/PluginPackageNone.cpp'
200 webcore_dirs.append('Source/WebCore/platform/wx/wxcode/gtk')
205 # FIXME: Does this need to be Source/JavaScriptCore?
206 bld.add_subdirs('Source/JavaScriptCore')
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']
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')
220 if sys.platform.startswith('darwin'):
221 features.append('cf')
224 exclude_patterns.append('*CF.cpp')
226 full_dirs = get_dirs_for_features(wk_root, features=features, dirs=webcore_dirs)
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)
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'))
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.
250 wk_includes.append(os.path.join(msvclibs_dir, 'include'))
252 cxxflags.extend(['-include', 'WebCorePrefix.h'])
254 webcore = bld.new_task_gen(
255 features = 'cc cxx cshlib',
256 includes = ' '.join(wk_includes),
257 source = ' '.join(flattenSources(webcore_sources.values())),
259 defines = ['WXMAKINGDLL_WEBKIT', 'BUILDING_WebCore'],
260 libpath = [output_dir],
262 uselib = 'WX ICU XML XSLT CURL SQLITE3 WKINTERFACE ' + get_config(),
263 uselib_local = 'jscore',
264 install_path = output_dir,
269 if Options.options.port == 'wx':
270 excludes = get_excludes(webcore_dir, exclude_patterns)
271 excludes.extend(['UserStyleSheetLoader.cpp', 'RenderMediaControls.cpp'])
273 # intermediate sources
274 excludes.append('DocTypeStrings.cpp')
275 excludes.append('HTMLEntityNames.cpp')
276 excludes.append('tokenizer.cpp')
278 # Qt specific file in common sources
279 excludes.append('ContextShadow.cpp')
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')
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')
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')
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')
317 # This file appears not to build with older versions of ICU
318 excludes.append('LocalizedNumberICU.cpp')
320 if building_on_win32:
321 excludes.append('SharedTimerWx.cpp')
322 excludes.append('RenderThemeWin.cpp')
323 excludes.append('KeyEventWin.cpp')
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')
331 # once we move over to the new FPD implementation, remove this.
332 excludes.append('FontPlatformData.cpp')
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'
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])
348 for dep in windows_deps:
349 bld.install_files(webcore.install_path, [os.path.join(msvclibs_dir, dep)])
351 webcore.find_sources_in_dirs(full_dirs, excludes = excludes, exts=['.c', '.cpp'])
355 if Options.options.port == "wx":
356 bld.add_subdirs(['Tools/DumpRenderTree', 'Tools/wx/browser', 'Source/WebKit/wx/bindings/python'])