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 28import Options 29 30from settings import * 31import wxpresets 32 33import TaskGen 34from TaskGen import taskgen, feature, after 35import Task, ccroot 36 37def 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 58def 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 80def set_options(opt): 81 common_set_options(opt) 82 83def 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 110def 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/LocalizedNumberNone.cpp' 150 ] 151 152 if building_on_win32: 153 # make sure platform/wx comes after this so we get the right 154 # FontPlatformData.h 155 webcore_dirs.extend(['Source/WebCore/platform/wx/wxcode/win', 'Source/WebCore/plugins/win']) 156 webcore_sources['wx-win'] = [ 157 'Source/WebCore/platform/graphics/win/GlyphPageTreeNodeCairoWin.cpp', 158 'Source/WebCore/platform/graphics/win/TransformationMatrixWin.cpp', 159 'Source/WebCore/platform/ScrollAnimatorWin.cpp', 160 # wxTimer on Windows has a bug that causes it to eat crashes in callbacks 161 # so we need to use the Win port's implementation until the wx bug fix is 162 # widely available (it was fixed in 2.8.10). 163 'Source/WebCore/platform/win/SharedTimerWin.cpp', 164 'Source/WebCore/platform/win/WebCoreInstanceHandle.cpp', 165 # Use the Windows plugin architecture 166 #'Source/WebCore/plugins/win/PluginDataWin.cpp', 167 'Source/WebCore/plugins/win/PluginDatabaseWin.cpp', 168 'Source/WebCore/plugins/win/PluginMessageThrottlerWin.cpp', 169 'Source/WebCore/plugins/win/PluginPackageWin.cpp', 170 'Source/WebCore/plugins/win/PluginViewWin.cpp', 171 ] 172 elif sys.platform.startswith('darwin'): 173 webcore_dirs.append('Source/WebCore/plugins/mac') 174 webcore_dirs.append('Source/WebCore/platform/wx/wxcode/mac/carbon') 175 webcore_dirs.append('Source/WebCore/platform/mac') 176 webcore_dirs.append('Source/WebCore/platform/text/mac') 177 webcore_sources['wx-mac'] = [ 178 'Source/WebCore/platform/mac/PurgeableBufferMac.cpp', 179 'Source/WebCore/platform/mac/WebCoreNSStringExtras.mm', 180 'Source/WebCore/platform/mac/WebCoreSystemInterface.mm', 181 'Source/WebCore/platform/graphics/cg/FloatSizeCG.cpp', 182 'Source/WebCore/platform/graphics/mac/ComplexTextController.cpp', 183 'Source/WebCore/platform/graphics/mac/ComplexTextControllerCoreText.cpp', 184 'Source/WebCore/platform/graphics/mac/ComplexTextControllerATSUI.cpp', 185 'Source/WebCore/platform/graphics/mac/GlyphPageTreeNodeMac.cpp', 186 'Source/WebCore/platform/graphics/mac/SimpleFontDataATSUI.mm', 187 'Source/WebCore/platform/graphics/mac/SimpleFontDataCoreText.cpp', 188 'Source/WebCore/platform/graphics/wx/FontPlatformDataWxMac.mm', 189 'Source/WebCore/platform/text/mac/ShapeArabic.c', 190 'Source/WebCore/platform/wx/wxcode/mac/carbon/fontprops.mm', 191 'Source/WebCore/plugins/mac/PluginPackageMac.cpp', 192 'Source/WebCore/plugins/mac/PluginViewMac.mm' 193 ] 194 else: 195 webcore_sources['wx-gtk'] = [ 196 'Source/WebCore/plugins/PluginViewNone.cpp', 197 'Source/WebCore/plugins/PluginPackageNone.cpp' 198 ] 199 webcore_dirs.append('Source/WebCore/platform/wx/wxcode/gtk') 200 201 202 import TaskGen 203 204 # FIXME: Does this need to be Source/JavaScriptCore? 205 bld.add_subdirs('Source/JavaScriptCore') 206 207 if sys.platform.startswith('darwin'): 208 TaskGen.task_gen.mappings['.mm'] = TaskGen.task_gen.mappings['.cxx'] 209 TaskGen.task_gen.mappings['.m'] = TaskGen.task_gen.mappings['.cxx'] 210 211 features = [Options.options.port.lower()] 212 exclude_patterns = ['*AllInOne.cpp', '*Brew.cpp', '*CFNet.cpp', '*Chromium*.cpp', 213 '*Efl.cpp', '*Gtk.cpp', '*Haiku.cpp', '*Mac.cpp', '*None.cpp', '*Qt.cpp', '*Safari.cpp', 214 'test*bindings.*', '*WinCE.cpp', "WebDOMCanvas*.cpp", "WebDOMSVG*.cpp"] 215 if Options.options.port == 'wx': 216 features.append('curl') 217 exclude_patterns.append('*Win.cpp') 218 219 if sys.platform.startswith('darwin'): 220 features.append('cf') 221 222 else: 223 exclude_patterns.append('*CF.cpp') 224 225 full_dirs = get_dirs_for_features(wk_root, features=features, dirs=webcore_dirs) 226 227 jscore_dir = os.path.join(wk_root, 'Source', 'JavaScriptCore') 228 for item in os.listdir(jscore_dir): 229 fullpath = os.path.join(jscore_dir, item) 230 if os.path.isdir(fullpath) and not item == "os-win32" and not item == 'icu': 231 wk_includes.append(fullpath) 232 233 wk_includes.append('Source') 234 wk_includes.append(os.path.join(jscore_dir, 'collector', 'handles')) 235 wk_includes.append(os.path.join(jscore_dir, 'wtf', 'unicode')) 236 wk_includes.append(os.path.join(jscore_dir, 'wtf', 'unicode', 'icu')) 237 wk_includes += common_includes + full_dirs 238 if sys.platform.startswith('darwin'): 239 wk_includes.append(os.path.join(webcore_dir, 'icu')) 240 241 cxxflags = [] 242 if building_on_win32: 243 cxxflags.append('/FIWebCorePrefix.h') 244 # FIXME: We do this because in waf, local include dirs take precedence 245 # over global ones. This makes sense, but because unicode/utf8.h is both 246 # an ICU header name and a WebKit header name (in Source/JavaScriptCore/wtf) 247 # we have to make sure <unicode/utf8.h> picks up the ICU one first. 248 global msvclibs_dir 249 wk_includes.append(os.path.join(msvclibs_dir, 'include')) 250 else: 251 cxxflags.extend(['-include', 'WebCorePrefix.h']) 252 253 webcore = bld.new_task_gen( 254 features = 'cc cxx cshlib', 255 includes = ' '.join(wk_includes), 256 source = ' '.join(flattenSources(webcore_sources.values())), 257 cxxflags = cxxflags, 258 defines = ['WXMAKINGDLL_WEBKIT', 'BUILDING_WebCore'], 259 libpath = [output_dir], 260 target = 'wxwebkit', 261 uselib = 'WX ICU XML XSLT CURL SQLITE3 WKINTERFACE ' + get_config(), 262 uselib_local = 'jscore', 263 install_path = output_dir, 264 ) 265 266 excludes = [] 267 268 if Options.options.port == 'wx': 269 excludes = get_excludes(webcore_dir, exclude_patterns) 270 excludes.extend(['UserStyleSheetLoader.cpp', 'RenderMediaControls.cpp']) 271 272 # intermediate sources 273 excludes.append('DocTypeStrings.cpp') 274 excludes.append('HTMLEntityNames.cpp') 275 excludes.append('tokenizer.cpp') 276 277 # Qt specific file in common sources 278 excludes.append('ContextShadow.cpp') 279 280 # FIXME: these three require headers that I can't seem to find in trunk. 281 # Investigate how to resolve these issues. 282 excludes.append('JSAbstractView.cpp') 283 excludes.append('JSPositionCallback.cpp') 284 excludes.append('JSInspectorController.cpp') 285 286 # The bindings generator seems to think these are ref-counted, while they aren't in trunk. 287 excludes.append('JSElementTimeControl.cpp') 288 excludes.append('JSSVGAnimatedPathData.cpp') 289 excludes.append('JSSVGAnimatedPoints.cpp') 290 excludes.append('JSSVGExternalResourcesRequired.cpp') 291 excludes.append('JSSVGFilterPrimitiveStandardAttributes.cpp') 292 excludes.append('JSSVGLocatable.cpp') 293 excludes.append('JSSVGStyleTable.cpp') 294 excludes.append('JSSVGTests.cpp') 295 excludes.append('JSSVGStylable.cpp') 296 excludes.append('JSSVGZoomAndPan.cpp') 297 298 # These are files that expect methods not in the base C++ class, usually XYZAnimated methods. 299 excludes.append('JSSVGFitToViewBox.cpp') 300 excludes.append('JSSVGLangSpace.cpp') 301 excludes.append('JSSVGTransformable.cpp') 302 excludes.append('JSSVGURIReference.cpp') 303 304 # These are C++ DOM Bindings that won't compile because they look for things not in trunk. 305 excludes.append('WebDOMEventTarget.cpp') 306 excludes.append('WebDOMAbstractView.cpp') 307 excludes.append('WebDOMBlobBuilder.cpp') 308 excludes.append('WebDOMEventListenerCustom.cpp') 309 excludes.append('WebDOMElementTimeControl.cpp') 310 excludes.append('WebDOMImageData.cpp') 311 excludes.append('WebDOMInspectorBackend.cpp') 312 excludes.append('WebDOMScriptProfile.cpp') 313 excludes.append('WebDOMScriptProfileNode.cpp') 314 excludes.append('WebNativeEventListener.cpp') 315 316 # This file appears not to build with older versions of ICU 317 excludes.append('LocalizedNumberICU.cpp') 318 319 if building_on_win32: 320 excludes.append('SharedTimerWx.cpp') 321 excludes.append('RenderThemeWin.cpp') 322 excludes.append('KeyEventWin.cpp') 323 324 if building_on_win32 or sys.platform.startswith('darwin'): 325 excludes.append('GlyphMapWx.cpp') 326 excludes.append('AuthenticationCF.cpp') 327 excludes.append('LoaderRunLoopCF.cpp') 328 excludes.append('ResourceErrorCF.cpp') 329 330 # once we move over to the new FPD implementation, remove this. 331 excludes.append('FontPlatformData.cpp') 332 333 if sys.platform.startswith('darwin'): 334 webcore.includes += ' Source/WebKit/mac/WebCoreSupport WebCore/platform/mac' 335 webcore.source += ' Source/WebKit/mac/WebCoreSupport/WebSystemInterface.mm' 336 337 if building_on_win32: 338 for wxlib in bld.env['LIB_WX']: 339 wx_version = wxpresets.get_wx_version(os.environ['WXWIN']) 340 if int(wx_version[1]) % 2 == 1: 341 wxlib = wxlib.replace(''.join(wx_version[:2]), ''.join(wx_version)) 342 wxlibname = os.path.join(bld.env['LIBPATH_WX'][0], wxlib + '_vc.dll') 343 print "Copying %s" % wxlibname 344 if os.path.exists(wxlibname): 345 bld.install_files(webcore.install_path, [wxlibname]) 346 347 for dep in windows_deps: 348 bld.install_files(webcore.install_path, [os.path.join(msvclibs_dir, dep)]) 349 350 webcore.find_sources_in_dirs(full_dirs, excludes = excludes, exts=['.c', '.cpp']) 351 352 bld.add_group() 353 354 if Options.options.port == "wx": 355 bld.add_subdirs(['Tools/DumpRenderTree', 'Tools/wx/browser', 'Source/WebKit/wx/bindings/python']) 356