Rubberstamped by Eric Seidel.
[WebKit.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/transforms',
133     'Source/WebCore/platform/image-decoders',
134     'Source/WebCore/platform/image-decoders/bmp',
135     'Source/WebCore/platform/image-decoders/gif',
136     'Source/WebCore/platform/image-decoders/ico',
137     'Source/WebCore/platform/image-decoders/jpeg',
138     'Source/WebCore/platform/image-decoders/png',
139     'Source/WebCore/platform/image-decoders/webp',
140     'Source/WebCore/platform/mock',
141     'Source/WebCore/platform/network',
142     'Source/WebCore/platform/sql',
143     'Source/WebCore/platform/text',
144     'Source/WebCore/platform/text/transcoder',
145     'Source/WebCore/plugins',
146     'Source/WebCore/rendering',
147     'Source/WebCore/rendering/style',
148     'Source/WebCore/rendering/svg',
149     'Source/WebCore/storage',
150     'Source/WebCore/svg',
151     'Source/WebCore/svg/animation',
152     'Source/WebCore/svg/graphics',
153     'Source/WebCore/svg/graphics/filters',
154     'Source/WebCore/svg/properties',
155     'Source/WebCore/websockets',
156     'Source/WebCore/xml',
157 ]
158
159 config = get_config(wk_root)
160 arch = get_arch(wk_root)
161 config_dir = config + git_branch_name()
162
163 output_dir = os.path.join(wk_root, 'WebKitBuild', config_dir)
164
165 building_on_win32 = sys.platform.startswith('win')
166
167 default_port = 'Mac'
168 if building_on_win32:
169     deafult_port = "Win"
170
171 build_port = default_port
172
173
174 def get_config():
175     waf_configname = config.upper().strip()
176     if building_on_win32:
177         isReleaseCRT = (config == 'Release')
178         if build_port == 'wx':
179             if Options.options.wxpython:
180                 isReleaseCRT = True
181
182         if isReleaseCRT:
183             waf_configname = waf_configname + ' CRT_MULTITHREADED_DLL'
184         else:
185             waf_configname = waf_configname + ' CRT_MULTITHREADED_DLL_DBG'
186
187     return waf_configname
188
189 create_hash_table = wk_root + "/Source/JavaScriptCore/create_hash_table"
190 if building_on_win32:
191     create_hash_table = get_output('cygpath --unix "%s"' % create_hash_table)
192 os.environ['CREATE_HASH_TABLE'] = create_hash_table
193
194 feature_defines = []
195
196 msvc_version = 'msvc2008'
197
198 msvclibs_dir = os.path.join(wklibs_dir, msvc_version, 'win')
199
200
201 def get_path_to_wxconfig():
202     if 'WX_CONFIG' in os.environ:
203         return os.environ['WX_CONFIG']
204     else:
205         return 'wx-config'
206
207
208 def common_set_options(opt):
209     """
210     Initialize common options provided to the user.
211     """
212     opt.tool_options('compiler_cxx')
213     opt.tool_options('compiler_cc')
214     opt.tool_options('python')
215
216     opt.add_option('--port', action='store', default=default_port, help='Which WebKit port to build.')
217     opt.add_option('--wxpython', action='store_true', default=False, help='Create the wxPython bindings.')
218     opt.add_option('--wx-compiler-prefix', action='store', default='vc',
219                    help='Specify a different compiler prefix (do this if you used COMPILER_PREFIX when building wx itself)')
220     opt.add_option('--macosx-version', action='store', default='', help="Version of OS X to build for.")
221     opt.add_option('--msvc-version', action='store', default='', help="MSVC version to use to build. Use 8 for 2005, 9 for 2008")
222
223
224 def common_configure(conf):
225     """
226     Configuration used by all targets, called from the target's configure() step.
227     """
228
229     conf.env['MSVC_TARGETS'] = ['x86']
230
231     build_port = Options.options.port
232
233     feature_defines = ['ENABLE_DATABASE', 'ENABLE_XSLT', 'ENABLE_JAVASCRIPT_DEBUGGER',
234                     'ENABLE_SVG', 'ENABLE_SVG_USE', 'ENABLE_FILTERS', 'ENABLE_SVG_FONTS',
235                     'ENABLE_SVG_ANIMATION', 'ENABLE_SVG_AS_IMAGE', 'ENABLE_SVG_FOREIGN_OBJECT',
236                     'ENABLE_JIT', 'ENABLE_DOM_STORAGE', 'BUILDING_%s' % build_port.upper()]
237
238     conf.env["FEATURE_DEFINES"] = ' '.join(feature_defines)
239
240     if Options.options.msvc_version and Options.options.msvc_version != '':
241         print "msvc version = %s" % Options.options.msvc_version
242         conf.env['MSVC_VERSIONS'] = ['msvc %s.0' % Options.options.msvc_version]
243     else:
244         print "msvc not set!"
245         conf.env['MSVC_VERSIONS'] = ['msvc 9.0', 'msvc 8.0']
246
247     if sys.platform.startswith('cygwin'):
248         print "ERROR: You must use the Win32 Python from python.org, not Cygwin Python, when building on Windows."
249         sys.exit(1)
250
251     conf.check_tool('compiler_cxx')
252     conf.check_tool('compiler_cc')
253
254     if sys.platform.startswith('darwin'):
255         conf.check_tool('osx')
256
257     global msvc_version
258     global msvclibs_dir
259
260     libprefix = ''
261
262     if building_on_win32:
263         libprefix = 'lib'
264
265         found = conf.get_msvc_versions()
266         found_versions = []
267         for version in found:
268             found_versions.append(version[0])
269
270         if 'msvc 9.0' in conf.env['MSVC_VERSIONS'] and 'msvc 9.0' in found_versions:
271             msvc_version = 'msvc2008'
272         elif 'msvc 8.0' in conf.env['MSVC_VERSIONS'] and 'msvc 8.0' in found_versions:
273             msvc_version = 'msvc2005'
274
275         msvclibs_dir = os.path.join(wklibs_dir, msvc_version, 'win')
276
277         # Disable several warnings which occur many times during the build.
278         # Some of them are harmless (4099, 4344, 4396, 4800) and working around
279         # them in WebKit code is probably just not worth it. We can simply do
280         # nothing about the others (4503). A couple are possibly valid but
281         # there are just too many of them in the code so fixing them is
282         # impossible in practice and just results in tons of distracting output
283         # (4244, 4291). Finally 4996 is actively harmful as it is given for
284         # just about any use of standard C/C++ library facilities.
285         conf.env.append_value('CXXFLAGS', [
286             '/wd4099',  # type name first seen using 'struct' now seen using 'class'
287             '/wd4244',  # conversion from 'xxx' to 'yyy', possible loss of data:
288             '/wd4291',  # no matching operator delete found (for placement new)
289             '/wd4344',  # behaviour change in template deduction
290             '/wd4396',  # inline can't be used in friend declaration
291             '/wd4503',  # decorated name length exceeded, name was truncated
292             '/wd4800',  # forcing value to bool 'true' or 'false'
293             '/wd4996',  # deprecated function
294         ])
295
296         # This one also occurs in C code, so disable it there as well.
297         conf.env.append_value('CCFLAGS', ['/wd4996'])
298
299     if build_port == "wx":
300         update_wx_deps(conf, wk_root, msvc_version)
301
302         conf.env.append_value('CXXDEFINES', ['BUILDING_WX__=1', 'JS_NO_EXPORT'])
303
304         if building_on_win32:
305             conf.env.append_value('LIBPATH', os.path.join(msvclibs_dir, 'lib'))
306             # wx settings
307             global config
308             is_debug = (config == 'Debug')
309             wxdefines, wxincludes, wxlibs, wxlibpaths = get_wxmsw_settings(wx_root, shared=True, unicode=True, debug=is_debug, wxPython=Options.options.wxpython)
310             conf.env['CXXDEFINES_WX'] = wxdefines
311             conf.env['CPPPATH_WX'] = wxincludes
312             conf.env['LIB_WX'] = wxlibs
313             conf.env['LIBPATH_WX'] = wxlibpaths
314         else:
315             conf.check_cfg(path=get_path_to_wxconfig(), args='--cxxflags --libs', package='', uselib_store='WX', mandatory=True)
316
317     if sys.platform.startswith('darwin'):
318         conf.env['LIB_ICU'] = ['icucore']
319
320         conf.env.append_value('CPPPATH', wklibs_dir)
321         conf.env.append_value('LIBPATH', wklibs_dir)
322
323         min_version = None
324
325         mac_target = 'MACOSX_DEPLOYMENT_TARGET'
326         if Options.options.macosx_version != '':
327             min_version = Options.options.macosx_version
328
329         # WebKit only supports 10.4+, but ppc systems often set this to earlier systems
330         if not min_version:
331             min_version = commands.getoutput('sw_vers -productVersion')[:4]
332             if min_version in ['10.1', '10.2', '10.3']:
333                 min_version = '10.4'
334
335         sdk_version = min_version
336         if min_version == "10.4":
337             sdk_version += "u"
338             conf.env.append_value('LIB_WKINTERFACE', ['WebKitSystemInterfaceTiger'])
339         else:
340             # NOTE: There is a WebKitSystemInterfaceSnowLeopard, but when we use that
341             # on 10.6, we get a strange missing symbol error, and this library seems to
342             # work fine for wx's purposes.
343             conf.env.append_value('LIB_WKINTERFACE', ['WebKitSystemInterfaceLeopard'])
344
345         # match WebKit Mac's default here unless we're building on platforms that won't support 64-bit.
346         global arch
347         is_cocoa = "__WXOSX_COCOA__" in conf.env["CXXDEFINES_WX"]
348         if min_version == "10.4" or not is_cocoa:
349             arch = "i386"
350
351         sdkroot = '/Developer/SDKs/MacOSX%s.sdk' % sdk_version
352         sdkflags = ['-arch', arch, '-isysroot', sdkroot]
353
354         conf.env.append_value('CPPFLAGS', sdkflags)
355         conf.env.append_value('LINKFLAGS', sdkflags)
356
357         conf.env.append_value('LINKFLAGS', ['-framework', 'Security'])
358
359         conf.env.append_value('CPPPATH_SQLITE3', [os.path.join(wklibs_dir, 'WebCoreSQLite3')])
360         conf.env.append_value('LIB_SQLITE3', ['WebCoreSQLite3'])
361
362     # NOTE: The order here is important, because python sets the MACOSX_DEPLOYMENT_TARGET to
363     # 10.3 even on intel. So we must first set the SDK and arch flags, then load Python's config,
364     # and finally override the value Python set for MACOSX_DEPLOYMENT_TARGET
365     if Options.options.wxpython:
366         conf.check_tool('python')
367         conf.check_python_headers()
368
369     if sys.platform.startswith('darwin'):
370         os.environ[mac_target] = conf.env[mac_target] = min_version
371
372     conf.env.append_value('CXXDEFINES', feature_defines)
373     if config == 'Release':
374         conf.env.append_value('CPPDEFINES', 'NDEBUG')
375
376     if building_on_win32:
377         conf.env.append_value('CPPPATH', [
378             os.path.join(jscore_dir, 'os-win32'),
379             os.path.join(msvclibs_dir, 'include'),
380             os.path.join(msvclibs_dir, 'include', 'pthreads'),
381             os.path.join(msvclibs_dir, 'lib'),
382             ])
383
384         conf.env.append_value('LIB', ['libpng', 'libjpeg', 'pthreadVC2'])
385         # common win libs
386         conf.env.append_value('LIB', [
387             'kernel32', 'user32', 'gdi32', 'comdlg32', 'winspool', 'winmm',
388             'shell32', 'shlwapi', 'comctl32', 'ole32', 'oleaut32', 'uuid', 'advapi32',
389             'wsock32', 'gdiplus', 'usp10', 'version'])
390
391         conf.env['LIB_ICU'] = ['icudt', 'icule', 'iculx', 'icuuc', 'icuin', 'icuio', 'icutu']
392
393         #curl
394         conf.env['LIB_CURL'] = ['libcurl']
395
396         #sqlite3
397         conf.env['CPPPATH_SQLITE3'] = [os.path.join(msvclibs_dir, 'include', 'SQLite')]
398         conf.env['LIB_SQLITE3'] = ['sqlite3']
399
400         #libxml2
401         conf.env['LIB_XML'] = ['libxml2']
402
403         #libxslt
404         conf.env['LIB_XSLT'] = ['libxslt']
405     else:
406         if build_port == 'wx':
407             port_uses['wx'].append('PTHREADS')
408             conf.env.append_value('LIB', ['jpeg', 'png', 'pthread'])
409             conf.env.append_value('LIBPATH', os.path.join(wklibs_dir, 'unix', 'lib'))
410             conf.env.append_value('CPPPATH', os.path.join(wklibs_dir, 'unix', 'include'))
411             conf.env.append_value('CXXFLAGS', ['-fPIC', '-DPIC'])
412
413         conf.check_cfg(msg='Checking for libxslt', path='xslt-config', args='--cflags --libs', package='', uselib_store='XSLT', mandatory=True)
414         conf.check_cfg(path='xml2-config', args='--cflags --libs', package='', uselib_store='XML', mandatory=True)
415         if sys.platform.startswith('darwin') and min_version and min_version == '10.4':
416             conf.check_cfg(path=os.path.join(wklibs_dir, 'unix', 'bin', 'curl-config'), args='--cflags --libs', package='', uselib_store='CURL', mandatory=True)
417         else:
418             conf.check_cfg(path='curl-config', args='--cflags --libs', package='', uselib_store='CURL', mandatory=True)
419
420         if not sys.platform.startswith('darwin'):
421             conf.check_cfg(package='cairo', args='--cflags --libs', uselib_store='WX', mandatory=True)
422             conf.check_cfg(package='pango', args='--cflags --libs', uselib_store='WX', mandatory=True)
423             conf.check_cfg(package='gtk+-2.0', args='--cflags --libs', uselib_store='WX', mandatory=True)
424             conf.check_cfg(package='sqlite3', args='--cflags --libs', uselib_store='SQLITE3', mandatory=True)
425             conf.check_cfg(path='icu-config', args='--cflags --ldflags', package='', uselib_store='ICU', mandatory=True)
426
427     if build_port in port_uses:
428         for use in port_uses[build_port]:
429             conf.env.append_value('CXXDEFINES', ['WTF_USE_%s' % use])