Reviewed by Kevin Ollivier.
[WebKit-https.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     'CF',
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','PTHREADS', '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/unicode',
94     'wtf/unicode/icu',
95 ]
96
97 webcore_dirs = [
98     'accessibility',
99     'bindings',
100     'bindings/js',
101     'bridge', 
102     'bridge/c', 
103     'css',
104     'DerivedSources',
105     'dom',
106     'dom/default',
107     'editing', 
108     'history', 
109     'html',
110     'html/canvas',
111     'inspector', 
112     'loader', 
113     'loader/appcache', 
114     'loader/archive', 
115     'loader/icon',
116     'notifications',
117     'page',
118     'page/animation', 
119     'platform', 
120     'platform/animation', 
121     'platform/graphics', 
122     'platform/graphics/transforms',
123     'platform/image-decoders',
124     'platform/image-decoders/bmp', 
125     'platform/image-decoders/gif', 
126     'platform/image-decoders/ico', 
127     'platform/image-decoders/jpeg', 
128     'platform/image-decoders/png', 
129     'platform/image-decoders/xbm', 
130     'platform/image-decoders/zlib',
131     'platform/mock',
132     'platform/network', 
133     'platform/sql', 
134     'platform/text', 
135     'plugins', 
136     'rendering', 
137     'rendering/style', 
138     'storage', 
139     'websockets', 
140     'xml'
141 ]
142
143 config = get_config(wk_root)
144 config_dir = config + git_branch_name()
145
146 output_dir = os.path.join(wk_root, 'WebKitBuild', config_dir)
147
148 build_port = "wx"
149 building_on_win32 = sys.platform.startswith('win')
150
151 def get_config():
152     waf_configname = config.upper().strip()
153     if building_on_win32:
154         isReleaseCRT = (config == 'Release')
155         if build_port == 'wx':
156             if Options.options.wxpython:
157                 isReleaseCRT = True
158         
159         if isReleaseCRT:
160             waf_configname = waf_configname + ' CRT_MULTITHREADED_DLL'
161         else:
162             waf_configname = waf_configname + ' CRT_MULTITHREADED_DLL_DBG'
163             
164     return waf_configname
165
166 create_hash_table = wk_root + "/JavaScriptCore/create_hash_table"
167 if building_on_win32:
168     create_hash_table = get_output('cygpath --unix "%s"' % create_hash_table)
169 os.environ['CREATE_HASH_TABLE'] = create_hash_table
170
171 feature_defines = ['ENABLE_DATABASE', 'ENABLE_XSLT', 'ENABLE_JAVASCRIPT_DEBUGGER']
172
173 msvc_version = 'msvc2008'
174
175 msvclibs_dir = os.path.join(wklibs_dir, msvc_version, 'win')
176
177 def get_path_to_wxconfig():
178     if 'WX_CONFIG' in os.environ:
179         return os.environ['WX_CONFIG']
180     else:
181         return 'wx-config'
182
183 def common_set_options(opt):
184     """
185     Initialize common options provided to the user.
186     """
187     opt.tool_options('compiler_cxx')
188     opt.tool_options('compiler_cc')
189     opt.tool_options('python')
190     
191     opt.add_option('--wxpython', action='store_true', default=False, help='Create the wxPython bindings.')
192     opt.add_option('--wx-compiler-prefix', action='store', default='vc',
193                    help='Specify a different compiler prefix (do this if you used COMPILER_PREFIX when building wx itself)')
194     opt.add_option('--macosx-version', action='store', default='', help="Version of OS X to build for.")
195
196 def common_configure(conf):
197     """
198     Configuration used by all targets, called from the target's configure() step.
199     """
200     
201     conf.env['MSVC_VERSIONS'] = ['msvc 9.0', 'msvc 8.0']
202     conf.env['MSVC_TARGETS'] = ['x86']
203     
204     if sys.platform.startswith('cygwin'):
205         print "ERROR: You must use the Win32 Python from python.org, not Cygwin Python, when building on Windows."
206         sys.exit(1)
207     
208     if sys.platform.startswith('darwin') and build_port == 'wx':
209         import platform
210         if platform.release().startswith('10'): # Snow Leopard
211             # wx currently only supports 32-bit compilation, so we want gcc-4.0 instead of 4.2 on Snow Leopard
212             # unless the user has explicitly set a different compiler.
213             if not "CC" in os.environ:
214                 conf.env['CC'] = 'gcc-4.0'
215             if not "CXX" in os.environ:
216                 conf.env['CXX'] = 'g++-4.0'
217     conf.check_tool('compiler_cxx')
218     conf.check_tool('compiler_cc')
219     if Options.options.wxpython:
220         conf.check_tool('python')
221         conf.check_python_headers()
222     
223     if sys.platform.startswith('darwin'):
224         conf.check_tool('osx')
225     
226     global msvc_version
227     global msvclibs_dir
228     
229     if building_on_win32:
230         found_versions = conf.get_msvc_versions()
231         if found_versions[0][0] == 'msvc 9.0':
232             msvc_version = 'msvc2008'
233         elif found_versions[0][0] == 'msvc 8.0':
234             msvc_version = 'msvc2005'
235         
236         msvclibs_dir = os.path.join(wklibs_dir, msvc_version, 'win')
237         conf.env.append_value('CXXFLAGS', ['/wd4291','/wd4344','/wd4396','/wd4800'])
238     
239     for use in port_uses[build_port]:
240        conf.env.append_value('CXXDEFINES', ['WTF_USE_%s' % use])
241
242     if build_port == "wx":
243         update_wx_deps(conf, wk_root, msvc_version)
244     
245         conf.env.append_value('CXXDEFINES', ['BUILDING_WX__=1'])
246
247         if building_on_win32:
248             conf.env.append_value('LIBPATH', os.path.join(msvclibs_dir, 'lib'))
249             # wx settings
250             global config
251             is_debug = (config == 'Debug')
252             wxdefines, wxincludes, wxlibs, wxlibpaths = get_wxmsw_settings(wx_root, shared=True, unicode=True, debug=is_debug, wxPython=Options.options.wxpython)
253             conf.env['CXXDEFINES_WX'] = wxdefines
254             conf.env['CPPPATH_WX'] = wxincludes
255             conf.env['LIB_WX'] = wxlibs
256             conf.env['LIBPATH_WX'] = wxlibpaths
257
258     if sys.platform.startswith('darwin'):
259         conf.env['LIB_ICU'] = ['icucore']
260         # Apple does not ship the ICU headers with Mac OS X, so WebKit includes a copy of 3.2 headers
261         conf.env['CPPPATH_ICU'] = [os.path.join(jscore_dir, 'icu'), os.path.join(webcore_dir, 'icu')]
262     
263         conf.env.append_value('CPPPATH', wklibs_dir)
264         conf.env.append_value('LIBPATH', wklibs_dir)
265         
266         min_version = None
267         
268         mac_target = 'MACOSX_DEPLOYMENT_TARGET'
269         if Options.options.macosx_version != '':
270             min_version = Options.options.macosx_version
271         
272         # WebKit only supports 10.4+, but ppc systems often set this to earlier systems
273         if not min_version:
274             min_version = commands.getoutput('sw_vers -productVersion')[:4]
275             if min_version in ['10.1','10.2','10.3']:
276                 min_version = '10.4'
277
278         os.environ[mac_target] = conf.env[mac_target] = min_version        
279
280         sdk_version = min_version
281         if min_version == "10.4":
282             sdk_version += "u"
283         
284         sdkroot = '/Developer/SDKs/MacOSX%s.sdk' % sdk_version
285         sdkflags = ['-arch', 'i386', '-isysroot', sdkroot]
286         
287         conf.env.append_value('CPPFLAGS', sdkflags)
288         conf.env.append_value('LINKFLAGS', sdkflags)
289         
290         conf.env.append_value('CPPPATH_SQLITE3', [os.path.join(wklibs_dir, 'WebCoreSQLite3')])
291         conf.env.append_value('LIB_SQLITE3', ['WebCoreSQLite3'])
292     
293     libprefix = ''
294     if building_on_win32:
295         libprefix = 'lib'
296     
297     conf.env['LIB_JSCORE'] = [libprefix + 'jscore']
298     conf.env['LIB_WEBCORE'] = [libprefix + 'webcore']
299     conf.env['LIB_WXWEBKIT'] = ['wxwebkit']
300     conf.env['CXXDEFINES_WXWEBKIT'] = ['WXUSINGDLL_WEBKIT']
301     
302     conf.env.append_value('CXXDEFINES', feature_defines)
303     if config == 'Release':
304         conf.env.append_value('CPPDEFINES', 'NDEBUG')
305         
306     if building_on_win32:
307         conf.env.append_value('CPPPATH', [
308             os.path.join(jscore_dir, 'os-win32'),
309             os.path.join(msvclibs_dir, 'include'),
310             os.path.join(msvclibs_dir, 'include', 'pthreads'),
311             os.path.join(msvclibs_dir, 'lib'),
312             ])
313             
314         conf.env.append_value('LIB', ['libpng', 'libjpeg', 'pthreadVC2'])
315         # common win libs
316         conf.env.append_value('LIB', [
317             'kernel32', 'user32','gdi32','comdlg32','winspool','winmm',
318             'shell32', 'comctl32', 'ole32', 'oleaut32', 'uuid', 'advapi32', 
319             'wsock32', 'gdiplus', 'version'])
320
321         conf.env['LIB_ICU'] = ['icudt', 'icule', 'iculx', 'icuuc', 'icuin', 'icuio', 'icutu']
322         
323         #curl
324         conf.env['LIB_CURL'] = ['libcurl']
325         
326         #sqlite3
327         conf.env['CPPPATH_SQLITE3'] = [os.path.join(msvclibs_dir, 'include', 'SQLite')]
328         conf.env['LIB_SQLITE3'] = ['sqlite3']
329         
330         #libxml2
331         conf.env['LIB_XML'] = ['libxml2']
332         
333         #libxslt
334         conf.env['LIB_XSLT'] = ['libxslt']
335     else:    
336         if build_port == 'wx':
337             conf.env.append_value('LIB', ['jpeg', 'png', 'pthread'])
338             conf.env.append_value('LIBPATH', os.path.join(wklibs_dir, 'unix', 'lib'))
339             conf.env.append_value('CPPPATH', os.path.join(wklibs_dir, 'unix', 'include'))
340             conf.env.append_value('CXXFLAGS', ['-fPIC', '-DPIC'])
341             
342             conf.check_cfg(path=get_path_to_wxconfig(), args='--cxxflags --libs', package='', uselib_store='WX', mandatory=True)
343             
344         conf.check_cfg(msg='Checking for libxslt', path='xslt-config', args='--cflags --libs', package='', uselib_store='XSLT', mandatory=True)
345         conf.check_cfg(path='xml2-config', args='--cflags --libs', package='', uselib_store='XML', mandatory=True)
346         if sys.platform.startswith('darwin') and min_version and min_version == '10.4':
347             conf.check_cfg(path=os.path.join(wklibs_dir, 'unix', 'bin', 'curl-config'), args='--cflags --libs', package='', uselib_store='CURL', mandatory=True)
348         else:
349             conf.check_cfg(path='curl-config', args='--cflags --libs', package='', uselib_store='CURL', mandatory=True)
350         
351         if not sys.platform.startswith('darwin'):
352             conf.check_cfg(package='cairo', args='--cflags --libs', uselib_store='WX', mandatory=True)
353             conf.check_cfg(package='pango', args='--cflags --libs', uselib_store='WX', mandatory=True)
354             conf.check_cfg(package='gtk+-2.0', args='--cflags --libs', uselib_store='WX', mandatory=True)
355             conf.check_cfg(package='sqlite3', args='--cflags --libs', uselib_store='SQLITE3', mandatory=True)
356             conf.check_cfg(path='icu-config', args='--cflags --ldflags', package='', uselib_store='ICU', mandatory=True)