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