2008-07-02 Geoffrey Garen <ggaren@apple.com>
[WebKit-https.git] / WebKitTools / wx / build-wxwebkit
1 #!/bin/bash
2
3 # Copyright (C) 2007 Robin Dunn, Kevin Ollivier  All rights reserved.
4 #
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
7 # are met:
8 # 1. Redistributions of source code must retain the above copyright
9 #    notice, this list of conditions and the following disclaimer.
10 # 2. Redistributions in binary form must reproduce the above copyright
11 #    notice, this list of conditions and the following disclaimer in the
12 #    documentation and/or other materials provided with the distribution.
13 #
14 # THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
25 #
26 # Driver for the wxWebKit build process.
27
28 set -o errexit
29 #set -o xtrace
30
31 #----------------------------------------------------------------------
32 # Set up the environment
33
34 scriptDir="$(cd $(dirname $0);pwd)"
35 WK_ROOT=$scriptDir/../..
36 WK_ROOTDIR="$WK_ROOT"
37
38 cd $scriptDir
39
40 if [ -z $WEBKITOUTPUTDIR ]; then
41     WEBKITOUTPUTDIR=`cd $WK_ROOT/WebKitTools/Scripts; perl -e "use webkitdirs; print productDir()"`
42 fi
43
44 WKWINLIBS=WebKitLibraries/win
45 WINDEPS="         $WKWINLIBS/lib/pthreadVC2.dll"
46 WINDEPS="$WINDEPS $WKWINLIBS/bin/icuuc34.dll $WKWINLIBS/bin/icudt34.dll $WKWINLIBS/bin/icuin34.dll"
47 WINDEPS="$WINDEPS $WKWINLIBS/bin/libcurl.dll $WKWINLIBS/bin/libeay32.dll $WKWINLIBS/bin/ssleay32.dll $WKWINLIBS/bin/zlib1.dll"
48 WINDEPS="$WINDEPS $WKWINLIBS/lib/sqlite3.dll"
49 WINDEPS="$WINDEPS $WKWINLIBS/bin/libxml2.dll $WKWINLIBS/bin/libxslt.dll" 
50 WINDEPS="$WINDEPS $WKWINLIBS/bin/iconv.dll" 
51
52 # TODO: check that we are running from the root of the source tree...
53
54 # cygpath will bork if the dir doesn't exist...
55 mkdir -p $WEBKITOUTPUTDIR
56
57 if [ $OSTYPE == cygwin ]; then
58     EXE=.exe
59     WK_ROOTDIR=`cygpath -d $WK_ROOT`
60     WEBKITOUTPUTDIR=`cygpath -d $WEBKITOUTPUTDIR`
61     export WEBKITOUTPUTDIR
62     if [ -z $WXWIN ]; then
63         echo "Error, you must set WXWIN to your wxWidgets root directory."
64         exit 1
65     fi
66     if [ -z $WX_PREFIX ]; then
67         WX_PREFIX=$WXWIN
68     fi
69     if [ -z $BAKEFILE_PATHS ]; then
70         export BAKEFILE_PATHS=$WXWIN/build/bakefiles/wxpresets
71     fi
72     LINKER=`which link`
73     if [ "$LINKER" = "/usr/bin/link" ]; then
74         echo "WARNING: wxWebKit builds using MSVC on Windows, but it looks like"
75         echo "you have the GCC linker on your path. If /usr/bin/link does NOT point"
76         echo "to the MSVC linker, you need to move it or change your path to pick up"
77         echo "Microsoft's link.exe program first."
78     fi
79
80 else
81     export WEBKITOUTPUTDIR
82     WX_PREFIX=`wx-config --prefix`
83     if [ ! -d "$WX_PREFIX" ]; then
84         echo "ERROR: Cannot find your wxWidgets installation."
85         echo "Make sure wx-config is on your PATH and points to a valid wxWidgets installation."
86         exit 1
87     fi
88     
89     CONFIG=`wx-config --selected-config`
90     if [ "${CONFIG:0:4}" != "gtk2" -a "${CONFIG:0:3}" != "mac" ]; then
91         echo "ERROR: This configuration '$CONFIG' is not currently supported by wxWebKit. Please use the win, mac, or gtk2 port depending on your platform."
92         exit 1
93     fi
94     
95     if [ ! -d "$WX_PREFIX/share/bakefile" ]; then
96         echo "ERROR: wxWidgets installation does not have wxpresets."
97         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+."
98         exit 1
99     fi    
100     
101     if [ -z $BAKEFILE_PATHS ]; then
102         export BAKEFILE_PATHS=$WX_PREFIX/share/bakefile
103     fi
104 fi
105
106 # after all that, make sure that BAKEFILE_PATHS was either set
107 # previously, or by the code above
108 if [ -z $BAKEFILE_PATHS ]; then
109     echo "Error, you must set BAKEFILE_PATHS to the directory containing wxpresets."
110     exit 1
111 fi
112
113 #----------------------------------------------------------------------
114 # process command line args
115 build_type_set=0
116
117 do_bake=0
118 do_prep=0
119 do_extras=0
120 do_build=0
121 do_clean=0
122 do_install=0
123 use_wxgc=0
124 debug=1
125 wxdebug=0
126 wxpython=0
127 make_args=''
128 other_args=''
129
130 for flag in $*; do
131     case $flag in
132     bake)   do_bake=1                                      ;;
133     prep)   do_prep=1                                      ;;
134     build)  do_build=1                                     ;;
135     all)    do_extras=1; do_bake=1; do_prep=1; do_build=1  ;;
136     clean)  other_args=clean; do_clean=1                   ;;
137     wxgc)   use_wxgc=1                                     ;;
138     wxdebug) wxdebug=1                                     ;;
139     wxpython) wxpython=1                                   ;;
140     wxpython-install) wxpython_install=1                   ;;
141     *)      export $flag ;; #other_args='$other_args "$flag"'               ;;
142     esac
143 done
144
145
146 #----------------------------------------------------------------------
147
148 # if no arguments were passed, do a full build.
149 if [ $do_bake == 0 -a $do_prep == 0 -a $do_build == 0 -a $do_clean == 0 ]; then
150     do_bake=1; do_prep=1; do_build=1
151 fi
152
153 if [ -f $WK_ROOT/WebKitBuild/Configuration ]; then
154     BUILD_TYPE=`cat $WK_ROOT/WebKitBuild/Configuration`
155     echo "Configuration is: $BUILD_TYPE"
156     
157     if [ $BUILD_TYPE == "Release" ]; then
158         debug=0
159     fi
160     if [ $BUILD_TYPE == "Debug" ]; then
161         debug=1
162     fi
163     
164 fi
165
166 function do_make {
167     dir=$1
168     cxxflags=$2
169     olddir=$PWD
170     shift
171     shift
172     if [ $OSTYPE == cygwin ]; then
173         cd $dir
174         nmake -f makefile.vc CXXFLAGS="$cxxflags" $@
175         cd $olddir
176     else
177         make -C $dir -f GNUmakefile $MAKE_ARGS CXXFLAGS="$cxxflags" $@
178     fi
179     if [ $? != 0 ]; then
180         exit $? 
181     fi
182 }
183
184 # output the first parameter that is a dir and exists
185 function find_existing_dir {
186     for arg in $*; do
187         tester=$arg
188         if [ $OSTYPE == cygwin ]; then
189             tester=`cygpath -u $arg`
190         fi
191         if [ -d $tester ]; then
192             echo $arg
193             return
194         fi
195     done
196 }
197
198
199 olddir=$PWD
200
201 if [ $do_clean != 1 ]; then
202
203     mkdir -p $WEBKITOUTPUTDIR/build
204
205     if [ $do_bake == 1 ]; then
206         # bakefile stuff
207         cd $WK_ROOT/WebKit/wx
208         bakefile_gen
209     
210         # we need to do this because Bakefile doesn't know which
211         # platform it's running on with GNU format, and so it defaults
212         # to the standard Unix file endings and linker args.
213         if [ "${OSTYPE:0:6}" = "darwin" ]; then
214             sed "s/libwebcore-wx.so/libwebcore-wx.dylib/" < $WK_ROOT/WebCore/GNUmakefile > temp
215             mv temp $WK_ROOT/WebCore/GNUmakefile
216     
217             sed "s/\-shared/\-dynamiclib/" < $WK_ROOT/WebCore/GNUmakefile > temp
218             mv temp $WK_ROOT/WebCore/GNUmakefile
219             
220             sed "s/libwxwebkit.so/libwxwebkit.dylib/" < $WK_ROOT/WebKit/wx/GNUmakefile > temp
221             mv temp $WK_ROOT/WebKit/wx/GNUmakefile
222             
223             sed "s/\-shared/\-dynamiclib/" < $WK_ROOT/WebKit/wx/GNUmakefile > temp
224             mv temp $WK_ROOT/WebKit/wx/GNUmakefile
225         fi
226     fi
227
228     if [ $do_prep == 1 ]; then
229         # Other preparation steps
230         
231         # since the buildbot will wipe the build tree clean sometimes, we need to reinstall
232         # the dependencies if they aren't installed.
233         if [ "${OSTYPE:0:6}" == "darwin" ]; then
234             $WK_ROOT/WebKitTools/wx/install-unix-extras
235         fi
236         
237         cd $WK_ROOT/JavaScriptCore
238         ./make-generated-sources.sh
239         if [ $? != 0 ]; then
240             exit $? 
241         fi
242     
243         cd $WK_ROOT/WebCore
244         ./make-generated-sources.sh platform/wx/wx-encodings.txt
245         if [ $? != 0 ]; then
246             exit $? 
247         fi
248     fi
249 fi
250
251
252 if [ $do_build == 1 -o $do_clean == 1 ]; then
253     # Build steps
254     WXGC_DEFINE=""
255     if [ $use_wxgc == 1 ]; then
256         WXGC_DEFINE="-DWTF_USE_WXGC=1"
257     fi
258     WX_EXT=
259     if [ "${OSTYPE:0:6}" == "cygwin" -a $wxdebug == 1 ]; then
260         WX_EXT=d
261     fi
262     if [ "${OSTYPE:0:6}" == "cygwin" -a $wxpython == 1 ]; then
263         other_args=WX_PYTHON=1
264         WX_EXT=h
265         wxdebug=1
266     fi
267     
268     if [ "${OSTYPE:0:6}" == "cygwin" ]; then
269         PLATFORM_OS="win"
270     elif [ "${OSTYPE:0:6}" == "darwin" ]; then
271         PLATFORM_OS="mac"
272     else
273         PLATFORM_OS="linux"
274         use_wxgc=1 # Linux requires us to use wxgc to get proper drawing.
275     fi
276
277     WINDEPS="$WINDEPS $WXWIN/lib/vc_dll/wxmsw28u${WX_EXT}_core_vc.dll $WXWIN/lib/vc_dll/wxbase28u${WX_EXT}_vc.dll"
278     
279     # NOTE: If we try to do make clean after the Bakefiles were cleaned out, or before they were
280     # first generated, we will get errors about missing files. 
281     # FIXME: Make the check more robust.
282     if [ -f $WK_ROOT/JavaScriptCore/GNUmakefile ]; then
283         do_make $WK_ROOT/JavaScriptCore      "-DBUILDING_WX__=1 $WXGC_DEFINE" WX_DEBUG=$wxdebug DEBUG=$debug WEBKIT_ROOT=$WK_ROOTDIR PLATFORM_OS=$PLATFORM_OS $other_args 
284         do_make $WK_ROOT/WebCore "-DBUILDING_WX__=1 $WXGC_DEFINE" WX_DEBUG=$wxdebug WEBKIT_ROOT=$WK_ROOTDIR DEBUG=$debug PLATFORM_OS=$PLATFORM_OS $other_args
285         do_make $WK_ROOT/WebKit/wx "-DBUILDING_WX__=1 -DWXMAKINGDLL_WEBKIT=1 $WXGC_DEFINE" WX_DEBUG=$wxdebug DEBUG=$debug WEBKIT_ROOT=$WK_ROOTDIR PLATFORM_OS=$PLATFORM_OS $other_args 
286         do_make $WK_ROOT/WebKitTools/wx/browser  "-DBUILDING_WX__=1 -DWXUSINGDLL_WEBKIT=1 $WXGC_DEFINE" WX_DEBUG=$wxdebug DEBUG=$debug WEBKIT_ROOT=$WK_ROOTDIR PLATFORM_OS=$PLATFORM_OS $other_args 
287     fi
288
289     if [ $do_clean == 1 ]; then
290         rm -rf $WK_ROOT/JavaScriptCore/DerivedSources
291         rm -rf $WK_ROOT/WebCore/DerivedSources
292         rm -rf $WK_ROOT/WebCore/include/JavaScriptCore
293     fi
294
295     if [ $do_build == 1 ]; then 
296         if [ "${OSTYPE:0:6}" = "darwin" ]; then
297             cd  $WEBKITOUTPUTDIR
298             mkdir -p wxBrowser.app/Contents/MacOS
299             mkdir -p wxBrowser.app/Contents/Frameworks
300             cp wxBrowser wxBrowser.app/Contents/MacOS
301             install_name_tool -change libwxwebkit.dylib @executable_path/../Frameworks/libwxwebkit.dylib wxBrowser.app/Contents/MacOS/wxBrowser
302             if [ ! -f "$WEBKITOUTPUTDIR/libwxwebkit.dylib" ]; then
303                 ln -s $WEBKITOUTPUTDIR/libwxwebkit.dylib wxBrowser.app/Contents/Frameworks
304             fi
305         fi
306         
307         if [ $wxpython == 1 ]; then
308             if [ -z $SWIG ]; then
309                 SWIG=`which swig`
310             fi
311
312             if [ ! -f "$SWIG" ]; then
313                 echo "ERROR: Cannot find SWIG. Make sure that SWIG 1.3.29 is located on your path.";
314                 exit 1;
315             fi
316     
317             cd $WK_ROOT/WebKit/wx/bindings/python
318             
319             SWIG_FLAGS=`python -c "import wx.build.config; import string; print string.join(wx.build.config.swig_args, ' ')"`
320             WEBKIT_INCLUDE="-I$WK_ROOT/WebKit/wx"
321             if [ "${OSTYPE:0:6}" == "cygwin" ]; then
322                 WEBKIT_INCLUDE="-I`cygpath -d $WK_ROOT/WebKit/wx`"
323             fi
324             
325             # Determine which include path to use for wxPython's *.i files
326             # Options are:
327             #    wxPython installed on a posix system
328             #    the wxPython win32 devel tarball
329             #    a wx source tree from a tarball where wxPython is in the wx dir
330             #    a wx source tree from SVN where wxPython is a sibling of the wx dir
331             WXPY_INCLUDE=`find_existing_dir \
332                 $WX_PREFIX/include/wx-2.8/wx/wxPython/i_files \
333                 $WX_PREFIX/include/wx/wxPython/i_files \
334                 $WX_PREFIX/wxPython/src \
335                 $WX_PREFIX/../wxPython/src`
336             if [ -z $WXPY_INCLUDE ]; then
337                 echo "ERROR: Unable to find wxPython's *.i files"
338                 exit 1
339             fi
340             
341             # Run SWIG
342             $SWIG $SWIG_FLAGS -I$WXPY_INCLUDE $WEBKIT_INCLUDE -o webview.cpp webview.i
343             cp webview.py $WEBKITOUTPUTDIR/webview.py
344                                    
345             PY_INCLUDE=`python -c "import sys,distutils.sysconfig; sys.stdout.write(distutils.sysconfig.get_python_inc())"`
346             PY_VERSION=`python -c "import sys;  sys.stdout.write(str(sys.version_info[0]) + str(sys.version_info[1]))"`
347             PY_LIBDIR=`python -c "import distutils.sysconfig; import sys; sys.stdout.write(distutils.sysconfig.PREFIX)"`
348             
349             if [ "${OSTYPE:0:6}" == "cygwin" ]; then
350                 PY_LIBDIR="$PY_LIBDIR\\Libs"
351             else
352                 PY_LIBDIR="$PY_LIBDIR/lib"
353             fi
354             
355             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" \
356                 WX_DEBUG=$wxdebug DEBUG=$debug WEBKIT_ROOT=$WK_ROOTDIR PLATFORM_OS=$PLATFORM_OS PYTHON_VERSION=$PY_VERSION PYTHON_LIBDIR=$PY_LIBDIR $other_args
357             if [ "${OSTYPE:0:6}" == "cygwin" ]; then
358                 if [ -f $WEBKITOUTPUTDIR/_webview.pyd -a -f $WEBKITOUTPUTDIR/_webview.dll ]; then
359                     rm $WEBKITOUTPUTDIR/_webview.pyd
360                     mv $WEBKITOUTPUTDIR/_webview.dll $WEBKITOUTPUTDIR/_webview.pyd
361                 fi
362             fi
363         fi
364         
365     
366         if [ "$OSTYPE" == "cygwin" ]; then
367             echo "Copying necessary DLLs to run test and sample applications..."
368             cd $WK_ROOT
369             cp $WINDEPS `cygpath -u $WEBKITOUTPUTDIR`
370             chmod +x `cygpath -u $WEBKITOUTPUTDIR/`*.dll
371             if [ -e `cygpath -u $WEBKITOUTPUTDIR/_webview.dll` ]; then
372                 mv `cygpath -u $WEBKITOUTPUTDIR/_webview.dll` `cygpath -u $WEBKITOUTPUTDIR/_webview.pyd`
373             fi
374         fi
375         
376         BROWSERAPP="wxBrowser"
377         
378         if [ "${OSTYPE:0:6}" == "darwin" ]; then
379             BROWSERAPP="wxBrowser.app/Contents/MacOS/wxBrowser"
380         fi
381     
382         echo ""
383         echo ""
384         echo "--- BUILD COMPLETE ---"
385         echo ""
386         echo "Next steps:"
387         echo ""
388         echo "-- Run '$WK_ROOT/WebKitTools/Scripts/run-javascriptcore-tests --wx' to ensure JSCore tests pass."
389         echo ""
390         echo "-- Run $WEBKITOUTPUTDIR/$BROWSERAPP to test your wxWebKit build."
391         echo ""
392         echo ""
393     fi
394 fi
395
396 if [ $do_clean == 1 ]; then
397     cd $WK_ROOT/WebKit/wx
398     bakefile_gen --clean
399 fi
400
401 cd $olddir