[wx] Unreviewed build fix, make sure the waf build checks the webKitBranchBuild
[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/testing',
157     'Source/WebCore/websockets',
158     'Source/WebCore/xml',
159 ]
160
161 config = get_config(wk_root)
162 arch = get_arch(wk_root)
163 config_dir = config
164
165 output_dir = os.path.join(get_base_product_dir(wk_root), config_dir)
166
167 building_on_win32 = sys.platform.startswith('win')
168
169 default_port = 'Mac'
170 if building_on_win32:
171     deafult_port = "Win"
172
173 build_port = default_port
174
175
176 def get_config():
177     waf_configname = config.upper().strip()
178     if building_on_win32:
179         isReleaseCRT = (config == 'Release')
180         if build_port == 'wx':
181             if Options.options.wxpython:
182                 isReleaseCRT = True
183
184         if isReleaseCRT:
185             waf_configname = waf_configname + ' CRT_MULTITHREADED_DLL'
186         else:
187             waf_configname = waf_configname + ' CRT_MULTITHREADED_DLL_DBG'
188
189     return waf_configname
190
191 create_hash_table = wk_root + "/Source/JavaScriptCore/create_hash_table"
192 if building_on_win32:
193     create_hash_table = get_output('cygpath --unix "%s"' % create_hash_table)
194 os.environ['CREATE_HASH_TABLE'] = create_hash_table
195
196 feature_defines = []
197
198 msvc_version = 'msvc2008'
199
200 msvclibs_dir = os.path.join(wklibs_dir, msvc_version, 'win')
201
202
203 def get_path_to_wxconfig():
204     if 'WX_CONFIG' in os.environ:
205         return os.environ['WX_CONFIG']
206     else:
207         return 'wx-config'
208
209
210 def common_set_options(opt):
211     """
212     Initialize common options provided to the user.
213     """
214     opt.tool_options('compiler_cxx')
215     opt.tool_options('compiler_cc')
216     opt.tool_options('python')
217
218     opt.add_option('--port', action='store', default=default_port, help='Which WebKit port to build.')
219     opt.add_option('--wxpython', action='store_true', default=False, help='Create the wxPython bindings.')
220     opt.add_option('--wx-compiler-prefix', action='store', default='vc',
221                    help='Specify a different compiler prefix (do this if you used COMPILER_PREFIX when building wx itself)')
222     opt.add_option('--macosx-version', action='store', default='', help="Version of OS X to build for.")
223     opt.add_option('--msvc-version', action='store', default='', help="MSVC version to use to build. Use 8 for 2005, 9 for 2008")
224     opt.add_option('--mac_universal_binary', action='store_true', default=False, help='Build Mac as universal (i386, x86_64, ppc) binary.')
225     opt.add_option('--mac_archs', action='store', default='', help='Comma separated list of architectures (i386, x86_64, ppc) to build on Mac.')
226
227 def common_configure(conf):
228     """
229     Configuration used by all targets, called from the target's configure() step.
230     """
231
232     conf.env['MSVC_TARGETS'] = ['x86']
233
234     build_port = Options.options.port
235
236     feature_defines = ['ENABLE_DATABASE', 'ENABLE_XSLT', 'ENABLE_JAVASCRIPT_DEBUGGER',
237                     'ENABLE_SVG', 'ENABLE_SVG_USE', 'ENABLE_FILTERS', 'ENABLE_SVG_FONTS',
238                     'ENABLE_SVG_ANIMATION', 'ENABLE_SVG_AS_IMAGE', 'ENABLE_SVG_FOREIGN_OBJECT',
239                     'ENABLE_DOM_STORAGE', 'BUILDING_%s' % build_port.upper()]
240
241     conf.env["FEATURE_DEFINES"] = ' '.join(feature_defines)
242
243     if Options.options.msvc_version and Options.options.msvc_version != '':
244         conf.env['MSVC_VERSIONS'] = ['msvc %s.0' % Options.options.msvc_version]
245     else:
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         archs = []
348         
349         if Options.options.mac_archs != '':
350             arch_list = Options.options.mac_archs.replace("'", '').replace('"', '').split(",")
351             for arch in arch_list:
352                 if arch.strip() != '':
353                     archs.append(arch.strip())
354         elif Options.options.mac_universal_binary:
355             archs = ['i386', 'x86_64', 'ppc']
356         else:
357             is_cocoa = "__WXOSX_COCOA__" in conf.env["CXXDEFINES_WX"]
358             if min_version == "10.4" or not is_cocoa:
359                 archs = ["i386"]
360             else:
361                 global arch
362                 archs = [arch]
363
364         sdkroot = '/Developer/SDKs/MacOSX%s.sdk' % sdk_version
365         sdkflags = ['-isysroot', sdkroot]
366         for arch in archs:
367             sdkflags.extend(['-arch', arch])
368
369         conf.env.append_value('CPPFLAGS', sdkflags)
370         conf.env.append_value('LINKFLAGS', sdkflags)
371
372         conf.env.append_value('LINKFLAGS', ['-framework', 'Security'])
373
374         conf.env.append_value('CPPPATH_SQLITE3', [os.path.join(wklibs_dir, 'WebCoreSQLite3')])
375         conf.env.append_value('LIB_SQLITE3', ['WebCoreSQLite3'])
376
377     # NOTE: The order here is important, because python sets the MACOSX_DEPLOYMENT_TARGET to
378     # 10.3 even on intel. So we must first set the SDK and arch flags, then load Python's config,
379     # and finally override the value Python set for MACOSX_DEPLOYMENT_TARGET
380     if Options.options.wxpython:
381         conf.check_tool('python')
382         conf.check_python_headers()
383
384     if sys.platform.startswith('darwin'):
385         os.environ[mac_target] = conf.env[mac_target] = min_version
386
387     conf.env.append_value('CXXDEFINES', feature_defines)
388     if config == 'Release':
389         conf.env.append_value('CPPDEFINES', 'NDEBUG')
390
391     if building_on_win32:
392         conf.env.append_value('CPPPATH', [
393             os.path.join(jscore_dir, 'os-win32'),
394             os.path.join(msvclibs_dir, 'include'),
395             os.path.join(msvclibs_dir, 'include', 'pthreads'),
396             os.path.join(msvclibs_dir, 'lib'),
397             ])
398
399         conf.env.append_value('LIB', ['libpng', 'libjpeg', 'pthreadVC2'])
400         # common win libs
401         conf.env.append_value('LIB', [
402             'kernel32', 'user32', 'gdi32', 'comdlg32', 'winspool', 'winmm',
403             'shell32', 'shlwapi', 'comctl32', 'ole32', 'oleaut32', 'uuid', 'advapi32',
404             'wsock32', 'gdiplus', 'usp10', 'version'])
405
406         conf.env['LIB_ICU'] = ['icudt', 'icule', 'iculx', 'icuuc', 'icuin', 'icuio', 'icutu']
407
408         #curl
409         conf.env['LIB_CURL'] = ['libcurl']
410
411         #sqlite3
412         conf.env['CPPPATH_SQLITE3'] = [os.path.join(msvclibs_dir, 'include', 'SQLite')]
413         conf.env['LIB_SQLITE3'] = ['sqlite3']
414
415         #libxml2
416         conf.env['LIB_XML'] = ['libxml2']
417
418         #libxslt
419         conf.env['LIB_XSLT'] = ['libxslt']
420     else:
421         if build_port == 'wx':
422             port_uses['wx'].append('PTHREADS')
423             conf.env.append_value('LIB', ['jpeg', 'png', 'pthread'])
424             conf.env.append_value('LIBPATH', os.path.join(wklibs_dir, 'unix', 'lib'))
425             conf.env.append_value('CPPPATH', os.path.join(wklibs_dir, 'unix', 'include'))
426             conf.env.append_value('CXXFLAGS', ['-fPIC', '-DPIC'])
427
428         conf.check_cfg(msg='Checking for libxslt', path='xslt-config', args='--cflags --libs', package='', uselib_store='XSLT', mandatory=True)
429         conf.check_cfg(path='xml2-config', args='--cflags --libs', package='', uselib_store='XML', mandatory=True)
430         if sys.platform.startswith('darwin') and min_version and min_version == '10.4':
431             conf.check_cfg(path=os.path.join(wklibs_dir, 'unix', 'bin', 'curl-config'), args='--cflags --libs', package='', uselib_store='CURL', mandatory=True)
432         else:
433             conf.check_cfg(path='curl-config', args='--cflags --libs', package='', uselib_store='CURL', mandatory=True)
434
435         if not sys.platform.startswith('darwin'):
436             conf.check_cfg(package='cairo', args='--cflags --libs', uselib_store='WX', mandatory=True)
437             conf.check_cfg(package='pango', args='--cflags --libs', uselib_store='WX', mandatory=True)
438             conf.check_cfg(package='gtk+-2.0', args='--cflags --libs', uselib_store='WX', mandatory=True)
439             conf.check_cfg(package='sqlite3', args='--cflags --libs', uselib_store='SQLITE3', mandatory=True)
440             conf.check_cfg(path='icu-config', args='--cflags --ldflags', package='', uselib_store='ICU', mandatory=True)
441
442     if build_port in port_uses:
443         for use in port_uses[build_port]:
444             conf.env.append_value('CXXDEFINES', ['WTF_USE_%s' % use])