ledger/acprep
2008-08-07 05:44:03 -04:00

300 lines
8.9 KiB
Bash
Executable file

#!/bin/sh
# acprep, version 3.0
#
# This script configures my ledger source tree on my Mac OS/X machine. This
# is not necessary, however, since I keep all the files necessary for building
# checked in to the source tree. Users can just type './configure && make'.
# This script simply sets up the compiler and linker flags for all the various
# build permutations I use for testing and profiling.
export AUTOCONF_VERSION=2.62
export AUTOMAKE_VERSION=1.10.1
touch AUTHORS COPYING ChangeLog
cmd=$(which glibtoolize 2>&1)
if [ -x "$cmd" ]; then
export LIBTOOLIZE="$cmd"
fi
COMMIT=$(git describe --all --long | sed 's/heads\///')
cat version.m4.in | sed "s/%VERSION%/$COMMIT/" > version.m4
autoreconf --force --install
SWITCHES=""
BOOST_SUFFIX=""
INCDIRS="-isystem /usr/local/include"
INCDIRS="$INCDIRS -isystem /opt/local/include"
INCDIRS="$INCDIRS -isystem /opt/local/include/libofx"
INCDIRS="$INCDIRS -isystem /usr/local/include/boost-1_35"
LDFLAGS=""
LIBDIRS="-L/usr/local/lib -L/opt/local/lib"
ARCHFLAGS="-arch i386 -arch ppc -isysroot /Developer/SDKs/MacOSX10.5.sdk"
PYTHON_HOME="/usr"
SYSTEM=$(uname -s)
if [ $SYSTEM = Linux ]; then
CXXFLAGS="-pthread"
elif [ $SYSTEM = Solaris ]; then
CXXFLAGS="-pthreads"
elif [ $SYSTEM = Darwin ]; then
CXXFLAGS=""
else
CXXFLAGS=""
fi
# Building the command-line tool as a shared library is a luxury,
# since there are no clients except a GUI tool which might use it (and
# that is built again anyway by Xcode).
CPPFLAGS="$INCDIRS"
CXXFLAGS="$CXXFLAGS -pipe"
LDFLAGS="$LDFLAGS $LIBDIRS"
LOCAL=false
# Warning flags
CXXFLAGS="$CXXFLAGS -Wall -ansi -Winvalid-pch"
CXXFLAGS="$CXXFLAGS -Wextra"
#CXXFLAGS="$CXXFLAGS -Weffc++"
CXXFLAGS="$CXXFLAGS -Wcast-align"
CXXFLAGS="$CXXFLAGS -Wcast-qual"
CXXFLAGS="$CXXFLAGS -Wconversion"
CXXFLAGS="$CXXFLAGS -Wfloat-equal"
CXXFLAGS="$CXXFLAGS -Wmissing-field-initializers"
CXXFLAGS="$CXXFLAGS -Wno-endif-labels"
CXXFLAGS="$CXXFLAGS -Wold-style-cast"
CXXFLAGS="$CXXFLAGS -Woverloaded-virtual"
CXXFLAGS="$CXXFLAGS -Wshorten-64-to-32"
CXXFLAGS="$CXXFLAGS -Wsign-compare"
CXXFLAGS="$CXXFLAGS -Wsign-promo"
CXXFLAGS="$CXXFLAGS -Wstrict-null-sentinel"
CXXFLAGS="$CXXFLAGS -Wwrite-strings"
# The following are options to prepare a developer tree of Ledger for
# building:
#
# --debug
#
# Build with debugging information. This doesn't slow things down by much,
# but gives you useful stack traces to mention in your bug reports.
# Recommended if you're not running a release version.
#
# --local
#
# Prepare for building in the same directory as the sources. This is
# required for using pre-compiled headers with the --devel option (see
# below). Otherwise, if you have a directory named ~/Products, Ledger will
# build itself there. There's no option for changing that directory yet, so
# just edit this script if you need to.
#
# --boost SUFFIX
#
# Use the boost library with the given SUFFIX. Check the Boost "Getting
# Started" documentation for what the different suffixes are and what they
# mean. Usually you can see the available suffixes on your system using
# something like this command:
#
# $ ls /usr/local/lib/libboost_date_time*
#
# Here's everything that's available on my machine right now:
#
# "" - dynamic optimized Boost library
# d - dynamic debug
# s - static optimized
# sd - static debug
# mt - multi-threaded optimized
# mt-d - multi-threaded debug
# mt-s - multi-threaded static optimized
# mt-sd - multi-threaded static debug
#
# Since Ledger does not use threading, I recommend using the static
# optimized library unless you wish to build with debugging enabled. If you
# want to do that, see the --devel switch below.
#
# --devel
#
# This means you want to build like the developer does, which means:
#
# * using pre-compiled headers
# * with glibc debugging enabled
# * static linking as much as possible
#
# The glibc debugging is the only tricky part, since you must have Boost
# compiled with _GLIBCXX_DEBUG defined also -- which it won't be on your
# system by default.
#
# So, you have to roll your own set of Boost debug libraries in order to
# support this. I like this because it gives me the most amount of safety
# and checking possible, which is great for testing. Here's how I build a
# super-debugging Boost:
#
# src $ git clone git://repo.or.cz/boost.git
# src $ git checkout -b v1.35.0 svn/Version_1_35_0
# src $ cd boost
# boost $ sudo bjam release --prefix=/usr/local/stow/boost_1_35_0 \
# --build-dir=$HOME/Products/boost_1_35_0 --toolset=darwin \
# architecture=combined install
# boost $ sudo bjam debug --prefix=/usr/local/stow/boost_1_35_0 \
# --build-dir=$HOME/Products/boost_1_35_0 --toolset=darwin \
# architecture=combined define=_GLIBCXX_DEBUG=1 install
# boost $ cd /usr/local/stow
# stow $ stow boost_1_35_0
#
# Of course, you'll need MacPorts to do this, with both the "bjam" and "stow"
# packages installed.
#
# Lastly, you need to build cppunit by hand with GLIBCXX_DEBUG also, or else
# you'll see UniTests crash in flames and none of the unit tests will run.
#
# Now you're ready to run acprep like this:
#
# $ ./acprep --local --devel --debug --boost sd
#
# Or, as I do it:
#
# $ ./myacprep
#
# --release
#
# This is the opposite of --devel: it means you wish to build in a release
# scenario, preparing a universal binary and building against the non-debug
# versions of Boost and CppUnit.
#
# NOTE: I do not expect anyone but me to use --devel or --release, so don't be
# surprised if it doesn't work as advertised. In that case, look for me in
# the #ledger channel on the IRC server irc.freenode.net.
DO_BUILD=false
while [ -n "$1" ]; do
case "$1" in
--devel)
# jww (2008-08-07): Sadly, PCH does not work with Boost+gcc4.0 on
# OS X. It does work with gcc4.2, but then _GLIBCXX_DEBUG fails.
SWITCHES="$SWITCHES --disable-shared"
#SWITCHES="$SWITCHES --disable-shared --enable-pch"
# The use of this flag requires that Boost be also build with
# _GLIBCXX_DEBUG.
CPPFLAGS="$CPPFLAGS -D_GLIBCXX_DEBUG=1"
CPPFLAGS="-isystem /usr/local/stow/cppunit-debug/include $CPPFLAGS"
LDFLAGS="-L/usr/local/stow/cppunit-debug/lib $LDFLAGS"
BOOST_SUFFIX="-d-1_35" # I built mine with _GLIBCXX_DEBUG
#LDFLAGS="-Wl,-read_only_relocs,suppress"
#LIBS=""
#if [ -f /opt/local/lib/libexpat.a ]; then
# LIBS="$LIBS /opt/local/lib/libexpat.a"
#fi
#if [ -f /opt/local/lib/libgmp.a ]; then
# LIBS="$LIBS /opt/local/lib/libgmp.a"
#fi
#if [ -f /usr/lib/gcc/i686-apple-darwin9/4.2.1/libgcc_static.a ]; then
# LIBS="$LIBS /usr/lib/gcc/i686-apple-darwin9/4.2.1/libgcc_static.a"
#fi
shift 1 ;;
--debug)
SWITCHES="$SWITCHES --enable-debug"
CPPFLAGS="$CPPFLAGS -DBOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING=1"
CPPFLAGS="$CPPFLAGS -DBOOST_MULTI_INDEX_ENABLE_SAFE_MODE=1"
CXXFLAGS="$CXXFLAGS -g"
LDFLAGS="$LDFLAGS -g"
shift 1 ;;
--boost)
shift 1
BOOST_SUFFIX="-$1"
shift 1 ;;
--gcov)
CXXFLAGS="$CXXFLAGS -fprofile-arcs -ftest-coverage"
shift 1 ;;
--gprof)
CXXFLAGS="$CXXFLAGS -g -pg"
shift 1 ;;
--python)
if [ -d "$PYTHON_HOME" ]; then
SWITCHES="$SWITCHES --enable-python"
CPPFLAGS="$CPPFLAGS -I$PYTHON_HOME/include/python2.5"
LDFLAGS="$LDFLAGS -L$PYTHON_HOME/lib/python2.5/config"
fi
shift 1;;
--pic)
CXXFLAGS="$CXXFLAGS -fPIC"
shift 1 ;;
--opt)
CXXFLAGS="$CXXFLAGS -fomit-frame-pointer -O3"
shift 1 ;;
--local)
LOCAL=true
shift 1 ;;
--build)
DO_BUILD=true
shift 1 ;;
--release)
SWITCHES="$SWITCHES --disable-dependency-tracking --disable-shared"
CPPFLAGS="-isystem /usr/local/stow/cppunit/include $CPPFLAGS"
CXXFLAGS="$CXXFLAGS $ARCHFLAGS"
LDFLAGS="$LDFLAGS $ARCHFLAGS -Wl,-syslibroot,/Developer/SDKs/MacOSX10.5.sdk"
LDFLAGS="-L/usr/local/stow/cppunit/lib $LDFLAGS"
shift 1 ;;
*)
break ;;
esac
done
HERE="$PWD"
if [ "$LOCAL" = "false" -a -d "$HOME/Products" ]; then
projdir="$HOME/Products/ledger"
if [ ! -d "$projdir" ]; then
mkdir -p "$projdir"
fi
cd "$projdir" || (echo "Cannot change to $projdir"; exit 1)
fi
"$HERE/configure" --srcdir="$HERE" CXX="$CXX" \
CPPFLAGS="$CPPFLAGS" CXXFLAGS="$CXXFLAGS $local_cxxflags" \
LDFLAGS="$LDFLAGS" LIBS="$LIBS" $SWITCHES \
--with-boost-suffix="$BOOST_SUFFIX"
# Alter the Makefile so that it's not nearly so verbose. This makes errors
# and warnings much easier to spot.
if [ -f Makefile ]; then
perl -i -pe 's/^\t(\$\((LIBTOOL|CXX)\).*?\.cc)$/\t\@echo " " CXX \$\@;$1 > \/dev\/null/;' Makefile
perl -i -pe 's/^\tmv -f/\t\@mv -f/;' Makefile
perl -i -pe 's/^\t(\$\((.*?)LINK\).*)/\t\@echo " " LD \$\@;$1 > \/dev\/null/;' Makefile
fi
# If the --build flag was passed, start a build right away with the right
# options.
if [ $DO_BUILD = true ]; then
echo "make ARCHFLAGS=\"$ARCHFLAGS\" \"$@\"" > make.sh
sh -x make.sh
fi