#!/usr/bin/env bash
#
# This is the script we use to build SWI-Prolog and all its packages.
# Copy the script to `build', edit to suit the local installation
# requirements and run it. Once correct, upgrading to a new release is
# now limited to getting the new sources and run ./build.
# [EDIT] Prefix location of the installation. It is _not_ adviced to use
# a versioned prefix. The system will install in
# $PREFIX/lib/pl-<version> and create symlinks from $PREFIX/bin for the
# main programs. Users can always use older versions by running
# $PREFIX/lib/pl-<version>/bin/<arch>/pl
#
# If you change PREFIX such that the system is installed in a place for
# which you have no write access, set SUDO to the command to run the
# remainder of the commandline as privilaged user. E.g., if you change
# PREFIX to /usr/local/bin you typically must change SUDO to "sudo"
PREFIX=$HOME
SUDO=
#SUDO="sudo"
# [EDIT] Version of make to use. This must be GNU-make. On many Unix
# systems this is installed as 'gmake'. On most GNU-based systems (e.g.,
# linux), the default make is GNU-make. You can use 'make --jobs=<max>'
# to build the system faster using all your cores. The optimal value
# depends a lot on your hardware. Using 4 jobs on a dual-core machines
# seems enough to keep both cores busy. (experimental).
MAKE=make
# MAKE='make --jobs=4'
# [EDIT] Compiler and options.
#
# CC: Which C-compiler to use
# COFLAGS: Flags for the optimizer such as "-O3" or "-g"
# CMFLAGS: Machine flags such as "-m64" (64-bits on gcc)
# CIFLAGS: Include-path such as "-I/opt/include"
# LDFLAGS: Link flags such as "-L/opt/lib"
#
# Leaving an option blank leaves the choice to configure. The commented
# values below enable much better C-level debugging with almost the same
# performance on GCC based systems (the default is to compile using -O3)
# For optiomal performance, see also --enable-useprofile below.
# export CC=
# export COFLAGS="-O2 -gdwarf-2 -g3"
# export CMFLAGS=
# export CIFLAGS=
# export LDFLAGS="-O2 -g"
# On MacOS you need this to get some libraries from Macports. Since
# recently, there are three C compilers: gcc-llvm and clang come with
# XCode. Native gcc can be installed in various ways (e.g., using
# Macports). Current SWI-Prolog sources compile and work with all these
# alternatives. If you want the last bit of performance and don't mind
# some extra work, get a recent native GCC, set CC below and enable
# --enable-useprofile (see below).
if [ "`uname`" = Darwin ]; then
export LIBRARY_PATH=/usr/lib:/opt/local/lib
export CPATH=/usr/include:/opt/local/include
export PKG_CONFIG_PATH=/usr/X11R6/lib/pkgconfig:/opt/local/lib/pkgconfig
# export CC="gcc-4.2"
# export CXX="g++-4.2"
# export CXXCPP="g++-4.2 -E"
fi
# [EDIT] On Solaris also puts there stuff everywhere ...
# export CIFLAGS=-I/opt/csw/include/ncurses
# export LDFLAGS=-L/opt/csw/lib
# [EDIT] On FreeBSD, java is installed under /usr/local/jdk<version>,
# and the executables are _copied_ to /usr/local/bin. Unfortunately, the
# copy leaves the headers out, so the original files must be used.
# export JAVAC=/usr/local/jdk1.6.0/bin/javac
# [EDIT] On FreeBSD, the following is needed to fetch the headers for
# GMP.
# export CIFLAGS='-I/usr/local/include'
export CFLAGS="$COFLAGS $CMFLAGS $CIFLAGS"
################################################################
# Package (add-ons) selection
################################################################
# [EDIT] Packages to configure. Leaving it blank compiles all default
# packages. The final set of packages is
#
# ${PKG-<default>} + $EXTRA_PKGS - $DISABLE_PKGS
# export PKG=
# [EDIT] Packages to skip. Leaving it blank compiles all default packages.
# export DISABLE_PKGS="jpl ssl odbc utf8proc"
# [EDIT] Packages to add.
# export EXTRA_PKGS="db ltx2htm space"
# [EDIT] Where to find the jar for Junit 3.8. Needed to test jpl
# export JUNIT=/opt/local/share/java/junit.jar
################################################################
# Misc stuff
################################################################
# [EDIT] Extra options to pass to the toplevel configure.
# --link
# Using --link, the system is installed using symbolic links. This means
# you cannot remove or clean the sources, but it largely simplifies
# editing the system Prolog files during development.
#
# --enable-useprofile
# The config --enable-useprofile exploits GCC -fprofile-use option. The
# system is compiled, profiled and re-compiled to get better
# branch-prediction. This makes the system approx. 10% faster. Do not
# use this for developing the kernel because it complicates maintenance.
#
# --disable-libdirversion
# By default, the system is installed in $libdir/swipl-<version>. Using
# this option drops <version>. Using versions, you can install multiple
# versions side-by-site and run old versions at any time by starting
# $libdir/swipl-<version>/bin/$arch/swipl. Without, the system is always
# at a nice stable place, so external foreign objects linked against the
# binary need not be updated with a Prolog update.
#
# --enable-shared
# Use this to create a shared object for the Prolog kernel. The default
# depends on the platform. Creating a shared object is the default on
# most platforms, either because it is needed or because it does no
# harm. The only exception to this rule is Linux on x86 (Intel 32-bit).
# It is not needed on this platform and Linux shared object model costs
# a CPU register. Given the limited number of CPU registers on the x86
# platform, this results in a performance degradation of about 10%.
#
# --enable-boehm-gc
# Configure SWI-Prolog to use -a custom version of- bdwgc (Boehm-GC,
# http://www.hpl.hp.com/personal/Hans_Boehm/gc/). This is intended to
# support the next generation of the SWI-Prolog RDF store
# (packages/semweb). DO NOT USE (YET).
# EXTRACFG+=" --link"
# EXTRACFG+=" --enable-useprofile"
# EXTRACFG+=" --disable-libdirversion"
# EXTRACFG+=" --enable-shared"
# EXTRACFG+=" --enable-boehm-gc"
export EXTRACFG
# One possiblity to make relocatable executables on Linux is by using
# the RPATH mechanism. See ld.so(1) and chrpath(1). However, chrpath
# cannot enlarge the path. Uncommenting the line below adds :xxx... to
# the RPATH, where the given count is the number of x-s.
#
# export RPATH_RESERVE=70
################################################################
# No edit should be needed below this line
################################################################
V=`cat VERSION`
config=true
make=true
install=true
done=false
setvars=false
while test "$done" = false; do
case "$1" in
--config) make=false
install=false
shift
;;
--make) config=false
install=false
shift
;;
--install) config=false
make=false
shift
;;
--prefix=*) PREFIX=`echo "$1" | sed 's/--prefix=//'`
shift
;;
--setvars) setvars=true
shift
;;
*) done=true
;;
esac
done
if [ "$setvars" = "false" ]; then
if [ "$config" = "true" ]; then
./configure --prefix=$PREFIX --with-world $EXTRACFG $@ 2>&1 | tee configure.out
if [ "${PIPESTATUS[0]}" != 0 ]; then exit 1; fi
fi
if [ "$make" = "true" ]; then
$MAKE $@ 2>&1 | tee make.out
if [ "${PIPESTATUS[0]}" != 0 ]; then exit 1; fi
fi
if [ "$install" = "true" ]; then
$SUDO $MAKE install $@ 2>&1 | tee make-install.out
if [ "${PIPESTATUS[0]}" != 0 ]; then exit 1; fi
fi
fi # setvars