#!/bin/bash # Copyright (C) 2007 Robin Dunn, Kevin Ollivier All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Driver for the wxWebKit build process. set -o errexit #set -o xtrace #---------------------------------------------------------------------- # Set up the environment scriptDir="$(cd $(dirname $0);pwd)" WK_ROOT=$scriptDir/../.. WK_ROOTDIR="$WK_ROOT" cd $scriptDir if [ -z $WEBKITOUTPUTDIR ]; then WEBKITOUTPUTDIR=`cd $WK_ROOT/WebKitTools/Scripts; perl -e "use webkitdirs; print productDir()"` fi WKWINLIBS=WebKitLibraries/win WINDEPS=" $WKWINLIBS/lib/pthreadVC2.dll" WINDEPS="$WINDEPS $WKWINLIBS/bin/icuuc40.dll $WKWINLIBS/bin/icudt40.dll $WKWINLIBS/bin/icuin40.dll" WINDEPS="$WINDEPS $WKWINLIBS/bin/libcurl.dll $WKWINLIBS/bin/libeay32.dll $WKWINLIBS/bin/ssleay32.dll $WKWINLIBS/bin/zlib1.dll" WINDEPS="$WINDEPS $WKWINLIBS/lib/sqlite3.dll" WINDEPS="$WINDEPS $WKWINLIBS/bin/libxml2.dll $WKWINLIBS/bin/libxslt.dll" WINDEPS="$WINDEPS $WKWINLIBS/bin/iconv.dll" # TODO: check that we are running from the root of the source tree... # cygpath will bork if the dir doesn't exist... mkdir -p $WEBKITOUTPUTDIR if [ $OSTYPE == cygwin ]; then EXE=.exe WK_ROOTDIR=`cygpath -d $WK_ROOT` WEBKITOUTPUTDIR=`cygpath -d $WEBKITOUTPUTDIR` export WEBKITOUTPUTDIR if [ -z $WXWIN ]; then echo "Error, you must set WXWIN to your wxWidgets root directory." exit 1 fi if [ -z $WX_PREFIX ]; then WX_PREFIX=$WXWIN fi if [ -z $BAKEFILE_PATHS ]; then export BAKEFILE_PATHS=$WXWIN/build/bakefiles/wxpresets fi LINKER=`which link` if [ "$LINKER" = "/usr/bin/link" ]; then echo "WARNING: wxWebKit builds using MSVC on Windows, but it looks like" echo "you have the GCC linker on your path. If /usr/bin/link does NOT point" echo "to the MSVC linker, you need to move it or change your path to pick up" echo "Microsoft's link.exe program first." fi else export WEBKITOUTPUTDIR WX_PREFIX=`wx-config --prefix` if [ ! -d "$WX_PREFIX" ]; then echo "ERROR: Cannot find your wxWidgets installation." echo "Make sure wx-config is on your PATH and points to a valid wxWidgets installation." exit 1 fi CONFIG=`wx-config --selected-config` if [ "${CONFIG:0:4}" != "gtk2" -a "${CONFIG:0:3}" != "mac" ]; then echo "WARNING: This configuration '$CONFIG' is not currently supported by wxWebKit. Please use the win, mac, or gtk2 port depending on your platform." fi if [ ! -d "$WX_PREFIX/share/bakefile" ]; then echo "ERROR: wxWidgets installation does not have wxpresets." echo "wx-config is pointing to an installation that does not have Bakefile presets installed. Run `wx-config --version` to ensure your wxWidgets is of version 2.8+." exit 1 fi if [ -z $BAKEFILE_PATHS ]; then export BAKEFILE_PATHS=$WX_PREFIX/share/bakefile fi fi # after all that, make sure that BAKEFILE_PATHS was either set # previously, or by the code above if [ -z $BAKEFILE_PATHS ]; then echo "Error, you must set BAKEFILE_PATHS to the directory containing wxpresets." exit 1 fi #---------------------------------------------------------------------- # process command line args build_type_set=0 do_bake=0 do_prep=0 do_extras=0 do_build=0 do_clean=0 do_install=0 use_wxgc=0 debug=1 wxdebug=0 wxpython=0 make_args='' other_args='' for flag in $*; do case $flag in bake) do_bake=1 ;; prep) do_prep=1 ;; build) do_build=1 ;; all) do_extras=1; do_bake=1; do_prep=1; do_build=1 ;; clean) other_args=clean; do_clean=1 ;; wxgc) use_wxgc=1 ;; wxdebug) wxdebug=1 ;; wxpython) wxpython=1 ;; wxpython-install) wxpython_install=1 ;; *) export $flag ;; #other_args='$other_args "$flag"' ;; esac done #---------------------------------------------------------------------- # if no arguments were passed, do a full build. if [ $do_bake == 0 -a $do_prep == 0 -a $do_build == 0 -a $do_clean == 0 ]; then do_bake=1; do_prep=1; do_build=1 fi if [ -f $WK_ROOT/WebKitBuild/Configuration ]; then BUILD_TYPE=`cat $WK_ROOT/WebKitBuild/Configuration` echo "Configuration is: $BUILD_TYPE" if [ $BUILD_TYPE == "Release" ]; then debug=0 fi if [ $BUILD_TYPE == "Debug" ]; then debug=1 fi fi function do_make { dir=$1 cxxflags=$2 olddir=$PWD shift shift # NOTE: If we try to do make clean after the Bakefiles were cleaned out, or before they were # first generated, we will get errors about missing files, so we need to check that the # makefile exists before running it. if [ $OSTYPE == cygwin ]; then cd $dir if [ -f makefile.vc ]; then nmake -f makefile.vc CXXFLAGS="$cxxflags" $@ fi cd $olddir else if [ -f $dir/GNUmakefile ]; then make -C $dir -f GNUmakefile $MAKE_ARGS CXXFLAGS="$cxxflags -fvisibility=hidden -fvisibility-inlines-hidden" $@ fi fi if [ $? != 0 ]; then exit $? fi } # output the first parameter that is a dir and exists function find_existing_dir { for arg in $*; do tester=$arg if [ $OSTYPE == cygwin ]; then tester=`cygpath -u $arg` fi if [ -d $tester ]; then echo $arg return fi done } olddir=$PWD if [ $do_clean != 1 ]; then mkdir -p $WEBKITOUTPUTDIR/build if [ $do_bake == 1 ]; then # bakefile stuff cd $WK_ROOT/WebKit/wx bakefile_gen # we need to do this because Bakefile doesn't know which # platform it's running on with GNU format, and so it defaults # to the standard Unix file endings and linker args. if [ "${OSTYPE:0:6}" = "darwin" ]; then sed "s/libjscore.so/libjscore.dylib/" < $WK_ROOT/JavaScriptCore/GNUmakefile > temp mv temp $WK_ROOT/JavaScriptCore/GNUmakefile sed "s/\-shared/\-dynamiclib/" < $WK_ROOT/JavaScriptCore/GNUmakefile > temp mv temp $WK_ROOT/JavaScriptCore/GNUmakefile sed "s/\-shared/\-dynamiclib/" < $WK_ROOT/WebCore/GNUmakefile > temp mv temp $WK_ROOT/WebCore/GNUmakefile sed "s/libwxwebkit.so/libwxwebkit.dylib/" < $WK_ROOT/WebKit/wx/GNUmakefile > temp mv temp $WK_ROOT/WebKit/wx/GNUmakefile sed "s/\-shared/\-dynamiclib/" < $WK_ROOT/WebKit/wx/GNUmakefile > temp mv temp $WK_ROOT/WebKit/wx/GNUmakefile fi fi if [ $do_prep == 1 ]; then # Other preparation steps # since the buildbot will wipe the build tree clean sometimes, we need to reinstall # the dependencies if they aren't installed. if [ "${OSTYPE:0:6}" == "darwin" ]; then $WK_ROOT/WebKitTools/wx/install-unix-extras fi export CREATE_HASH_TABLE="$WK_ROOT/JavaScriptCore/create_hash_table" cd $WK_ROOT/JavaScriptCore mkdir -p DerivedSources/JavaScriptCore cd DerivedSources/JavaScriptCore make -f ../../DerivedSources.make JavaScriptCore=../.. BUILT_PRODUCTS_DIR=../.. all FEATURE_DEFINES="ENABLE_DATABASE ENABLE_XSLT ENABLE_JAVASCRIPT_DEBUGGER" if [ $? != 0 ]; then exit 1 fi cd $WK_ROOT/WebCore mkdir -p DerivedSources/WebCore cd DerivedSources/WebCore make -f ../../DerivedSources.make all WebCore=../.. SOURCE_ROOT=../.. FEATURE_DEFINES="ENABLE_DATABASE ENABLE_XSLT ENABLE_JAVASCRIPT_DEBUGGER" if [ $? != 0 ]; then exit 1 fi fi fi if [ $do_build == 1 -o $do_clean == 1 ]; then WXGC_DEFINE="" EXTRA_CPPFLAGS="" if [ "${OSTYPE:0:6}" == "cygwin" ]; then PLATFORM_OS="win" elif [ "${OSTYPE:0:6}" == "darwin" ]; then PLATFORM_OS="mac" EXTRA_CPPFLAGS="-DMAC_OS_X_VERSION_MIN_REQUIRED=1040" use_wxgc=1 else PLATFORM_OS="linux" use_wxgc=1 fi if [ $use_wxgc == 1 ]; then WXGC_DEFINE="-DWTF_USE_WXGC=1" fi WX_EXT= if [ "${OSTYPE:0:6}" == "cygwin" -a $wxdebug == 1 ]; then WX_EXT=d fi if [ $wxpython == 1 ]; then other_args=WX_PYTHON=1 WX_EXT=h wxdebug=1 fi WINDEPS="$WINDEPS $WXWIN/lib/vc_dll/wxmsw28u${WX_EXT}_core_vc.dll $WXWIN/lib/vc_dll/wxbase28u${WX_EXT}_vc.dll" do_make $WK_ROOT/JavaScriptCore "-DBUILDING_WX__=1 $WXGC_DEFINE $EXTRA_CPPFLAGS" WX_DEBUG=$wxdebug DEBUG=$debug WEBKIT_ROOT=$WK_ROOTDIR PLATFORM_OS=$PLATFORM_OS $other_args mkdir -p $WEBKITOUTPUTDIR/JavaScriptCore cp -p $WK_ROOT/JavaScriptCore/API/*.h $WEBKITOUTPUTDIR/JavaScriptCore/ do_make $WK_ROOT/WebCore "-DBUILDING_WX__=1 $WXGC_DEFINE $EXTRA_CPPFLAGS" WX_DEBUG=$wxdebug WEBKIT_ROOT=$WK_ROOTDIR DEBUG=$debug PLATFORM_OS=$PLATFORM_OS $other_args do_make $WK_ROOT/WebKit/wx "-DBUILDING_WX__=1 -DWXMAKINGDLL_WEBKIT=1 $WXGC_DEFINE $EXTRA_CPPFLAGS" WX_DEBUG=$wxdebug DEBUG=$debug WEBKIT_ROOT=$WK_ROOTDIR PLATFORM_OS=$PLATFORM_OS $other_args do_make $WK_ROOT/WebKitTools/wx/browser "-DBUILDING_WX__=1 -DWXUSINGDLL_WEBKIT=1 $WXGC_DEFINE $EXTRA_CPPFLAGS" WX_DEBUG=$wxdebug DEBUG=$debug WEBKIT_ROOT=$WK_ROOTDIR PLATFORM_OS=$PLATFORM_OS $other_args do_make $WK_ROOT/WebKitTools/DumpRenderTree/wx "-DBUILDING_WX__=1 -DWXUSINGDLL_WEBKIT=1 $WXGC_DEFINE $EXTRA_CPPFLAGS" WX_DEBUG=$wxdebug DEBUG=$debug WEBKIT_ROOT=$WK_ROOTDIR PLATFORM_OS=$PLATFORM_OS $other_args if [ $do_clean == 1 ]; then rm -rf $WK_ROOT/JavaScriptCore/DerivedSources rm -rf $WK_ROOT/WebCore/DerivedSources rm -rf $WK_ROOT/WebCore/include/JavaScriptCore fi if [ $do_build == 1 ]; then if [ "${OSTYPE:0:6}" = "darwin" ]; then cd $WEBKITOUTPUTDIR mkdir -p wxBrowser.app/Contents/MacOS mkdir -p wxBrowser.app/Contents/Frameworks cp wxBrowser wxBrowser.app/Contents/MacOS install_name_tool -change libwxwebkit.dylib @executable_path/../Frameworks/libwxwebkit.dylib wxBrowser.app/Contents/MacOS/wxBrowser if [ ! -f "$WEBKITOUTPUTDIR/libwxwebkit.dylib" ]; then ln -s $WEBKITOUTPUTDIR/libwxwebkit.dylib wxBrowser.app/Contents/Frameworks fi fi if [ $wxpython == 1 ]; then if [ -z $SWIG ]; then SWIG=`which swig` fi if [ ! -f "$SWIG" ]; then echo "ERROR: Cannot find SWIG. Make sure that SWIG 1.3.29 is located on your path."; exit 1; fi cd $WK_ROOT/WebKit/wx/bindings/python SWIG_FLAGS=`python -c "import wx.build.config; import string; print string.join(wx.build.config.swig_args, ' ')"` WEBKIT_INCLUDE="-I$WK_ROOT/WebKit/wx" if [ "${OSTYPE:0:6}" == "cygwin" ]; then WEBKIT_INCLUDE="-I`cygpath -d $WK_ROOT/WebKit/wx`" fi # Determine which include path to use for wxPython's *.i files # Options are: # wxPython installed on a posix system # the wxPython win32 devel tarball # a wx source tree from a tarball where wxPython is in the wx dir # a wx source tree from SVN where wxPython is a sibling of the wx dir WXPY_INCLUDE=`find_existing_dir \ $WX_PREFIX/include/wx-2.9/wx/wxPython/i_files \ $WX_PREFIX/include/wx-2.8/wx/wxPython/i_files \ $WX_PREFIX/include/wx/wxPython/i_files \ $WX_PREFIX/wxPython/src \ $WX_PREFIX/../wxPython/src` if [ -z $WXPY_INCLUDE ]; then echo "ERROR: Unable to find wxPython's *.i files" exit 1 fi # Run SWIG $SWIG $SWIG_FLAGS -I$WXPY_INCLUDE $WEBKIT_INCLUDE -o webview.cpp webview.i cp webview.py $WEBKITOUTPUTDIR/webview.py PY_INCLUDE=`python -c "import sys,distutils.sysconfig; sys.stdout.write(distutils.sysconfig.get_python_inc())"` if [ "${OSTYPE:0:6}" == "cygwin" ]; then PY_LIBDIR=`python -c "import distutils.sysconfig; import sys; sys.stdout.write(distutils.sysconfig.PREFIX)"` PY_LIBDIR="$PY_LIBDIR\\Libs" PY_LIB=`python -c "import sys; sys.stdout.write('python' + sys.version[:3])"` PY_LIB=`python -c "import sys; sys.stdout.write('$PY_LIB'.replace('.', ''))"` else PY_LIB=`python-config --libs` PY_LIBDIR=`python-config --ldflags` fi do_make $WK_ROOT/WebKit/wx/bindings/python "-DBUILDING_WX__=1 -DWXUSINGDLL=1 -DWXUSINGDLL_WEBKIT=1 -I$PY_INCLUDE -I$WX_PREFIX/wxPython/include -I$WX_PREFIX/../wxPython/include $WXGC_DEFINE $EXTRA_CPPFLAGS" \ WX_DEBUG=$wxdebug DEBUG=$debug WEBKIT_ROOT=$WK_ROOTDIR PLATFORM_OS=$PLATFORM_OS PYTHON_LIB=$PY_LIB PYTHON_LIBDIR=$PY_LIBDIR $other_args if [ "${OSTYPE:0:6}" == "cygwin" ]; then if [ -f $WEBKITOUTPUTDIR/_webview.pyd -a -f $WEBKITOUTPUTDIR/_webview.dll ]; then rm $WEBKITOUTPUTDIR/_webview.pyd mv $WEBKITOUTPUTDIR/_webview.dll $WEBKITOUTPUTDIR/_webview.pyd fi fi fi if [ "$OSTYPE" == "cygwin" ]; then echo "Copying necessary DLLs to run test and sample applications..." cd $WK_ROOT cp $WINDEPS `cygpath -u $WEBKITOUTPUTDIR` chmod +x `cygpath -u $WEBKITOUTPUTDIR/`*.dll if [ -e `cygpath -u $WEBKITOUTPUTDIR/_webview.dll` ]; then mv `cygpath -u $WEBKITOUTPUTDIR/_webview.dll` `cygpath -u $WEBKITOUTPUTDIR/_webview.pyd` fi fi BROWSERAPP="wxBrowser" if [ "${OSTYPE:0:6}" == "darwin" ]; then BROWSERAPP="wxBrowser.app/Contents/MacOS/wxBrowser" fi echo "" echo "" echo "--- BUILD COMPLETE ---" echo "" echo "Next steps:" echo "" echo "-- Run '$WK_ROOT/WebKitTools/Scripts/run-javascriptcore-tests --wx' to ensure JSCore tests pass." echo "" echo "-- Run $WEBKITOUTPUTDIR/$BROWSERAPP to test your wxWebKit build." echo "" echo "" fi fi if [ $do_clean == 1 ]; then cd $WK_ROOT/WebKit/wx bakefile_gen --clean fi cd $olddir