]> git.tdb.fi Git - builder.git/blobdiff - bootstrap.sh
Refactor transitive dependencies to work on all targets
[builder.git] / bootstrap.sh
index dd0e8a6e09748f5f8e9eddc2f0caaeb2bcef6bd2..b647568cb0347aa3eb1ab77193ef7581af5fc01b 100755 (executable)
@@ -1,18 +1,28 @@
 #!/bin/sh
-# $Id$
 
 set -e
 
+SOURCEDIRS="source/lib source/bootstrap plugins/base plugins/gnu"
 INCLUDEDIR=temp/bootstrap/include
 REQUIRED="core datafile"
-CFLAGS="-I$INCLUDEDIR `pkg-config --cflags sigc++-2.0`"
+CFLAGS="-std=c++11 -iquote . -I$INCLUDEDIR `pkg-config --cflags sigc++-2.0`"
 LIBS="`pkg-config --libs sigc++-2.0` -lpthread"
 MACHINE="`uname -m`"
+SYSTEM="`uname -s`"
 if [ "$MACHINE" = "x86_64" ]; then
        MULTIARCH="x86_64-linux-gnu"
 else
        MULTIARCH="i386-linux-gnu"
 fi
+if [ "$SYSTEM" = "Darwin" -o "$SYSTEM" = "FreeBSD" ]; then
+       if which clang++ >/dev/null; then
+               COMPILER="clang++"
+       else
+               COMPILER="g++"
+       fi
+else
+       COMPILER="g++"
+fi
 if [ -e /usr/lib/libdl.so -o -e /usr/lib/$MULTIARCH/libdl.so ]; then
        LIBS="$LIBS -ldl"
 fi
@@ -36,6 +46,18 @@ while [ "$1" ]; do
        --keep-temp)
                KEEP_TEMP=yes
                ;;
+       --compiler)
+               shift
+               COMPILER="$1"
+               CUSTOM_COMPILER=yes
+               ;;
+       --compiler=*)
+               COMPILER="${1#--compiler=}"
+               CUSTOM_COMPILER=yes
+               ;;
+       --debug)
+               DEBUG=-g
+               ;;
        *)
                echo "Unknown option $1"
                exit 1
@@ -45,22 +67,41 @@ while [ "$1" ]; do
 done
 
 if [ -z "$LIBPATH" -o "${LIBPATH%%/*}" ]; then
-       LIBPATH=`pwd`/${LIBPATH:-..}
+       LIBPATH="$PWD/${LIBPATH:-..}"
 fi
 
 rm -rf "$INCLUDEDIR"
 mkdir -p "$INCLUDEDIR/msp"
 
-sources=source/*.cpp
+sources=`find $SOURCEDIRS -name '*.cpp'`
+
+mkdir -p "$INCLUDEDIR/msp/builder"
+ln -sf "$PWD/source/lib"/*.h "$INCLUDEDIR/msp/builder/"
 
+use_overlays="unix generic"
 missing=""
 for i in $REQUIRED; do
        path=`ls -1d $LIBPATH/*$i* 2>/dev/null | head -n1`
        if [ -z "$path"  -o ! -d "$path/source" ]; then
                missing="$missing msp$i"
        else
-               headers=`find $path/source \( -name windows -prune \) -o \( -name '*.h' -print \)`
-               for j in $headers; do
+               if [ "`echo $path/source/*.cpp`" = "$path/source/*.cpp" ]; then
+                       subdirs=`find "$path/source" -mindepth 1 -maxdepth 1 -type d`
+               else
+                       subdirs="$path/source"
+               fi
+
+               check_overlay=""
+               for j in $use_overlays; do
+                       [ -z "$check_overlay" ] || check_overlay="$check_overlay -o "
+                       check_overlay="${check_overlay}-name $j"
+               done
+               findargs="$subdirs"
+               if [ "$check_overlay" ]; then
+                       findargs="$findargs -mindepth 1 ( -type d ! ( $check_overlay ) -prune -false ) -o "
+               fi
+
+               for j in `find $findargs -name '*.h'`; do
                        rel=${j#$path/source/}
                        comp=${rel%%/*}
                        if [ "$comp" = "$rel" ]; then
@@ -69,7 +110,7 @@ for i in $REQUIRED; do
                        mkdir -p "$INCLUDEDIR/msp/$comp"
                        ln -sf $j "$INCLUDEDIR/msp/$comp/"
                done
-               sources="$sources `find $path/source \( -name windows -prune \) -o \( -name '*.cpp' -print \)`"
+               sources="$sources `find $findargs -name '*.cpp'`"
        fi
 done
 
@@ -83,17 +124,24 @@ fi
 echo "Compiling builder-stage1.  This may take several minutes."
 objects=""
 for i in $sources; do
-       obj=`mktemp --tmpdir=temp/bootstrap XXXXXX.o`
+       obj=`mktemp temp/bootstrap/XXXXXX`
+       mv $obj $obj.o
+       obj=$obj.o
        dir=${i%/*}
-       dir=${dir%/unix}
        flags="$CFLAGS"
-       if [ -d "$dir/unix" ]; then
-               flags="$flags -iquote $dir -iquote $dir/unix"
-       fi
-       g++ -c $i -o $obj $flags
+       for j in $use_overlays; do
+               dir=${dir%/$j}
+               if [ -d "$dir/$j" ]; then
+                       flags="$flags -iquote $dir -iquote $dir/$j"
+                       break
+               fi
+       done
+       echo "Compiling $i"
+       $COMPILER -c $DEBUG $i -o $obj $flags
        objects="$objects $obj"
 done
-g++ $objects -o builder-stage1 $LIBS
+echo "Linking builder-stage1"
+$COMPILER $objects -o builder-stage1 $LIBS
 
 if [ "$KEEP_TEMP" != "yes" ]; then
        echo "Cleaning up"
@@ -105,4 +153,7 @@ ARGS=
 if [ "$PREFIX" ]; then
        ARGS="$ARGS --prefix='$PREFIX'"
 fi
+if [ "$CUSTOM_COMPILER" = "yes" ]; then
+       ARGS="$ARGS --compiler=$COMPILER"
+fi
 eval "./builder-stage1 $ARGS"