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 *
32 if build_port == "wx":
33 webcore_dirs.extend(['Source/WebKit/wx', 'Source/WebKit/wx/WebKitSupport'])
36 os.path.join(wk_root, 'Source', 'JavaScriptCore'),
37 os.path.join(wk_root, 'Source', 'JavaScriptCore', 'wtf', 'text'),
38 os.path.join(wk_root, 'Source', 'WebCore'),
39 os.path.join(wk_root, 'Source', 'WebCore', 'DerivedSources'),
40 os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'image-decoders'),
41 os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'win'),
42 os.path.join(wk_root, 'Source', 'WebCore', 'workers'),
43 os.path.join(output_dir),
46 if build_port == "wx":
47 wk_includes.append(os.path.join(wk_root, 'Source', 'WebKit', 'wx'))
48 wk_includes.append(os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'wx', 'wxcode'))
50 if sys.platform.startswith("win"):
51 wk_includes.append(os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'win'))
52 wk_includes.append(os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'graphics', 'win'))
56 'bin/icuuc40.dll', 'bin/icudt40.dll', 'bin/icuin40.dll',
57 'bin/libcurl.dll', 'bin/libeay32.dll', 'bin/ssleay32.dll', 'bin/zlib1.dll',
58 'lib/sqlite3.dll', 'bin/libxml2.dll', 'bin/libxslt.dll', 'bin/iconv.dll',
63 if build_port == "wx":
64 webcore_sources['wx'] = [
65 'Source/WebCore/bindings/cpp/WebDOMEventTarget.cpp',
66 'Source/WebCore/platform/KillRingNone.cpp',
67 'Source/WebCore/platform/text/LocalizedNumberNone.cpp'
71 # make sure platform/wx comes after this so we get the right
73 webcore_dirs.extend(['Source/WebCore/platform/wx/wxcode/win', 'Source/WebCore/plugins/win'])
74 webcore_sources['wx-win'] = [
75 'Source/WebCore/platform/graphics/win/GlyphPageTreeNodeCairoWin.cpp',
76 'Source/WebCore/platform/graphics/win/TransformationMatrixWin.cpp',
77 'Source/WebCore/platform/ScrollAnimatorWin.cpp',
78 # wxTimer on Windows has a bug that causes it to eat crashes in callbacks
79 # so we need to use the Win port's implementation until the wx bug fix is
80 # widely available (it was fixed in 2.8.10).
81 'Source/WebCore/platform/win/SharedTimerWin.cpp',
82 'Source/WebCore/platform/win/WebCoreInstanceHandle.cpp',
83 # Use the Windows plugin architecture
84 #'Source/WebCore/plugins/win/PluginDataWin.cpp',
85 'Source/WebCore/plugins/win/PluginDatabaseWin.cpp',
86 'Source/WebCore/plugins/win/PluginMessageThrottlerWin.cpp',
87 'Source/WebCore/plugins/win/PluginPackageWin.cpp',
88 'Source/WebCore/plugins/win/PluginViewWin.cpp',
90 elif sys.platform.startswith('darwin'):
91 webcore_dirs.append('Source/WebCore/plugins/mac')
92 webcore_dirs.append('Source/WebCore/platform/wx/wxcode/mac/carbon')
93 webcore_dirs.append('Source/WebCore/platform/mac')
94 webcore_dirs.append('Source/WebCore/platform/text/mac')
95 webcore_sources['wx-mac'] = [
96 'Source/WebCore/platform/mac/PurgeableBufferMac.cpp',
97 'Source/WebCore/platform/mac/WebCoreNSStringExtras.mm',
98 'Source/WebCore/platform/mac/WebCoreSystemInterface.mm',
99 'Source/WebCore/platform/graphics/cg/FloatSizeCG.cpp',
100 'Source/WebCore/platform/graphics/mac/ComplexTextController.cpp',
101 'Source/WebCore/platform/graphics/mac/ComplexTextControllerCoreText.cpp',
102 'Source/WebCore/platform/graphics/mac/ComplexTextControllerATSUI.cpp',
103 'Source/WebCore/platform/graphics/mac/GlyphPageTreeNodeMac.cpp',
104 'Source/WebCore/platform/graphics/mac/SimpleFontDataATSUI.mm',
105 'Source/WebCore/platform/graphics/mac/SimpleFontDataCoreText.cpp',
106 'Source/WebCore/platform/graphics/wx/FontPlatformDataWxMac.mm',
107 'Source/WebCore/platform/text/mac/ShapeArabic.c',
108 'Source/WebCore/platform/wx/wxcode/mac/carbon/fontprops.mm',
109 'Source/WebCore/plugins/mac/PluginPackageMac.cpp',
110 'Source/WebCore/plugins/mac/PluginViewMac.mm'
113 webcore_sources['wx-gtk'] = [
114 'Source/WebCore/plugins/PluginViewNone.cpp',
115 'Source/WebCore/plugins/PluginPackageNone.cpp'
117 webcore_dirs.append('Source/WebCore/platform/wx/wxcode/gtk')
120 from TaskGen import taskgen, feature, after
123 def generate_webcore_derived_sources():
124 # build the derived sources
125 derived_sources_dir = os.path.join(webcore_dir, 'DerivedSources')
127 if building_on_win32:
128 wc_dir = get_output('cygpath --unix "%s"' % wc_dir)
129 if not os.path.exists(derived_sources_dir):
130 os.mkdir(derived_sources_dir)
133 os.chdir(derived_sources_dir)
135 # DerivedSources.make expects Cygwin (i.e. Unix-style) python, so use that instead.
136 if building_on_win32:
137 oldpath = os.environ["PATH"]
138 os.environ["PATH"] = "/usr/bin" + os.pathsep + os.environ["PATH"]
139 os.system('make -f %s/DerivedSources.make WebCore=%s SOURCE_ROOT=%s all FEATURE_DEFINES="%s"' % (wc_dir, wc_dir, wc_dir, ' '.join(feature_defines)))
140 if building_on_win32:
141 os.environ["PATH"] = oldpath
144 def generate_jscore_derived_sources():
145 # build the derived sources
147 if building_on_win32:
148 js_dir = get_output('cygpath --unix "%s"' % js_dir)
149 derived_sources_dir = os.path.join(jscore_dir, 'DerivedSources')
150 if not os.path.exists(derived_sources_dir):
151 os.mkdir(derived_sources_dir)
154 os.chdir(derived_sources_dir)
156 # DerivedSources.make expects Cygwin (i.e. Unix-style) python, so use that instead.
157 if building_on_win32:
158 oldpath = os.environ["PATH"]
159 os.environ["PATH"] = "/usr/bin" + os.pathsep + os.environ["PATH"]
160 command = 'make -f %s/DerivedSources.make JavaScriptCore=%s BUILT_PRODUCTS_DIR=%s all FEATURE_DEFINES="%s"' % (js_dir, js_dir, js_dir, ' '.join(feature_defines))
162 if building_on_win32:
163 os.environ["PATH"] = oldpath
166 def set_options(opt):
167 common_set_options(opt)
170 common_configure(conf)
171 generate_jscore_derived_sources()
172 generate_webcore_derived_sources()
173 if build_port == "wx" and sys.platform.startswith('win'):
174 graphics_dir = os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'graphics')
175 # HACK ALERT: MSVC automatically adds the source file's directory as the first entry in the
176 # path. Unfortunately, that means when compiling these files we will end up including
177 # win/FontPlatformData.h, which breaks wx compilation. So we copy the files to the wx dir.
178 for afile in ['UniscribeController.h', 'UniscribeController.cpp', 'GlyphPageTreeNodeCairoWin.cpp']:
179 shutil.copy(os.path.join(graphics_dir, 'win', afile), os.path.join(graphics_dir, 'wx'))
181 webcore_out_dir = os.path.join(output_dir, 'WebCore')
182 if not os.path.exists(webcore_out_dir):
183 os.makedirs(webcore_out_dir)
184 shutil.copy('Source/WebCore/platform/mac/WebCoreSystemInterface.h', os.path.join(output_dir, 'WebCore', 'WebCoreSystemInterface.h'))
185 jscore_out_dir = os.path.join(output_dir, 'JavaScriptCore')
186 if not os.path.exists(jscore_out_dir):
187 os.makedirs(jscore_out_dir)
188 for api_file in glob.glob(os.path.join(jscore_dir, 'API/*.h')):
189 shutil.copy(api_file, os.path.join(jscore_out_dir, os.path.basename(api_file)))
191 if build_port == "wx" and Options.options.wxpython:
192 common_configure(conf)
193 conf.check_tool('swig', tooldir='Source/WebKit/wx/bindings/python')
194 conf.check_swig_version('1.3.29')
200 # FIXME: Does this need to be Source/JavaScriptCore?
201 bld.add_subdirs('Source/JavaScriptCore')
203 if sys.platform.startswith('darwin'):
204 TaskGen.task_gen.mappings['.mm'] = TaskGen.task_gen.mappings['.cxx']
205 TaskGen.task_gen.mappings['.m'] = TaskGen.task_gen.mappings['.cxx']
207 features = [build_port]
208 exclude_patterns = ['*AllInOne.cpp', '*Brew.cpp', '*CFNet.cpp', '*Chromium*.cpp',
209 '*Efl.cpp', '*Gtk.cpp', '*Haiku.cpp', '*Mac.cpp', '*None.cpp', '*Qt.cpp', '*Safari.cpp',
210 'test*bindings.*', '*WinCE.cpp', "WebDOMCanvas*.cpp", "WebDOMSVG*.cpp"]
211 if build_port == 'wx':
212 features.append('curl')
213 exclude_patterns.append('*Win.cpp')
215 if sys.platform.startswith('darwin'):
216 features.append('cf')
219 exclude_patterns.append('*CF.cpp')
221 full_dirs = get_dirs_for_features(wk_root, features=features, dirs=webcore_dirs)
223 jscore_dir = os.path.join(wk_root, 'Source', 'JavaScriptCore')
224 for item in os.listdir(jscore_dir):
225 fullpath = os.path.join(jscore_dir, item)
226 if os.path.isdir(fullpath) and not item == "os-win32" and not item == 'icu':
227 wk_includes.append(fullpath)
229 wk_includes.append('Source')
230 wk_includes.append(os.path.join(jscore_dir, 'collector', 'handles'))
231 wk_includes.append(os.path.join(jscore_dir, 'wtf', 'unicode'))
232 wk_includes.append(os.path.join(jscore_dir, 'wtf', 'unicode', 'icu'))
233 wk_includes += common_includes + full_dirs
234 if sys.platform.startswith('darwin'):
235 wk_includes.append(os.path.join(webcore_dir, 'icu'))
238 if building_on_win32:
239 cxxflags.append('/FIWebCorePrefix.h')
240 # FIXME: We do this because in waf, local include dirs take precedence
241 # over global ones. This makes sense, but because unicode/utf8.h is both
242 # an ICU header name and a WebKit header name (in Source/JavaScriptCore/wtf)
243 # we have to make sure <unicode/utf8.h> picks up the ICU one first.
245 wk_includes.append(os.path.join(msvclibs_dir, 'include'))
247 cxxflags.extend(['-include', 'WebCorePrefix.h'])
249 webcore = bld.new_task_gen(
250 features = 'cc cxx cshlib',
251 includes = ' '.join(wk_includes),
252 source = ' '.join(flattenSources(webcore_sources.values())),
254 defines = ['WXMAKINGDLL_WEBKIT', 'BUILDING_WebCore'],
255 libpath = [output_dir],
257 uselib = 'WX ICU XML XSLT CURL SQLITE3 WKINTERFACE ' + get_config(),
258 uselib_local = 'jscore',
259 install_path = output_dir,
264 if build_port == 'wx':
265 excludes = get_excludes(webcore_dir, exclude_patterns)
266 excludes.extend(['UserStyleSheetLoader.cpp', 'RenderMediaControls.cpp'])
268 # intermediate sources
269 excludes.append('DocTypeStrings.cpp')
270 excludes.append('HTMLEntityNames.cpp')
271 excludes.append('tokenizer.cpp')
273 # Qt specific file in common sources
274 excludes.append('ContextShadow.cpp')
276 # FIXME: these three require headers that I can't seem to find in trunk.
277 # Investigate how to resolve these issues.
278 excludes.append('JSAbstractView.cpp')
279 excludes.append('JSPositionCallback.cpp')
280 excludes.append('JSInspectorController.cpp')
282 # The bindings generator seems to think these are ref-counted, while they aren't in trunk.
283 excludes.append('JSElementTimeControl.cpp')
284 excludes.append('JSSVGAnimatedPathData.cpp')
285 excludes.append('JSSVGAnimatedPoints.cpp')
286 excludes.append('JSSVGExternalResourcesRequired.cpp')
287 excludes.append('JSSVGFilterPrimitiveStandardAttributes.cpp')
288 excludes.append('JSSVGLocatable.cpp')
289 excludes.append('JSSVGStyleTable.cpp')
290 excludes.append('JSSVGTests.cpp')
291 excludes.append('JSSVGStylable.cpp')
292 excludes.append('JSSVGZoomAndPan.cpp')
294 # These are files that expect methods not in the base C++ class, usually XYZAnimated methods.
295 excludes.append('JSSVGFitToViewBox.cpp')
296 excludes.append('JSSVGLangSpace.cpp')
297 excludes.append('JSSVGTransformable.cpp')
298 excludes.append('JSSVGURIReference.cpp')
300 # These are C++ DOM Bindings that won't compile because they look for things not in trunk.
301 excludes.append('WebDOMEventTarget.cpp')
302 excludes.append('WebDOMAbstractView.cpp')
303 excludes.append('WebDOMBlobBuilder.cpp')
304 excludes.append('WebDOMEventListenerCustom.cpp')
305 excludes.append('WebDOMElementTimeControl.cpp')
306 excludes.append('WebDOMImageData.cpp')
307 excludes.append('WebDOMInspectorBackend.cpp')
308 excludes.append('WebDOMScriptProfile.cpp')
309 excludes.append('WebDOMScriptProfileNode.cpp')
310 excludes.append('WebNativeEventListener.cpp')
312 # This file appears not to build with older versions of ICU
313 excludes.append('LocalizedNumberICU.cpp')
315 if building_on_win32:
316 excludes.append('SharedTimerWx.cpp')
317 excludes.append('RenderThemeWin.cpp')
318 excludes.append('KeyEventWin.cpp')
320 if building_on_win32 or sys.platform.startswith('darwin'):
321 excludes.append('GlyphMapWx.cpp')
322 excludes.append('AuthenticationCF.cpp')
323 excludes.append('LoaderRunLoopCF.cpp')
324 excludes.append('ResourceErrorCF.cpp')
326 # once we move over to the new FPD implementation, remove this.
327 excludes.append('FontPlatformData.cpp')
329 if sys.platform.startswith('darwin'):
330 webcore.includes += ' Source/WebKit/mac/WebCoreSupport WebCore/platform/mac'
331 webcore.source += ' Source/WebKit/mac/WebCoreSupport/WebSystemInterface.mm'
333 if building_on_win32:
334 for wxlib in bld.env['LIB_WX']:
335 wxlibname = os.path.join(bld.env['LIBPATH_WX'][0], wxlib + '_vc.dll')
336 if os.path.exists(wxlibname):
337 bld.install_files(webcore.install_path, [wxlibname])
339 for dep in windows_deps:
340 bld.install_files(webcore.install_path, [os.path.join(msvclibs_dir, dep)])
342 webcore.find_sources_in_dirs(full_dirs, excludes = excludes, exts=['.c', '.cpp'])
346 if build_port == "wx":
347 bld.add_subdirs(['Tools/DumpRenderTree', 'Tools/wx/browser', 'Source/WebKit/wx/bindings/python'])