3f0ae3bc7e4ddaff95515e09788692964a6ab111
[aubio.git] / scripts / build_mingw
1 #! /bin/bash
2
3 # This script cross compiles aubio for windows using mingw, four times:
4 #
5 #  - 32 and 64 bits with no external dependencies
6 #  - 32 and 64 bits against ffmpeg
7 #
8 # On debian or ubuntu, you will want to 'apt-get install gcc-mingw-w64'
9
10 set -e
11 set -x
12
13 source VERSION
14 VERSION="$AUBIO_MAJOR_VERSION.$AUBIO_MINOR_VERSION.$AUBIO_PATCH_VERSION"
15 VERSION+="$AUBIO_VERSION_STATUS"
16
17 FFMPEG_BUILDS_URL="https://ffmpeg.zeranoe.com/builds"
18 FFMPEG_DEFAULT="20170315-6c4665d"
19
20 # define some default CFLAGS
21 DEF_CFLAGS="-Os -I/usr/share/mingw-w64"
22 DEF_LDFLAGS=""
23
24 WAFOPTS=""
25 # disable external deps to make sure we don't try to use the host package
26 WAFOPTS+=" --disable-samplerate --disable-jack --disable-sndfile"
27 # enable ffmpeg build
28 WAFOPTS+=" --disable-avcodec"
29 # install without a prefix
30 WAFOPTS+=" --prefix=/"
31 # compile the tests, but fake running them
32 # passing this option WAFOPTS fails (escaping?), added in actual waf call below
33 #WAFOPTS+=" --testcmd='echo %s'"
34
35 # debugging
36 #WAFOPTS+=" -v"
37 #WAFOPTS+=" -j1"
38 #WAFOPTS+=" --notests"
39
40 function fetch_ffpmeg() {
41   ## manually add ffmpeg (no pkg-config .pc files in bins)
42   [ -n "$FFMPEG_VERSION" ] || FFMPEG_VERSION=$FFMPEG_DEFAULT
43   FFMPEG_TARBALL="$PWD/ffmpeg-$FFMPEG_VERSION-$TARGET-dev.zip"
44   FFMPEG_BINARIES="${FFMPEG_TARBALL%%.zip}"
45   if [ ! -d "$FFMPEG_BINARIES" ]
46   then
47     if [ ! -f "$FFMPEG_TARBALL" ]
48     then
49       curl -O $FFMPEG_BUILDS_URL/$TARGET/dev/ffmpeg-$FFMPEG_VERSION-$TARGET-dev.zip
50     else
51       echo "using $FFMPEG_TARBALL"
52     fi
53     unzip -x $FFMPEG_TARBALL
54   else
55     echo "using $FFMPEG_BINARIES"
56   fi
57 }
58
59 function get_cflags() {
60   CFLAGS="$DEF_CFLAGS"
61   LDFLAGS="$DEF_LDFLAGS"
62   if [ -n "$WITH_FFMEG" ]
63   then
64     fetch_ffpmeg
65     CFLAGS+=" -DHAVE_LIBAV=1 -DHAVE_SWRESAMPLE=1"
66     CFLAGS+=" -I$FFMPEG_BINARIES/include"
67     LDFLAGS+=" -lavcodec -lavformat -lavutil -lswresample"
68     LDFLAGS+=" -L$FFMPEG_BINARIES/lib"
69   fi
70 }
71
72 function build_mingw() {
73   DESTDIR="$PWD/aubio-$VERSION-$TARGET"
74   [ -n "$WITH_FFMEG" ] && DESTDIR+="-ffmpeg"
75   [ -f $DESTDIR.zip ] && echo "Remove existing $DESTDIR.zip first" && exit 1
76   [ -d $DESTDIR ] && rm -rf $DESTDIR
77   WAFOPTS_TGT="$WAFOPTS --destdir=$DESTDIR"
78   WAFOPTS_TGT+=" --with-target-platform=$TARGET"
79   get_cflags
80   CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS" \
81     ./waf distclean configure build install $WAFOPTS_TGT --testcmd='echo %s'
82   zip -r $DESTDIR.zip `basename $DESTDIR`
83   rm -rf $DESTDIR
84   sha256sum $DESTDIR.zip > $DESTDIR.zip.sha256
85 }
86
87 function build_mingw32() {
88   TARGET=win32
89   export CC=i686-w64-mingw32-gcc
90   build_mingw
91 }
92
93 function build_mingw64() {
94   TARGET=win64
95   export CC=x86_64-w64-mingw32-gcc
96   build_mingw
97 }
98
99 # fetch waf if needed
100 [ -f "waf" ] || make getwaf
101
102 # first build without ffmpeg
103 build_mingw32
104 build_mingw64
105
106 # then build against ffmpeg
107 WITH_FFMEG=1
108 build_mingw32
109 build_mingw64
110
111 set +x
112 echo ""
113 echo "All done! The following files were generated:"
114 echo ""
115 ls -lart aubio*.zip*