#!/bin/bash ##################################################################### # # # Compiles Faust programs to Max/MSP # # (c) Grame, 2010 # # # ##################################################################### createInfoPList() { ( echo '' echo '' echo '' echo '' echo ' CFBundleExecutable' echo " $1" echo ' CFBundleName' echo " $1" echo ' CFBundlePackageType' echo ' iLaX' echo '' echo '' ) > "$2" } #------------------------------------------------------------------- # Analyze command arguments : # faust options -> OPTIONS # if -omp : -openmp or -fopenmp -> OPENMP # 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 for p in $@; do if [ "$p" = -omp ]; then if [[ $CXX == "icpc" ]]; then OMP="-openmp" else OMP="-fopenmp" fi fi if [ "$p" = -icc ]; then ignore=" " elif [ ${p:0:1} = "-" ]; then OPTIONS="$OPTIONS $p" elif [[ -e "$p" ]]; then FILES="$FILES $p" else OPTIONS="$OPTIONS $p" fi done #------------------------------------------------------------------- # Check darwin specifics # if [[ $(uname) == Darwin ]]; then SPEC="-spec macx-g++" EXT="~.mxo" fi #------------------------------------------------------------------- # compile the *.dsp files # PATH=$PATH:/usr/local/bin for p in $FILES; do #INC=-I/usr/local/include/c74support/max-includes -I/usr/local/include/c74support/msp-includes CC=g++ CUR=$(pwd) f=$(basename "$p") SRCDIR=$(dirname "$p") # creates a temporary dir TDR=$(mktemp -d faust.XXX) TMP="$TDR/${f%.dsp}" mkdir "$TMP" # compile faust to c++ faust -a max-msp.cpp $OPTIONS "$SRCDIR/$f" -o "$TMP/${f%.dsp}.cpp" # compile c++ to binary ( cd "$TMP" install -d "${f%.dsp}$EXT/Contents/MacOS" $CC -arch i386 -fpascal-strings -fasm-blocks -g -O3 -I/usr/local/lib/faust -I/usr/local/include/c74support/max-includes -I/usr/local/include/c74support/msp-includes -c "${f%.dsp}.cpp" -o "${f%.dsp}.i386.o" $CC -framework MaxAPI -framework Carbon -framework MaxAudioAPI -arch i386 -Wl,-Y,1455 -bundle "${f%.dsp}.i386.o" -o "${f%.dsp}.i386~" #$CC -arch ppc -fpascal-strings -fasm-blocks -g -O3 -I/usr/local/lib/faust -I/usr/local/include/c74support/max-includes -I/usr/local/include/c74support/msp-includes -c "${f%.dsp}.cpp" -o "${f%.dsp}.ppc.o" #$CC -framework Carbon -framework MaxAPI -framework MaxAudioAPI -arch ppc -Wl,-Y,1455 -bundle "${f%.dsp}.ppc.o" -o "${f%.dsp}.ppc~" createInfoPList "${f%.dsp}~" "${f%.dsp}$EXT/Contents/Info.plist" #lipo -create "${f%.dsp}.i386~" "${f%.dsp}.ppc~" -output "${f%.dsp}$EXT/Contents/MacOS/${f%.dsp}~" lipo -create "${f%.dsp}.i386~" -output "${f%.dsp}$EXT/Contents/MacOS/${f%.dsp}~" ) > /dev/null rm -rf "$SRCDIR/${f%.dsp}$EXT" # Keep .dsp and .cpp files in the plug-in cp "$TMP/${f%.dsp}.cpp" "$TMP/${f%.dsp}$EXT" cp "$SRCDIR/$f" "$TMP/${f%.dsp}$EXT" cp -r "$TMP/${f%.dsp}$EXT" "$SRCDIR/${f%.dsp}$EXT" rm -rf "$TDR" # collect binary file name for FaustGIDE BINARIES="$BINARIES$SRCDIR/${f%.dsp}$EXT;" done echo $BINARIES