[wx] Unreviewed build fix. Restore the PPC build and allow users to specify architect...
[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 + git_branch_name()
164
165 output_dir = os.path.join(wk_root, 'WebKitBuild', 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
228 def common_configure(conf):
229     """
230     Configuration used by all targets, called from the target's configure() step.
231     """
232
233     conf.env['MSVC_TARGETS'] = ['x86']
234
235     build_port = Options.options.port
236
237     feature_defines = ['ENABLE_DATABASE', 'ENABLE_XSLT', 'ENABLE_JAVASCRIPT_DEBUGGER',
238                     'ENABLE_SVG', 'ENABLE_SVG_USE', 'ENABLE_FILTERS', 'ENABLE_SVG_FONTS',
239                     'ENABLE_SVG_ANIMATION', 'ENABLE_SVG_AS_IMAGE', 'ENABLE_SVG_FOREIGN_OBJECT',
240                     'ENABLE_DOM_STORAGE', 'BUILDING_%s' % build_port.upper()]
241
242     conf.env["FEATURE_DEFINES"] = ' '.join(feature_defines)
243
244     if Options.options.msvc_version and Options.options.msvc_version != '':
245         conf.env['MSVC_VERSIONS'] = ['msvc %s.0' % Options.options.msvc_version]
246     else:
247         conf.env['MSVC_VERSIONS'] = ['msvc 9.0', 'msvc 8.0']
248
249     if sys.platform.startswith('cygwin'):
250         print "ERROR: You must use the Win32 Python from python.org, not Cygwin Python, when building on Windows."
251         sys.exit(1)
252
253     conf.check_tool('compiler_cxx')
254     conf.check_tool('compiler_cc')
255
256     if sys.platform.startswith('darwin'):
257         conf.check_tool('osx')
258
259     global msvc_version
260     global msvclibs_dir
261
262     libprefix = ''
263
264     if building_on_win32:
265         libprefix = 'lib'
266
267         found = conf.get_msvc_versions()
268         found_versions = []
269         for version in found:
270             found_versions.append(version[0])
271
272         if 'msvc 9.0' in conf.env['MSVC_VERSIONS'] and 'msvc 9.0' in found_versions:
273             msvc_version = 'msvc2008'
274         elif 'msvc 8.0' in conf.env['MSVC_VERSIONS'] and 'msvc 8.0' in found_versions:
275             msvc_version = 'msvc2005'
276
277         msvclibs_dir = os.path.join(wklibs_dir, msvc_version, 'win')
278
279         # Disable several warnings which occur many times during the build.
280         # Some of them are harmless (4099, 4344, 4396, 4800) and working around
281         # them in WebKit code is probably just not worth it. We can simply do
282         # nothing about the others (4503). A couple are possibly valid but
283         # there are just too many of them in the code so fixing them is
284         # impossible in practice and just results in tons of distracting output
285         # (4244, 4291). Finally 4996 is actively harmful as it is given for
286         # just about any use of standard C/C++ library facilities.
287         conf.env.append_value('CXXFLAGS', [
288             '/wd4099',  # type name first seen using 'struct' now seen using 'class'
289             '/wd4244',  # conversion from 'xxx' to 'yyy', possible loss of data:
290             '/wd4291',  # no matching operator delete found (for placement new)
291             '/wd4344',  # behaviour change in template deduction
292             '/wd4396',  # inline can't be used in friend declaration
293             '/wd4503',  # decorated name length exceeded, name was truncated
294             '/wd4800',  # forcing value to bool 'true' or 'false'
295             '/wd4996',  # deprecated function
296         ])
297
298         # This one also occurs in C code, so disable it there as well.
299         conf.env.append_value('CCFLAGS', ['/wd4996'])
300
301     if build_port == "wx":
302         update_wx_deps(conf, wk_root, msvc_version)
303
304         conf.env.append_value('CXXDEFINES', ['BUILDING_WX__=1', 'JS_NO_EXPORT'])
305
306         if building_on_win32:
307             conf.env.append_value('LIBPATH', os.path.join(msvclibs_dir, 'lib'))
308             # wx settings
309             global config
310             is_debug = (config == 'Debug')
311             wxdefines, wxincludes, wxlibs, wxlibpaths = get_wxmsw_settings(wx_root, shared=True, unicode=True, debug=is_debug, wxPython=Options.options.wxpython)
312             conf.env['CXXDEFINES_WX'] = wxdefines
313             conf.env['CPPPATH_WX'] = wxincludes
314             conf.env['LIB_WX'] = wxlibs
315             conf.env['LIBPATH_WX'] = wxlibpaths
316         else:
317             conf.check_cfg(path=get_path_to_wxconfig(), args='--cxxflags --libs', package='', uselib_store='WX', mandatory=True)
318
319     if sys.platform.startswith('darwin'):
320         conf.env['LIB_ICU'] = ['icucore']
321
322         conf.env.append_value('CPPPATH', wklibs_dir)
323         conf.env.append_value('LIBPATH', wklibs_dir)
324
325         min_version = None
326
327         mac_target = 'MACOSX_DEPLOYMENT_TARGET'
328         if Options.options.macosx_version != '':
329             min_version = Options.options.macosx_version
330
331         # WebKit only supports 10.4+, but ppc systems often set this to earlier systems
332         if not min_version:
333             min_version = commands.getoutput('sw_vers -productVersion')[:4]
334             if min_version in ['10.1', '10.2', '10.3']:
335                 min_version = '10.4'
336
337         sdk_version = min_version
338         if min_version == "10.4":
339             sdk_version += "u"
340             conf.env.append_value('LIB_WKINTERFACE', ['WebKitSystemInterfaceTiger'])
341         else:
342             # NOTE: There is a WebKitSystemInterfaceSnowLeopard, but when we use that
343             # on 10.6, we get a strange missing symbol error, and this library seems to
344             # work fine for wx's purposes.
345             conf.env.append_value('LIB_WKINTERFACE', ['WebKitSystemInterfaceLeopard'])
346
347         # match WebKit Mac's default here unless we're building on platforms that won't support 64-bit.
348         archs = []
349         
350         if Options.options.mac_archs != '':
351             arch_list = Options.options.mac_archs.replace("'", '').replace('"', '').split(",")
352             for arch in arch_list:
353                 if arch.strip() != '':
354                     archs.append(arch.strip())
355         elif Options.options.mac_universal_binary:
356             archs = ['i386', 'x86_64', 'ppc']
357         else:
358             is_cocoa = "__WXOSX_COCOA__" in conf.env["CXXDEFINES_WX"]
359             if min_version == "10.4" or not is_cocoa:
360                 archs = ["i386"]
361             else:
362                 global arch
363                 archs = [arch]
364
365         sdkroot = '/Developer/SDKs/MacOSX%s.sdk' % sdk_version
366         sdkflags = ['-isysroot', sdkroot]
367         for arch in archs:
368             sdkflags.extend(['-arch', arch])
369
370         conf.env.append_value('CPPFLAGS', sdkflags)
371         conf.env.append_value('LINKFLAGS', sdkflags)
372
373         conf.env.append_value('LINKFLAGS', ['-framework', 'Security'])
374
375         conf.env.append_value('CPPPATH_SQLITE3', [os.path.join(wklibs_dir, 'WebCoreSQLite3')])
376         conf.env.append_value('LIB_SQLITE3', ['WebCoreSQLite3'])
377
378     # NOTE: The order here is important, because python sets the MACOSX_DEPLOYMENT_TARGET to
379     # 10.3 even on intel. So we must first set the SDK and arch flags, then load Python's config,
380     # and finally override the value Python set for MACOSX_DEPLOYMENT_TARGET
381     if Options.options.wxpython:
382         conf.check_tool('python')
383         conf.check_python_headers()
384
385     if sys.platform.startswith('darwin'):
386         os.environ[mac_target] = conf.env[mac_target] = min_version
387
388     conf.env.append_value('CXXDEFINES', feature_defines)
389     if config == 'Release':
390         conf.env.append_value('CPPDEFINES', 'NDEBUG')
391
392     if building_on_win32:
393         conf.env.append_value('CPPPATH', [
394             os.path.join(jscore_dir, 'os-win32'),
395             os.path.join(msvclibs_dir, 'include'),
396             os.path.join(msvclibs_dir, 'include', 'pthreads'),
397             os.path.join(msvclibs_dir, 'lib'),
398             ])
399
400         conf.env.append_value('LIB', ['libpng', 'libjpeg', 'pthreadVC2'])
401         # common win libs
402         conf.env.append_value('LIB', [
403             'kernel32', 'user32', 'gdi32', 'comdlg32', 'winspool', 'winmm',
404             'shell32', 'shlwapi', 'comctl32', 'ole32', 'oleaut32', 'uuid', 'advapi32',
405             'wsock32', 'gdiplus', 'usp10', 'version'])
406
407         conf.env['LIB_ICU'] = ['icudt', 'icule', 'iculx', 'icuuc', 'icuin', 'icuio', 'icutu']
408
409         #curl
410         conf.env['LIB_CURL'] = ['libcurl']
411
412         #sqlite3
413         conf.env['CPPPATH_SQLITE3'] = [os.path.join(msvclibs_dir, 'include', 'SQLite')]
414         conf.env['LIB_SQLITE3'] = ['sqlite3']
415
416         #libxml2
417         conf.env['LIB_XML'] = ['libxml2']
418
419         #libxslt
420         conf.env['LIB_XSLT'] = ['libxslt']
421     else:
422         if build_port == 'wx':
423             port_uses['wx'].append('PTHREADS')
424             conf.env.append_value('LIB', ['jpeg', 'png', 'pthread'])
425             conf.env.append_value('LIBPATH', os.path.join(wklibs_dir, 'unix', 'lib'))
426             conf.env.append_value('CPPPATH', os.path.join(wklibs_dir, 'unix', 'include'))
427             conf.env.append_value('CXXFLAGS', ['-fPIC', '-DPIC'])
428
429         conf.check_cfg(msg='Checking for libxslt', path='xslt-config', args='--cflags --libs', package='', uselib_store='XSLT', mandatory=True)
430         conf.check_cfg(path='xml2-config', args='--cflags --libs', package='', uselib_store='XML', mandatory=True)
431         if sys.platform.startswith('darwin') and min_version and min_version == '10.4':
432             conf.check_cfg(path=os.path.join(wklibs_dir, 'unix', 'bin', 'curl-config'), args='--cflags --libs', package='', uselib_store='CURL', mandatory=True)
433         else:
434             conf.check_cfg(path='curl-config', args='--cflags --libs', package='', uselib_store='CURL', mandatory=True)
435
436         if not sys.platform.startswith('darwin'):
437             conf.check_cfg(package='cairo', args='--cflags --libs', uselib_store='WX', mandatory=True)
438             conf.check_cfg(package='pango', args='--cflags --libs', uselib_store='WX', mandatory=True)
439             conf.check_cfg(package='gtk+-2.0', args='--cflags --libs', uselib_store='WX', mandatory=True)
440             conf.check_cfg(package='sqlite3', args='--cflags --libs', uselib_store='SQLITE3', mandatory=True)
441             conf.check_cfg(path='icu-config', args='--cflags --ldflags', package='', uselib_store='ICU', mandatory=True)
442
443     if build_port in port_uses:
444         for use in port_uses[build_port]:
445             conf.env.append_value('CXXDEFINES', ['WTF_USE_%s' % use])