bee52977f73f457757cb41e5de3bf5622adf8391
[vlc.git] / extras / contrib / bootstrap
1 #!/bin/sh
2 # ***************************************************************************
3 # bootstrap : Set up config.mak
4 # ***************************************************************************
5 # Copyright (C) 2003-2009 the VideoLAN team
6 # $Id$
7 #
8 # Authors: Christophe Massiot <massiot@via.ecp.fr>
9 #          Derk-Jan Hartman <hartman at videolan dot org>
10 #          Felix Paul K├╝hne <fkuehne at videolan dot org>
11 #
12 # This program is free software; you can redistribute it and/or modify
13 # it under the terms of the GNU General Public License as published by
14 # the Free Software Foundation; either version 2 of the License, or
15 # (at your option) any later version.
16 #
17 # This program is distributed in the hope that it will be useful,
18 # but WITHOUT ANY WARRANTY; without even the implied warranty of
19 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 # GNU General Public License for more details.
21 #
22 # You should have received a copy of the GNU General Public License
23 # along with this program; if not, write to the Free Software
24 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
25 # ***************************************************************************
26
27 LANG=C
28 export LANG
29 set -e
30 set +x
31
32 usage()
33 {
34 cat << EOF
35 usage: $0 [-t target] [-d distro] [-b buildir] [-i installdir]
36
37 OPTIONS:
38    -t target     Force target to "target"
39    -d distro     Force distro to "distro"
40    -b buildir    Set build dir to "builddir"
41    -i installdir Install to "installdir"
42    -h            Show some help
43 EOF
44 }
45
46 add_makefile_cfg()
47 {
48     echo $1 >> "${config_mak}"
49 }
50
51 error()
52 {
53     echo "[contrib] ERROR: $1"
54 }
55
56 info()
57 {
58     echo "[contrib] $1"
59 }
60
61 DISTRO=
62 BUILDDIR=.
63
64 while getopts "ht:d:b:i:" OPTION
65 do
66      case $OPTION in
67          h)
68              usage
69              exit 1
70              ;;
71          t)
72              TARGET=$OPTARG
73              ;;
74          d)
75              DISTRO=$OPTARG
76              ;;
77          b)
78              BUILDDIR=$OPTARG
79              ;;
80          i)
81              PREFIX=$OPTARG
82              ;;
83          ?)
84              usage
85              exit 1
86              ;;
87      esac
88 done
89 shift $(($OPTIND - 1))
90
91 if [ "x$1" != "x" ]; then
92     error "Fallback to old command line switch, use the -t option now"
93     TARGET="$1"
94 fi
95 if [ "x$2" != "x" ]; then
96     usage
97     exit 1
98 fi
99
100 BUILD=`gcc -dumpmachine`
101
102 if test "x$TARGET" = "x"; then
103     TARGET="$BUILD"
104     info "No target specified, using '$TARGET'"
105 fi
106
107 if test "x$PREFIX" = "x"; then
108     PREFIX="`pwd`/hosts/$TARGET"
109     info "No install dir specified, using '$PREFIX'"
110 fi
111
112 # Make sure prefix is absolute and existing
113 mkdir -p "${PREFIX}"
114 PREFIX=`cd "${PREFIX}" && pwd`
115 mkdir -p "${PREFIX}/share/aclocal" # aclocal needs this dir to exist
116
117 #
118 # Set up build dir
119 #
120
121 mkdir -p "${BUILDDIR}"
122
123 # Install build dir makefile
124 ln -sf "`pwd`/contrib.mak" "${BUILDDIR}/Makefile"
125
126 # Create the 'build-src' folder to build from source
127 mkdir -p "${BUILDDIR}/build-src"
128 ln -sf "`pwd`/src/contrib-src.mak" "${BUILDDIR}/build-src/Makefile"
129 ln -sf "`pwd`/src/packages.mak" "${BUILDDIR}/build-src/packages.mak"
130 ln -sf "`pwd`/src/Patches" "${BUILDDIR}/build-src/Patches"
131
132 # Create config.mak
133 config_mak="${BUILDDIR}/config.mak"
134 rm -f "${config_mak}"
135 {
136     echo "# Automatically generated by bootstrap."
137     echo "# Make changes if you know what you're doing."
138 } > "${config_mak}"
139
140 # Create distro.mak
141 distro_mak="${BUILDDIR}/distro.mak"
142 rm -f "${distro_mak}"
143 {
144     echo "# Automatically generated by bootstrap"
145     echo "# Make changes if you know what you're doing."
146 } > "${distro_mak}"
147
148 if test "$TARGET" != "$BUILD"; then
149     test -z "$CC"    && CC="${TARGET}-gcc"
150     test -z "$CXX"   && CXX="${TARGET}-g++"
151     test -z "$LD"    && LD="${TARGET}-ld"
152     test -z "$RANLIB"&& RANLIB="${TARGET}-ranlib"
153     test -z "$AR"    && AR="${TARGET}-ar"
154     test -z "$STRIP" && STRIP="${TARGET}-strip"
155 fi
156
157 case $TARGET in
158     *powerpc*|*ppc*)
159          ARCH="ppc"
160      ;;
161     *86_64*)
162           ARCH="x86_64"
163      ;;
164     *86*)
165           ARCH="i386"
166      ;;
167     arm*eabi)
168           ARCH="armel"
169      ;;
170     arm*)
171           ARCH="arm"
172      ;;
173 esac
174 add_makefile_cfg "ARCH = $ARCH"
175
176 # Check the HAVE_{OS}
177 case $TARGET in
178     *darwin*)
179         add_makefile_cfg "HAVE_DARWIN_OS = 1"
180         add_makefile_cfg "HAVE_BSD = 1"
181     ;;
182     *linux*)
183         add_makefile_cfg "HAVE_LINUX = 1"
184     ;;
185     *bsd*)
186         add_makefile_cfg "HAVE_BSD = 1"
187     ;;
188     *wince*)
189         add_makefile_cfg "HAVE_WINCE = 1"
190     ;;
191 esac
192
193 case $TARGET in
194     ppc-darwin|*-apple-darwin8)
195         error "Your version of Mac OS X is too old!"
196         error "Compiling and running VLC requires 10.5.x or later"
197         exit 1
198     ;;
199     powerpc-apple-darwin9)
200         DISTRO=darwin
201         HAVE_DARWIN_32=1
202
203         CFLAGS_TUNING=" -arch ppc -mtune=G4"
204         EXTRA_LDFLAGS=" -arch ppc"
205
206         # FIXME - this one seems to be redundant?
207         LD="ld -arch ppc -syslibroot \${MACOSX_SDK} -mmacosx-version-min=\${SDK_TARGET}"
208     ;;
209     i686-apple-darwin*)
210         DISTRO=darwin
211         HAVE_DARWIN_32=1
212
213         CFLAGS_TUNING=" -march=prescott -mtune=generic -arch i386 -m32"
214         EXTRA_LDFLAGS=" -arch i386"
215
216         add_makefile_cfg "HAVE_DARWIN_OS_ON_INTEL = 1"
217         if test $TARGET = "i686-apple-darwin10"; then
218             add_makefile_cfg "HAVE_DARWIN_10 = 1"
219         fi
220     ;;
221     x86_64-apple-darwin*)
222         DISTRO=darwin64
223         HAVE_DARWIN_64=1
224
225         CFLAGS_TUNING=" -march=core2 -mtune=core2 -m64 -arch x86_64"
226         EXTRA_LDFLAGS=" -arch x86_64"
227
228         # FIXME - is this stuff needed?
229         LD="ld"
230         RANLIB="ranlib"
231         AR="ar"
232         STRIP="strip"
233
234         add_makefile_cfg "HAVE_DARWIN_OS_ON_INTEL = 1"
235         add_makefile_cfg "PATH = /bin:/usr/bin:/usr/local/bin"
236         if test $TARGET = "x86_64-apple-darwin10"; then
237             add_makefile_cfg "HAVE_DARWIN_10 = 1"
238         fi
239     ;;
240     *mingw32ce)
241         add_makefile_cfg "PKG_CONFIG_PATH = \$(PREFIX)/lib/pkgconfig"
242         EXTRA_CPPFLAGS=" -D_WIN32_WCE=0x0500"
243         DISTRO=wince
244     ;;
245     *64-*mingw*)
246         add_makefile_cfg "HAVE_WIN32 = 1"
247         add_makefile_cfg "PKG_CONFIG_PATH = \$(PREFIX)/lib/pkgconfig"
248         EXTRA_CFLAGS="-O3"
249         DISTRO=win64
250     ;;
251     *mingw32*)
252         add_makefile_cfg "PKG_CONFIG_PATH = \$(PREFIX)/lib/pkgconfig"
253         EXTRA_CFLAGS=" -O3 -march=i686 -mtune=generic"
254         DISTRO=win32
255     ;;
256     i686-pc-cygwin)
257         add_makefile_cfg "HAVE_CYGWIN = 1"
258         CC="gcc -mno-cygwin -isystem /usr/include/mingw"
259         CXX="g++ -mno-cygwin -isystem /usr/include/mingw"
260         TARGET=`$CC -dumpmachine`
261         EXTRA_CFLAGS=" -mno-cygwin -isystem /usr/include/mingw"
262         EXTRA_CPPFLAGS=" -mno-cygwin -isystem /usr/include/mingw"
263         EXTRA_LDFLAGS=" -mno-cygwin"
264         add_makefile_cfg "PKG_CONFIG_PATH = \$(PREFIX)/lib/pkgconfig"
265         DISTRO=win32
266     ;;
267     arm-wince-pe)
268         add_makefile_cfg "PKG_CONFIG_PATH = \$(PREFIX)/lib/pkgconfig"
269         EXTRA_CPPFLAGS=" -D_WIN32_WCE"
270         DISTRO=wince
271     ;;
272     armeb-linux-uclibc)
273         add_makefile_cfg "HAVE_UCLIBC = 1"
274         add_makefile_cfg "HAVE_BIGENDIAN = 1"
275         EXTRA_CFLAGS="-Os -march=armv5 -msoft-float"
276     ;;
277     arm-none-linux-gnueabi)
278         if test -f /etc/maemo_version; then
279             DISTRO=maemo
280             EXTRA_CFLAGS=" -mcpu=cortex-a8 -mtune=cortex-a8 -march=armv7-a"
281             EXTRA_CFLAGS="$EXTRA_CFLAGS -mfpu=neon -mfloat-abi=softfp"
282             EXTRA_CFLAGS="$EXTRA_CFLAGS -O3 -fno-tree-vectorize"
283         else
284             EXTRA_CFLAGS="-msoft-float"
285         fi
286     ;;
287     *86_64*linux*)
288         EXTRA_CFLAGS=" -fPIC"
289         EXTRA_CPPFLAGS=" -fPIC"
290         EXTRA_LDFLAGS=" -L/usr/lib64"
291         add_makefile_cfg "LIBRARY_PATH = /usr/lib64"
292         add_makefile_cfg "PKG_CONFIG_PATH = /usr/lib64/pkgconfig"
293         add_makefile_cfg "PKG_CONFIG_LIBDIR = /usr/lib64/pkgconfig"
294     ;;
295 esac
296
297 #
298 # Fix up the Distro
299 #
300
301 if test -z "${DISTRO}" -a "$TARGET" = "$BUILD"; then
302     if test -d "/usr/lib/pkgconfig"; then
303         if test -z "$PKG_CONFIG_PATH"; then
304             add_makefile_cfg "PKG_CONFIG_PATH = /usr/lib/pkgconfig"
305         fi
306         if test -z "$PKG_CONFIG_LIBDIR"; then
307             add_makefile_cfg "PKG_CONFIG_LIBDIR = /usr/lib/pkgconfig"
308         fi
309     fi
310     # Try to match distribution
311     if test -f /etc/fedora-release; then
312         DISTRO=fedora
313     elif test -f /etc/maemo_version; then
314         DISTRO=maemo
315     elif test -f /etc/debian_version; then
316         # NOTE: check for Debian *after* its derivatives
317         DISTRO=debian
318     fi
319 fi
320
321 # Default Unix-like systems
322 test -z "${DISTRO}" && DISTRO=unix
323
324 cat src/Distributions/"${DISTRO}".mak >> "${distro_mak}"
325
326 #
327 # Distro specific settings
328 #
329
330 case "$DISTRO" in
331   ios)
332     if test -z "$IOS_SDK_ROOT"; then
333         error "The bootstrap script requires the IOS_SDK_ROOT environment "
334         error "variable to be set when building for iOS"
335         exit 1
336     fi
337     add_makefile_cfg "IOS_SDK_ROOT = ${IOS_SDK_ROOT}"
338     ;;
339   darwin*)
340     SDK_TARGET=10.5
341     HAVE_DARWIN_9=1
342     EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -isysroot \${MACOSX_SDK} -Wl,-syslibroot,\${MACOSX_SDK} -mmacosx-version-min=\${SDK_TARGET}"
343     EXTRA_CFLAGS="${EXTRA_CFLAGS} -D\${ENVP} -isysroot \${MACOSX_SDK} -mmacosx-version-min=\${SDK_TARGET}"
344     CC="/Developer/usr/bin/gcc-4.2"
345     CXX="/Developer/usr/bin/g++-4.2"
346     add_makefile_cfg "PATH = /bin:/usr/bin:/usr/local/bin"
347     add_makefile_cfg "SDK_TARGET = ${SDK_TARGET}"
348     add_makefile_cfg "ENVP = MACOSX_DEPLOYMENT_TARGET=${SDK_TARGET}"
349     add_makefile_cfg "MACOSX_SDK = /Developer/SDKs/MacOSX${SDK_TARGET}.sdk"
350
351     if ! test -e /Developer/SDKs; then
352         error "Your Developer Tools' SDKs were not found.\nYou need to add extra symbolic links to /Developer to achieve correctly\nbuilt contribs.\nHave a look at the OSX-Compile-HOWTO for details." >&2
353         exit 1
354     fi
355     ;;
356 esac
357
358 # Save passed flags
359 EXTRA_CFLAGS="$EXTRA_CFLAGS $CFLAGS"
360 EXTRA_LDFLAGS="$EXTRA_LDFLAGS $LDFLAGS"
361 EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS $CPPFLAGS"
362 EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS $CXXFLAGS"
363
364 uppercase_distro=`echo "$DISTRO" | tr '[:lower:]' '[:upper:]'`
365 add_makefile_cfg "HAVE_${uppercase_distro} = 1"
366 add_makefile_cfg "BUILD = $BUILD"
367 add_makefile_cfg "HOST = $TARGET"
368 add_makefile_cfg "SRCDIR = `pwd`"
369 add_makefile_cfg "PREFIX = ${PREFIX}"
370 add_makefile_cfg "VLCROOTDIR = `pwd`/../.."
371
372 ln -sfn hosts/$TARGET build
373
374 add_makefile_cfg "CC = ${CC}"
375 add_makefile_cfg "CXX = ${CXX}"
376 add_makefile_cfg "LD = ${LD}"
377 add_makefile_cfg "RANLIB = ${RANLIB}"
378 add_makefile_cfg "AR = ${AR}"
379 add_makefile_cfg "STRIP = ${STRIP}"
380 add_makefile_cfg "EXTRA_CFLAGS = ${CFLAGS_TUNING} ${EXTRA_CFLAGS}"
381 add_makefile_cfg "EXTRA_CPPFLAGS = ${EXTRA_CPPFLAGS} -isystem \$(PREFIX)/include"
382 add_makefile_cfg "EXTRA_LDFLAGS = ${EXTRA_LDFLAGS}"
383 add_makefile_cfg "EXTRA_PATH = ${EXTRA_PATH}"
384
385 #CMAKE
386 if test "$TARGET" != "$BUILD"; then
387     toolchain_cmake="${BUILDDIR}/toolchain.cmake"
388     if test ${DISTRO} = "win32"; then
389         echo "SET(CMAKE_SYSTEM_NAME Windows)" >> "${toolchain_cmake}"
390     fi
391     echo "SET(CMAKE_C_COMPILER ${CC})" >> "${toolchain_cmake}"
392     echo "SET(CMAKE_CXX_COMPILER ${CXX})" >> "${toolchain_cmake}"
393     echo "SET(CMAKE_FIND_ROOT_PATH  `pwd` )" >> "${toolchain_cmake}"
394     echo "set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)" >> "${toolchain_cmake}"
395     echo "set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)" >> "${toolchain_cmake}"
396     echo "set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)" >> "${toolchain_cmake}"
397 fi
398
399 if wget --version >/dev/null 2>&1; then
400     add_makefile_cfg "WGET = \"`which wget`\" -c --passive"
401 elif test -z `curl --version >/dev/null 2>&1`; then
402     add_makefile_cfg "WGET = \"`which curl`\" -L -O"
403 else
404     error "You need at least wget or curl to fetch the packages."
405     exit 1
406 fi
407
408 if svn --version >/dev/null 2>&1; then
409     add_makefile_cfg "SVN = \"`which svn`\""
410 else
411     error "You do not have a subversion client in your PATH."
412 fi
413
414 if git --version>/dev/null 2>&1; then
415     add_makefile_cfg "GIT = \"`which git`\""
416 else
417     error "You do not have a Git client in your PATH."
418 fi
419
420 if test -z "$CONTRIBS_RELEASE"; then
421     add_makefile_cfg "EXTRA_CFLAGS += -DNDEBUG"
422     info "*****************************************************************"
423     info "* If you need contribs with all debug information, run this     *"
424     info "* line and compile the libraries on your own.                   *"
425     info "* CONTRIBS_RELEASE=no ./bootstrap                               *"
426     info "*****************************************************************"
427 fi
428
429 if test $HAVE_DARWIN_9; then
430     add_makefile_cfg "HAVE_DARWIN_9 = 1"
431     if ! /Developer/usr/bin/gcc-4.2 --version>/dev/null 2>&1; then
432         error "You do not have GCC-4.2 instelled, compilation WILL FAIL."
433     fi
434 fi
435
436 if test $HAVE_DARWIN_32; then
437     add_makefile_cfg "HAVE_DARWIN_32 = 1"
438     info "*****************************************************************"
439     info "* VLC will be compiled in 32bit mode.                           *"
440     info "*                                                               *"
441     info "* Re-run with the x86_64-apple-darwin* argument to turn on      *"
442     info "* 64bit compilation for Intel-based Macs, whereas * is either   *"
443     info "* 9 or 10 depending on your Darwin version.                     *"
444     info "* There is NO PPC64 support right now.                          *"
445     info "*****************************************************************"
446 fi
447
448 if test $HAVE_DARWIN_64; then
449     add_makefile_cfg "HAVE_DARWIN_64 = 1"
450     info
451     info "*****************************************************************"
452     info "* VLC will be compiled in 64bit mode using the 10.5 SDK.        *"
453     info "*****************************************************************"
454 fi
455
456 case `uname` in
457     Linux)
458         CPUS=`grep -c ^processor /proc/cpuinfo`
459      ;;
460     Darwin)
461         CPUS=`sysctl hw.ncpu|cut -d: -f2`
462     ;;
463     *)
464         CPUS=1  # default
465      ;;
466 esac
467 add_makefile_cfg "MAKEFLAGS += -j$CPUS"
468
469 info "Using $CPUS processor(s)"