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