#!/bin/bash ##################################################################### # # # Compiles Faust programs to supercollider # # (c) Grame, 2010 # # # ##################################################################### #------------------------------------------------------------------- # Supercollider headers : path to the folder containing : # plugin_interface/, common/ and server/ headers # Possible path SC0=$SUPERCOLLIDER_HEADERS SC1="/usr/local/include/SuperCollider" SC2="/usr/local/include/supercollider" SC3="/usr/include/SuperCollider" SC4="/usr/include/supercollider" # check if directory exists if [ -d $SC0/plugin_interface ]; then SC=$SC0 elif [ -d $SC1 ]; then SC=$SC1 elif [ -d $SC2 ]; then SC=$SC2 elif [ -d $SC3 ]; then SC=$SC3 elif [ -d $SC4 ]; then SC=$SC4 else echo "Can't find SuperCollider headers" exit 1 fi echo Using SC Headers in $SC INCLUDE="-I$SC/plugin_interface/ -I$SC/common/ -I$SC/server/" if [ $# = 0 ]; then echo USAGE: echo "$0 [-d[ebug]] [-icc] [-omp] [-sd] file1.dsp [file2.dsp ...]" exit 1 fi #------------------------------------------------------------------- # Analyze command arguments : # faust options -> OPTIONS # if -omp : -openmp or -fopenmp -> OPENMP # if -d or -debug -> F2SC_DEBUG # if -sd or -synthdef -> SYNTHDEF # existing *.dsp files -> FILES # # PHASE 1 : Look for -icc option to force use of intel icc (actually icpc) # without having to configure CXX and CXXFLAGS for p in $@; do if [ "$p" = -icc ]; then CXX=icpc CXXFLAGS='-O3 -xT -ftz -fno-alias -fp-model fast=2' fi done #PHASE 2 : dispatch command arguments F2SC_DEBUG=0 SYNTHDEF="" for p in $@; do if [ "$p" = -omp ]; then if [[ $CXX == "icpc" ]]; then OMP="-openmp" else OMP="-fopenmp" fi fi if [ "$p" = -debug ] || [ "$p" = -d ]; then F2SC_DEBUG=1 elif [ "$p" = -sd ] || [ "$p" = -synthdef ]; then SYNTHDEF="--synthdef" elif [ "$p" = -icc ]; then ignore=" " elif [ ${p:0:1} = "-" ]; then OPTIONS="$OPTIONS $p" elif [[ -e "$p" ]]; then FILES="$FILES $p" else echo "*** Faust source-file '$p' not found" OPTIONS="$OPTIONS $p" fi done if [ $F2SC_DEBUG = 1 ]; then OUTDEV=/dev/tty DNDEBUG="" else OUTDEV=/dev/null DNDEBUG="-DNDEBUG" fi if [ "$FILES" = "" ]; then echo USAGE: echo "$0 [-d[ebug]] [-icc] [-omp] file1.dsp [file2.dsp ...]" exit 1 fi #------------------------------------------------------------------- # Check plateform specifics # if [[ $(uname) == Darwin ]]; then EXT="scx" SCFLAGS="-DNO_LIBSNDFILE -DSC_DARWIN $DNDEBUG -bundle " elif [[ $(uname) == Linux ]]; then EXT="so" SCFLAGS="-DNO_LIBSNDFILE -DSC_LINUX $DNDEBUG -shared -fPIC" else echo "unsupported plateform" exit 1 fi #------------------------------------------------------------------- # compile the *.dsp files # for p in $FILES; do CUR=$(pwd) f=$(basename "$p") SRCDIR=$(dirname "$p") # creates a temporary dir TDR=$(mktemp -d faust.XXX) TMP=$TDR/${f%.dsp} mkdir "$TMP" # compile the .dsp file to c++ and xml faust -xml "$SRCDIR/$f" -o /dev/null; mv "$SRCDIR/$f.xml" $TMP/ faust -a supercollider.cpp $OPTIONS "$SRCDIR/$f" -o "$TMP/${f%.dsp}.cpp" # compile c++ to binary; --prefix should be same as in ../../examples/Makefile.sccompile ( cd "$TMP" faust2sc --prefix=Faust $SYNTHDEF $f.xml > "${f%.dsp}.sc" 2>$OUTDEV ${CXX=g++} -O3 $SCFLAGS -I$CUR $INCLUDE $CXXFLAGS $OMP -Dmydsp=${f%.dsp} -o ${f%.dsp}.$EXT ${f%.dsp}.cpp )> $OUTDEV ## move the produced files from tmp to source dir cp "$TMP/${f%.dsp}.$EXT" "$SRCDIR/${f%.dsp}.$EXT" cp "$TMP/${f%.dsp}.sc" "$SRCDIR/${f%.dsp}.sc" if [ $F2SC_DEBUG = 1 ]; then echo "Retaining intermediate products directory '$TDR'" OUTDEV=/dev/tty else rm -rf "$TDR" fi # collects all the files produced BINARIES="$BINARIES$SRCDIR/${f%.dsp}.$EXT;$SRCDIR/${f%.dsp}.sc;" done # return the binaries names echo "$BINARIES"