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