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