[wx] Unreviewed build fixes for recent changes in WebKit trunk and wxMSW.
[WebKit-https.git] / Tools / waf / build / settings.py
1 # Copyright (C) 2009 Kevin Ollivier  All rights reserved.
2 #
3 # Redistribution and use in source and binary forms, with or without
4 # modification, are permitted provided that the following conditions
5 # are met:
6 # 1. Redistributions of source code must retain the above copyright
7 #    notice, this list of conditions and the following disclaimer.
8 # 2. Redistributions in binary form must reproduce the above copyright
9 #    notice, this list of conditions and the following disclaimer in the
10 #    documentation and/or other materials provided with the distribution.
11 #
12 # THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
13 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
14 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
15 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
16 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
17 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
18 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
19 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
20 # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
22 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 #
24 # Common elements of the waf build system shared by all projects.
25
26 import commands
27 import os
28 import platform
29 import re
30 import sys
31
32 import Options
33
34 from build_utils import *
35 from waf_extensions import *
36
37 # to be moved to wx when it supports more configs
38 from wxpresets import *
39
40 wk_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../..'))
41
42 if sys.platform.startswith('win'):
43     if not 'WXWIN' in os.environ:
44         print "Please set WXWIN to the directory containing wxWidgets."
45         sys.exit(1)
46
47     wx_root = os.environ['WXWIN']
48 else:
49     wx_root = commands.getoutput('wx-config --prefix')
50
51 jscore_dir = os.path.join(wk_root, 'Source', 'JavaScriptCore')
52 webcore_dir = os.path.join(wk_root, 'Source', 'WebCore')
53 wklibs_dir = os.path.join(wk_root, 'WebKitLibraries')
54
55 common_defines = []
56 common_cxxflags = []
57 common_includes = []
58 common_libs = []
59 common_libpaths = []
60 common_frameworks = []
61
62 ports = [
63     'Brew',
64     'Chromium',
65     'Gtk',
66     'Haiku',
67     'Mac',
68     'None',
69     'Qt',
70     'Safari',
71     'Win',
72     'Wince',
73     'wx',
74 ]
75
76 port_uses = {
77     'wx': ['CURL', 'WXGC'],
78 }
79
80 jscore_dirs = [
81     'API',
82     'bytecode',
83     'bytecompiler',
84     'debugger',
85     'DerivedSources',
86     'heap',
87     'interpreter',
88     'jit',
89     'parser',
90     'profiler',
91     'runtime',
92     'wtf',
93     'wtf/text',
94     'wtf/unicode',
95     'wtf/unicode/icu',
96     'yarr',
97 ]
98
99 webcore_dirs_common = [
100     'Source/WebCore/accessibility',
101     'Source/WebCore/bindings',
102     'Source/WebCore/bindings/cpp',
103     'Source/WebCore/bindings/generic',
104     'Source/WebCore/bindings/js',
105     'Source/WebCore/bridge',
106     'Source/WebCore/bridge/c',
107     'Source/WebCore/bridge/jsc',
108     'Source/WebCore/css',
109     'Source/WebCore/DerivedSources',
110     'Source/WebCore/dom',
111     'Source/WebCore/dom/default',
112     'Source/WebCore/editing',
113     'Source/WebCore/fileapi',
114     'Source/WebCore/history',
115     'Source/WebCore/html',
116     'Source/WebCore/html/canvas',
117     'Source/WebCore/html/parser',
118     'Source/WebCore/html/shadow',
119     'Source/WebCore/inspector',
120     'Source/WebCore/loader',
121     'Source/WebCore/loader/appcache',
122     'Source/WebCore/loader/archive',
123     'Source/WebCore/loader/cache',
124     'Source/WebCore/loader/icon',
125     'Source/WebCore/notifications',
126     'Source/WebCore/page',
127     'Source/WebCore/page/animation',
128     'Source/WebCore/platform',
129     'Source/WebCore/platform/animation',
130     'Source/WebCore/platform/graphics',
131     'Source/WebCore/platform/graphics/filters',
132     'Source/WebCore/platform/graphics/filters/arm',
133     'Source/WebCore/platform/graphics/transforms',
134     'Source/WebCore/platform/image-decoders',
135     'Source/WebCore/platform/image-decoders/bmp',
136     'Source/WebCore/platform/image-decoders/gif',
137     'Source/WebCore/platform/image-decoders/ico',
138     'Source/WebCore/platform/image-decoders/jpeg',
139     'Source/WebCore/platform/image-decoders/png',
140     'Source/WebCore/platform/image-decoders/webp',
141     'Source/WebCore/platform/mock',
142     'Source/WebCore/platform/network',
143     'Source/WebCore/platform/sql',
144     'Source/WebCore/platform/text',
145     'Source/WebCore/platform/text/transcoder',
146     'Source/WebCore/plugins',
147     'Source/WebCore/rendering',
148     'Source/WebCore/rendering/style',
149     'Source/WebCore/rendering/svg',
150     'Source/WebCore/storage',
151     'Source/WebCore/svg',
152     'Source/WebCore/svg/animation',
153     'Source/WebCore/svg/graphics',
154     'Source/WebCore/svg/graphics/filters',
155     'Source/WebCore/svg/properties',
156     'Source/WebCore/websockets',
157     'Source/WebCore/xml',
158 ]
159
160 config = get_config(wk_root)
161 arch = get_arch(wk_root)
162 config_dir = config + git_branch_name()
163
164 output_dir = os.path.join(wk_root, 'WebKitBuild', config_dir)
165
166 building_on_win32 = sys.platform.startswith('win')
167
168 default_port = 'Mac'
169 if building_on_win32:
170     deafult_port = "Win"
171
172 build_port = default_port
173
174
175 def get_config():
176     waf_configname = config.upper().strip()
177     if building_on_win32:
178         isReleaseCRT = (config == 'Release')
179         if build_port == 'wx':
180             if Options.options.wxpython:
181                 isReleaseCRT = True
182
183         if isReleaseCRT:
184             waf_configname = waf_configname + ' CRT_MULTITHREADED_DLL'
185         else:
186             waf_configname = waf_configname + ' CRT_MULTITHREADED_DLL_DBG'
187
188     return waf_configname
189
190 create_hash_table = wk_root + "/Source/JavaScriptCore/create_hash_table"
191 if building_on_win32:
192     create_hash_table = get_output('cygpath --unix "%s"' % create_hash_table)
193 os.environ['CREATE_HASH_TABLE'] = create_hash_table
194
195 feature_defines = []
196
197 msvc_version = 'msvc2008'
198
199 msvclibs_dir = os.path.join(wklibs_dir, msvc_version, 'win')
200
201
202 def get_path_to_wxconfig():
203     if 'WX_CONFIG' in os.environ:
204         return os.environ['WX_CONFIG']
205     else:
206         return 'wx-config'
207
208
209 def common_set_options(opt):
210     """
211     Initialize common options provided to the user.
212     """
213     opt.tool_options('compiler_cxx')
214     opt.tool_options('compiler_cc')
215     opt.tool_options('python')
216
217     opt.add_option('--port', action='store', default=default_port, help='Which WebKit port to build.')
218     opt.add_option('--wxpython', action='store_true', default=False, help='Create the wxPython bindings.')
219     opt.add_option('--wx-compiler-prefix', action='store', default='vc',
220                    help='Specify a different compiler prefix (do this if you used COMPILER_PREFIX when building wx itself)')
221     opt.add_option('--macosx-version', action='store', default='', help="Version of OS X to build for.")
222     opt.add_option('--msvc-version', action='store', default='', help="MSVC version to use to build. Use 8 for 2005, 9 for 2008")
223
224
225 def common_configure(conf):
226     """
227     Configuration used by all targets, called from the target's configure() step.
228     """
229
230     conf.env['MSVC_TARGETS'] = ['x86']
231
232     build_port = Options.options.port
233
234     feature_defines = ['ENABLE_DATABASE', 'ENABLE_XSLT', 'ENABLE_JAVASCRIPT_DEBUGGER',
235                     'ENABLE_SVG', 'ENABLE_SVG_USE', 'ENABLE_FILTERS', 'ENABLE_SVG_FONTS',
236                     'ENABLE_SVG_ANIMATION', 'ENABLE_SVG_AS_IMAGE', 'ENABLE_SVG_FOREIGN_OBJECT',
237                     'ENABLE_JIT', 'ENABLE_DOM_STORAGE', 'BUILDING_%s' % build_port.upper()]
238
239     conf.env["FEATURE_DEFINES"] = ' '.join(feature_defines)
240
241     if Options.options.msvc_version and Options.options.msvc_version != '':
242         print "msvc version = %s" % Options.options.msvc_version
243         conf.env['MSVC_VERSIONS'] = ['msvc %s.0' % Options.options.msvc_version]
244     else:
245         print "msvc not set!"
246         conf.env['MSVC_VERSIONS'] = ['msvc 9.0', 'msvc 8.0']
247
248     if sys.platform.startswith('cygwin'):
249         print "ERROR: You must use the Win32 Python from python.org, not Cygwin Python, when building on Windows."
250         sys.exit(1)
251
252     conf.check_tool('compiler_cxx')
253     conf.check_tool('compiler_cc')
254
255     if sys.platform.startswith('darwin'):
256         conf.check_tool('osx')
257
258     global msvc_version
259     global msvclibs_dir
260
261     libprefix = ''
262
263     if building_on_win32:
264         libprefix = 'lib'
265
266         found = conf.get_msvc_versions()
267         found_versions = []
268         for version in found:
269             found_versions.append(version[0])
270
271         if 'msvc 9.0' in conf.env['MSVC_VERSIONS'] and 'msvc 9.0' in found_versions:
272             msvc_version = 'msvc2008'
273         elif 'msvc 8.0' in conf.env['MSVC_VERSIONS'] and 'msvc 8.0' in found_versions:
274             msvc_version = 'msvc2005'
275
276         msvclibs_dir = os.path.join(wklibs_dir, msvc_version, 'win')
277
278         # Disable several warnings which occur many times during the build.
279         # Some of them are harmless (4099, 4344, 4396, 4800) and working around
280         # them in WebKit code is probably just not worth it. We can simply do
281         # nothing about the others (4503). A couple are possibly valid but
282         # there are just too many of them in the code so fixing them is
283         # impossible in practice and just results in tons of distracting output
284         # (4244, 4291). Finally 4996 is actively harmful as it is given for
285         # just about any use of standard C/C++ library facilities.
286         conf.env.append_value('CXXFLAGS', [
287             '/wd4099',  # type name first seen using 'struct' now seen using 'class'
288             '/wd4244',  # conversion from 'xxx' to 'yyy', possible loss of data:
289             '/wd4291',  # no matching operator delete found (for placement new)
290             '/wd4344',  # behaviour change in template deduction
291             '/wd4396',  # inline can't be used in friend declaration
292             '/wd4503',  # decorated name length exceeded, name was truncated
293             '/wd4800',  # forcing value to bool 'true' or 'false'
294             '/wd4996',  # deprecated function
295         ])
296
297         # This one also occurs in C code, so disable it there as well.
298         conf.env.append_value('CCFLAGS', ['/wd4996'])
299
300     if build_port == "wx":
301         update_wx_deps(conf, wk_root, msvc_version)
302
303         conf.env.append_value('CXXDEFINES', ['BUILDING_WX__=1', 'JS_NO_EXPORT'])
304
305         if building_on_win32:
306             conf.env.append_value('LIBPATH', os.path.join(msvclibs_dir, 'lib'))
307             # wx settings
308             global config
309             is_debug = (config == 'Debug')
310             wxdefines, wxincludes, wxlibs, wxlibpaths = get_wxmsw_settings(wx_root, shared=True, unicode=True, debug=is_debug, wxPython=Options.options.wxpython)
311             conf.env['CXXDEFINES_WX'] = wxdefines
312             conf.env['CPPPATH_WX'] = wxincludes
313             conf.env['LIB_WX'] = wxlibs
314             conf.env['LIBPATH_WX'] = wxlibpaths
315         else:
316             conf.check_cfg(path=get_path_to_wxconfig(), args='--cxxflags --libs', package='', uselib_store='WX', mandatory=True)
317
318     if sys.platform.startswith('darwin'):
319         conf.env['LIB_ICU'] = ['icucore']
320
321         conf.env.append_value('CPPPATH', wklibs_dir)
322         conf.env.append_value('LIBPATH', wklibs_dir)
323
324         min_version = None
325
326         mac_target = 'MACOSX_DEPLOYMENT_TARGET'
327         if Options.options.macosx_version != '':
328             min_version = Options.options.macosx_version
329
330         # WebKit only supports 10.4+, but ppc systems often set this to earlier systems
331         if not min_version:
332             min_version = commands.getoutput('sw_vers -productVersion')[:4]
333             if min_version in ['10.1', '10.2', '10.3']:
334                 min_version = '10.4'
335
336         sdk_version = min_version
337         if min_version == "10.4":
338             sdk_version += "u"
339             conf.env.append_value('LIB_WKINTERFACE', ['WebKitSystemInterfaceTiger'])
340         else:
341             # NOTE: There is a WebKitSystemInterfaceSnowLeopard, but when we use that
342             # on 10.6, we get a strange missing symbol error, and this library seems to
343             # work fine for wx's purposes.
344             conf.env.append_value('LIB_WKINTERFACE', ['WebKitSystemInterfaceLeopard'])
345
346         # match WebKit Mac's default here unless we're building on platforms that won't support 64-bit.
347         global arch
348         is_cocoa = "__WXOSX_COCOA__" in conf.env["CXXDEFINES_WX"]
349         if min_version == "10.4" or not is_cocoa:
350             arch = "i386"
351
352         sdkroot = '/Developer/SDKs/MacOSX%s.sdk' % sdk_version
353         sdkflags = ['-arch', arch, '-isysroot', sdkroot]
354
355         conf.env.append_value('CPPFLAGS', sdkflags)
356         conf.env.append_value('LINKFLAGS', sdkflags)
357
358         conf.env.append_value('LINKFLAGS', ['-framework', 'Security'])
359
360         conf.env.append_value('CPPPATH_SQLITE3', [os.path.join(wklibs_dir, 'WebCoreSQLite3')])
361         conf.env.append_value('LIB_SQLITE3', ['WebCoreSQLite3'])
362
363     # NOTE: The order here is important, because python sets the MACOSX_DEPLOYMENT_TARGET to
364     # 10.3 even on intel. So we must first set the SDK and arch flags, then load Python's config,
365     # and finally override the value Python set for MACOSX_DEPLOYMENT_TARGET
366     if Options.options.wxpython:
367         conf.check_tool('python')
368         conf.check_python_headers()
369
370     if sys.platform.startswith('darwin'):
371         os.environ[mac_target] = conf.env[mac_target] = min_version
372
373     conf.env.append_value('CXXDEFINES', feature_defines)
374     if config == 'Release':
375         conf.env.append_value('CPPDEFINES', 'NDEBUG')
376
377     if building_on_win32:
378         conf.env.append_value('CPPPATH', [
379             os.path.join(jscore_dir, 'os-win32'),
380             os.path.join(msvclibs_dir, 'include'),
381             os.path.join(msvclibs_dir, 'include', 'pthreads'),
382             os.path.join(msvclibs_dir, 'lib'),
383             ])
384
385         conf.env.append_value('LIB', ['libpng', 'libjpeg', 'pthreadVC2'])
386         # common win libs
387         conf.env.append_value('LIB', [
388             'kernel32', 'user32', 'gdi32', 'comdlg32', 'winspool', 'winmm',
389             'shell32', 'shlwapi', 'comctl32', 'ole32', 'oleaut32', 'uuid', 'advapi32',
390             'wsock32', 'gdiplus', 'usp10', 'version'])
391
392         conf.env['LIB_ICU'] = ['icudt', 'icule', 'iculx', 'icuuc', 'icuin', 'icuio', 'icutu']
393
394         #curl
395         conf.env['LIB_CURL'] = ['libcurl']
396
397         #sqlite3
398         conf.env['CPPPATH_SQLITE3'] = [os.path.join(msvclibs_dir, 'include', 'SQLite')]
399         conf.env['LIB_SQLITE3'] = ['sqlite3']
400
401         #libxml2
402         conf.env['LIB_XML'] = ['libxml2']
403
404         #libxslt
405         conf.env['LIB_XSLT'] = ['libxslt']
406     else:
407         if build_port == 'wx':
408             port_uses['wx'].append('PTHREADS')
409             conf.env.append_value('LIB', ['jpeg', 'png', 'pthread'])
410             conf.env.append_value('LIBPATH', os.path.join(wklibs_dir, 'unix', 'lib'))
411             conf.env.append_value('CPPPATH', os.path.join(wklibs_dir, 'unix', 'include'))
412             conf.env.append_value('CXXFLAGS', ['-fPIC', '-DPIC'])
413
414         conf.check_cfg(msg='Checking for libxslt', path='xslt-config', args='--cflags --libs', package='', uselib_store='XSLT', mandatory=True)
415         conf.check_cfg(path='xml2-config', args='--cflags --libs', package='', uselib_store='XML', mandatory=True)
416         if sys.platform.startswith('darwin') and min_version and min_version == '10.4':
417             conf.check_cfg(path=os.path.join(wklibs_dir, 'unix', 'bin', 'curl-config'), args='--cflags --libs', package='', uselib_store='CURL', mandatory=True)
418         else:
419             conf.check_cfg(path='curl-config', args='--cflags --libs', package='', uselib_store='CURL', mandatory=True)
420
421         if not sys.platform.startswith('darwin'):
422             conf.check_cfg(package='cairo', args='--cflags --libs', uselib_store='WX', mandatory=True)
423             conf.check_cfg(package='pango', args='--cflags --libs', uselib_store='WX', mandatory=True)
424             conf.check_cfg(package='gtk+-2.0', args='--cflags --libs', uselib_store='WX', mandatory=True)
425             conf.check_cfg(package='sqlite3', args='--cflags --libs', uselib_store='SQLITE3', mandatory=True)
426             conf.check_cfg(path='icu-config', args='--cflags --ldflags', package='', uselib_store='ICU', mandatory=True)
427
428     if build_port in port_uses:
429         for use in port_uses[build_port]:
430             conf.env.append_value('CXXDEFINES', ['WTF_USE_%s' % use])