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