Reviewed by Kevin Ollivier.
[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/icuuc40.dll $WKWINLIBS/bin/icudt40.dll $WKWINLIBS/bin/icuin40.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 "WARNING: This configuration '$CONFIG' is not currently supported by wxWebKit. Please use the win, mac, or gtk2 port depending on your platform."
92     fi
93     
94     if [ ! -d "$WX_PREFIX/share/bakefile" ]; then
95         echo "ERROR: wxWidgets installation does not have wxpresets."
96         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+."
97         exit 1
98     fi    
99     
100     if [ -z $BAKEFILE_PATHS ]; then
101         export BAKEFILE_PATHS=$WX_PREFIX/share/bakefile
102     fi
103 fi
104
105 # after all that, make sure that BAKEFILE_PATHS was either set
106 # previously, or by the code above
107 if [ -z $BAKEFILE_PATHS ]; then
108     echo "Error, you must set BAKEFILE_PATHS to the directory containing wxpresets."
109     exit 1
110 fi
111
112 #----------------------------------------------------------------------
113 # process command line args
114 build_type_set=0
115
116 do_bake=0
117 do_prep=0
118 do_extras=0
119 do_build=0
120 do_clean=0
121 do_install=0
122 use_wxgc=0
123 debug=1
124 wxdebug=0
125 wxpython=0
126 make_args=''
127 other_args=''
128
129 for flag in $*; do
130     case $flag in
131     bake)   do_bake=1                                      ;;
132     prep)   do_prep=1                                      ;;
133     build)  do_build=1                                     ;;
134     all)    do_extras=1; do_bake=1; do_prep=1; do_build=1  ;;
135     clean)  other_args=clean; do_clean=1                   ;;
136     wxgc)   use_wxgc=1                                     ;;
137     wxdebug) wxdebug=1                                     ;;
138     wxpython) wxpython=1                                   ;;
139     wxpython-install) wxpython_install=1                   ;;
140     *)      export $flag ;; #other_args='$other_args "$flag"'               ;;
141     esac
142 done
143
144
145 #----------------------------------------------------------------------
146
147 # if no arguments were passed, do a full build.
148 if [ $do_bake == 0 -a $do_prep == 0 -a $do_build == 0 -a $do_clean == 0 ]; then
149     do_bake=1; do_prep=1; do_build=1
150 fi
151
152 if [ -f $WK_ROOT/WebKitBuild/Configuration ]; then
153     BUILD_TYPE=`cat $WK_ROOT/WebKitBuild/Configuration`
154     echo "Configuration is: $BUILD_TYPE"
155     
156     if [ $BUILD_TYPE == "Release" ]; then
157         debug=0
158     fi
159     if [ $BUILD_TYPE == "Debug" ]; then
160         debug=1
161     fi
162     
163 fi
164
165 function do_make {
166     dir=$1
167     cxxflags=$2
168     olddir=$PWD
169     shift
170     shift
171     # NOTE: If we try to do make clean after the Bakefiles were cleaned out, or before they were
172     # first generated, we will get errors about missing files, so we need to check that the
173     # makefile exists before running it. 
174     if [ $OSTYPE == cygwin ]; then
175         cd $dir
176         if [ -f makefile.vc ]; then
177             nmake -f makefile.vc CXXFLAGS="$cxxflags" $@
178         fi
179         cd $olddir
180     else
181         if [ -f $dir/GNUmakefile ]; then
182             make -C $dir -f GNUmakefile $MAKE_ARGS CXXFLAGS="$cxxflags -fvisibility=hidden -fvisibility-inlines-hidden" $@
183         fi
184     fi
185     if [ $? != 0 ]; then
186         exit $? 
187     fi
188 }
189
190 # output the first parameter that is a dir and exists
191 function find_existing_dir {
192     for arg in $*; do
193         tester=$arg
194         if [ $OSTYPE == cygwin ]; then
195             tester=`cygpath -u $arg`
196         fi
197         if [ -d $tester ]; then
198             echo $arg
199             return
200         fi
201     done
202 }
203
204
205 olddir=$PWD
206
207 if [ $do_clean != 1 ]; then
208
209     mkdir -p $WEBKITOUTPUTDIR/build
210
211     if [ $do_bake == 1 ]; then
212         # bakefile stuff
213         cd $WK_ROOT/WebKit/wx
214         bakefile_gen
215     
216         # we need to do this because Bakefile doesn't know which
217         # platform it's running on with GNU format, and so it defaults
218         # to the standard Unix file endings and linker args.
219         if [ "${OSTYPE:0:6}" = "darwin" ]; then    
220             sed "s/libjscore.so/libjscore.dylib/" < $WK_ROOT/JavaScriptCore/GNUmakefile > temp
221             mv temp $WK_ROOT/JavaScriptCore/GNUmakefile
222             
223             sed "s/\-shared/\-dynamiclib/" < $WK_ROOT/JavaScriptCore/GNUmakefile > temp
224             mv temp $WK_ROOT/JavaScriptCore/GNUmakefile
225             
226             sed "s/\-shared/\-dynamiclib/" < $WK_ROOT/WebCore/GNUmakefile > temp
227             mv temp $WK_ROOT/WebCore/GNUmakefile
228             
229             sed "s/libwxwebkit.so/libwxwebkit.dylib/" < $WK_ROOT/WebKit/wx/GNUmakefile > temp
230             mv temp $WK_ROOT/WebKit/wx/GNUmakefile
231             
232             sed "s/\-shared/\-dynamiclib/" < $WK_ROOT/WebKit/wx/GNUmakefile > temp
233             mv temp $WK_ROOT/WebKit/wx/GNUmakefile
234         fi
235     fi
236
237     if [ $do_prep == 1 ]; then
238         # Other preparation steps
239         
240         # since the buildbot will wipe the build tree clean sometimes, we need to reinstall
241         # the dependencies if they aren't installed.
242         if [ "${OSTYPE:0:6}" == "darwin" ]; then
243             $WK_ROOT/WebKitTools/wx/install-unix-extras
244         fi
245         
246         
247         export CREATE_HASH_TABLE="$WK_ROOT/JavaScriptCore/create_hash_table"
248         cd $WK_ROOT/JavaScriptCore
249         mkdir -p DerivedSources/JavaScriptCore
250         cd DerivedSources/JavaScriptCore
251         
252         make -f ../../DerivedSources.make JavaScriptCore=../.. BUILT_PRODUCTS_DIR=../.. all FEATURE_DEFINES="ENABLE_DATABASE ENABLE_XSLT ENABLE_JAVASCRIPT_DEBUGGER"
253         if [ $? != 0 ]; then
254             exit 1
255         fi
256     
257         cd $WK_ROOT/WebCore
258         mkdir -p DerivedSources/WebCore
259         cd DerivedSources/WebCore
260         make -f ../../DerivedSources.make all WebCore=../.. SOURCE_ROOT=../.. FEATURE_DEFINES="ENABLE_DATABASE ENABLE_XSLT ENABLE_JAVASCRIPT_DEBUGGER"
261         if [ $? != 0 ]; then
262             exit 1
263         fi
264     fi
265 fi
266
267
268 if [ $do_build == 1 -o $do_clean == 1 ]; then   
269     WXGC_DEFINE=""
270     EXTRA_CPPFLAGS=""
271     
272     if [ "${OSTYPE:0:6}" == "cygwin" ]; then
273         PLATFORM_OS="win"
274     elif [ "${OSTYPE:0:6}" == "darwin" ]; then
275         PLATFORM_OS="mac"
276         EXTRA_CPPFLAGS="-DMAC_OS_X_VERSION_MIN_REQUIRED=1040"
277         use_wxgc=1
278     else
279         PLATFORM_OS="linux"
280         use_wxgc=1
281     fi
282
283     if [ $use_wxgc == 1 ]; then
284         WXGC_DEFINE="-DWTF_USE_WXGC=1"
285     fi
286     WX_EXT=
287     if [ "${OSTYPE:0:6}" == "cygwin" -a $wxdebug == 1 ]; then
288         WX_EXT=d
289     fi
290     if [ $wxpython == 1 ]; then
291         other_args=WX_PYTHON=1
292         WX_EXT=h
293         wxdebug=1
294     fi
295
296     WINDEPS="$WINDEPS $WXWIN/lib/vc_dll/wxmsw28u${WX_EXT}_core_vc.dll $WXWIN/lib/vc_dll/wxbase28u${WX_EXT}_vc.dll"
297     
298     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 
299
300     mkdir -p $WEBKITOUTPUTDIR/JavaScriptCore
301     cp -p $WK_ROOT/JavaScriptCore/API/*.h $WEBKITOUTPUTDIR/JavaScriptCore/
302
303     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
304     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 
305     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 
306     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
307
308     if [ $do_clean == 1 ]; then
309         rm -rf $WK_ROOT/JavaScriptCore/DerivedSources
310         rm -rf $WK_ROOT/WebCore/DerivedSources
311         rm -rf $WK_ROOT/WebCore/include/JavaScriptCore
312     fi
313
314     if [ $do_build == 1 ]; then 
315         if [ "${OSTYPE:0:6}" = "darwin" ]; then
316             cd  $WEBKITOUTPUTDIR
317             mkdir -p wxBrowser.app/Contents/MacOS
318             mkdir -p wxBrowser.app/Contents/Frameworks
319             cp wxBrowser wxBrowser.app/Contents/MacOS
320             install_name_tool -change libwxwebkit.dylib @executable_path/../Frameworks/libwxwebkit.dylib wxBrowser.app/Contents/MacOS/wxBrowser
321             if [ ! -f "$WEBKITOUTPUTDIR/libwxwebkit.dylib" ]; then
322                 ln -s $WEBKITOUTPUTDIR/libwxwebkit.dylib wxBrowser.app/Contents/Frameworks
323             fi
324         fi
325         
326         if [ $wxpython == 1 ]; then
327             if [ -z $SWIG ]; then
328                 SWIG=`which swig`
329             fi
330
331             if [ ! -f "$SWIG" ]; then
332                 echo "ERROR: Cannot find SWIG. Make sure that SWIG 1.3.29 is located on your path.";
333                 exit 1;
334             fi
335     
336             cd $WK_ROOT/WebKit/wx/bindings/python
337             
338             SWIG_FLAGS=`python -c "import wx.build.config; import string; print string.join(wx.build.config.swig_args, ' ')"`
339             WEBKIT_INCLUDE="-I$WK_ROOT/WebKit/wx"
340             if [ "${OSTYPE:0:6}" == "cygwin" ]; then
341                 WEBKIT_INCLUDE="-I`cygpath -d $WK_ROOT/WebKit/wx`"
342             fi
343             
344             # Determine which include path to use for wxPython's *.i files
345             # Options are:
346             #    wxPython installed on a posix system
347             #    the wxPython win32 devel tarball
348             #    a wx source tree from a tarball where wxPython is in the wx dir
349             #    a wx source tree from SVN where wxPython is a sibling of the wx dir
350             WXPY_INCLUDE=`find_existing_dir \
351                 $WX_PREFIX/include/wx-2.9/wx/wxPython/i_files \
352                 $WX_PREFIX/include/wx-2.8/wx/wxPython/i_files \
353                 $WX_PREFIX/include/wx/wxPython/i_files \
354                 $WX_PREFIX/wxPython/src \
355                 $WX_PREFIX/../wxPython/src`
356             if [ -z $WXPY_INCLUDE ]; then
357                 echo "ERROR: Unable to find wxPython's *.i files"
358                 exit 1
359             fi
360             
361             # Run SWIG
362             $SWIG $SWIG_FLAGS -I$WXPY_INCLUDE $WEBKIT_INCLUDE -o webview.cpp webview.i
363             cp webview.py $WEBKITOUTPUTDIR/webview.py
364                                    
365             PY_INCLUDE=`python -c "import sys,distutils.sysconfig; sys.stdout.write(distutils.sysconfig.get_python_inc())"`
366             
367             if [ "${OSTYPE:0:6}" == "cygwin" ]; then
368                 PY_LIBDIR=`python -c "import distutils.sysconfig; import sys; sys.stdout.write(distutils.sysconfig.PREFIX)"`
369                 PY_LIBDIR="$PY_LIBDIR\\Libs"
370                 PY_LIB=`python -c "import sys; sys.stdout.write('python' + sys.version[:3])"`
371                 PY_LIB=`python -c "import sys; sys.stdout.write('$PY_LIB'.replace('.', ''))"`
372             else
373                 PY_LIB=`python-config --libs`
374                 PY_LIBDIR=`python-config --ldflags`
375             fi
376             
377             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" \
378                 WX_DEBUG=$wxdebug DEBUG=$debug WEBKIT_ROOT=$WK_ROOTDIR PLATFORM_OS=$PLATFORM_OS PYTHON_LIB=$PY_LIB PYTHON_LIBDIR=$PY_LIBDIR $other_args
379             if [ "${OSTYPE:0:6}" == "cygwin" ]; then
380                 if [ -f $WEBKITOUTPUTDIR/_webview.pyd -a -f $WEBKITOUTPUTDIR/_webview.dll ]; then
381                     rm $WEBKITOUTPUTDIR/_webview.pyd
382                     mv $WEBKITOUTPUTDIR/_webview.dll $WEBKITOUTPUTDIR/_webview.pyd
383                 fi
384             fi
385         fi
386         
387     
388         if [ "$OSTYPE" == "cygwin" ]; then
389             echo "Copying necessary DLLs to run test and sample applications..."
390             cd $WK_ROOT
391             cp $WINDEPS `cygpath -u $WEBKITOUTPUTDIR`
392             chmod +x `cygpath -u $WEBKITOUTPUTDIR/`*.dll
393             if [ -e `cygpath -u $WEBKITOUTPUTDIR/_webview.dll` ]; then
394                 mv `cygpath -u $WEBKITOUTPUTDIR/_webview.dll` `cygpath -u $WEBKITOUTPUTDIR/_webview.pyd`
395             fi
396         fi
397         
398         BROWSERAPP="wxBrowser"
399         
400         if [ "${OSTYPE:0:6}" == "darwin" ]; then
401             BROWSERAPP="wxBrowser.app/Contents/MacOS/wxBrowser"
402         fi
403     
404         echo ""
405         echo ""
406         echo "--- BUILD COMPLETE ---"
407         echo ""
408         echo "Next steps:"
409         echo ""
410         echo "-- Run '$WK_ROOT/WebKitTools/Scripts/run-javascriptcore-tests --wx' to ensure JSCore tests pass."
411         echo ""
412         echo "-- Run $WEBKITOUTPUTDIR/$BROWSERAPP to test your wxWebKit build."
413         echo ""
414         echo ""
415     fi
416 fi
417
418 if [ $do_clean == 1 ]; then
419     cd $WK_ROOT/WebKit/wx
420     bakefile_gen --clean
421 fi
422
423 cd $olddir