OSDN Git Service

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