#!/bin/sh # caam - Configure And And Make # (C)2008-2020 by HIROSE, Yuuji [yuuji/at/gentei.org] # $HGid$ # http://www.gentei.org/~yuuji/software/caam/ ca=`echo $CAAM_ADD|tr : ' '` cpx=`echo $CAAM_PREFIXES|tr : ' '` CAAM_GCC=${GCC:-`which cc`} CAAM_CXX=${CXX:-`which c++`} if [ -x /usr/xpg4/bin/sh ]; then CAAM_SH=/usr/xpg4/bin/sh else CAAM_SH=`which sh` fi CONFIG_SHELL=${CONFIG_SHELL:-${CAAM_SH}} export CONFIG_SHELL # setup final callee ####DO=${DO:-${MAKE:-make}} CAAM_MAKE=${CAAM_MAKE:-${MAKE:-make}} CAAM_CFG=${CFG:-"$CONFIG_SHELL ./configure"} MKTGT='' CAAM_MKOPT=${MKOPT:-""} TGT2='' myname=`basename $0` mydir=`dirname $0` mydir=`(cd $mydir; pwd -P)` myargs=$* dir=`dirname $mydir` case "$dir" in */caam*) top=`dirname $dir` ;; *) top="$dir" ;; esac chasemytop () ( me=$0; cd $mydir while [ -L $me ]; do me=`ls -l $me|awk '{print $NF}'` d=`dirname $me` me=`basename $me` cd $d done cd ..; pwd -P ) mytop=`chasemytop` PROOT=$top CONFDIR=${CAAM_CONFDIR:-$mydir} DPF="$CONFDIR/caam.dirs" WRAPDIR=$mytop/wrap [ "$CAAM_DEBUG" ] && echo wrapdir=$WRAPDIR SUSPEND=: build_subdir=build.caam builddir="" CAAM_LOG=true logsuffix=${CAAM_LOGSUFFIX:-$myname} if [ -w .. ]; then logfile=../`basename $PWD`.$logsuffix else logdir=/tmp/caamLogBy-`logname` # No need to care race condition [ -d $logdir ] || mkdir $logdir logfile=$logdir/`basename $PWD`.$logsuffix fi usage() { cat<<-EOF $myname: Configure And And Make helper Usage: $myname [caam-options] [configure-options] Available caam-options: -m Do make only, not calling configure -c Do configure only, not calling make -g Call "gmake" instead of default "make" -cmake Call "cmake" instead of default "./configure" -mai, -gmai "make all install", "gmake all install" -maic, -gmaic "make all install clean", ditto for gmake -t TGT Set TGT as "make" target instead of "all" -k MKOPT Call make with option MKOPT -jN, -j N Make job concurrency set to N -s SEC Sleep SEC seconds between configure and make -S Suspend execution of $myname before calling make -h HOOK Call HOOK script between configure and make -l Replace ./libtool to that of the system -o LOG Output log to LOG (default: $logfile) -d Debug information -- End of caam-options Available environment variables: CAAM_PREFIXES Reset default prefix CAAM_ADD Colon delimited additional prefixes CAAM_LOGSUFFIX Logfile's suffix w/o dot (default: $myname) CC, CFLAGS, CXX, LDFLAGS, CPPFLAGS and ac_cv_* for many compiler systems are also passed to them Examples: $myname -j5 --> ./configure && make -j5 $myname -gmai --prefix=/usr/local/foo --> ./configure --prefix=/usr/local/foo && gmake all install CAAM_ADD=gtk2:/usr/X11R7 $myname -maic --prefix=/usr/local/bar --> Add -I$top/gtk2/include and -I/usr/X11R7/include to CFLAGS, add -L$top/gtk2/lib -Wl,-rpath=$top/gtk2/lib -L/usr/X11R7/lib -Wl,-rpath=/usr/X11R7/lib to LDFLAGS, then call ./configure --preifx=/usr/local/bar && make all install clean EOF exit 0 } # Parse my own arguments while [ x"" != x"$1" ]; do case "$1" in --) shift; break;; -help|--help) usage ;; -gmaic) TGT2="install clean"; CAAM_MAKE=gmake;; -maic) TGT2="install clean";; -gmai) TGT2="install"; CAAM_MAKE=gmake;; -mai) TGT2="install";; -nolog) CAAM_LOG=false ;; -smi) SUDOMKI="sudo " ;; -dmi) SUDOMKI="doas " ;; -m) CAAM_CFG="echo configure done";; -t) shift; MKTGT=${MKTGT:+"all "}"$1" ;; -j[0-9]*) CAAM_MKOPT="$CAAM_MKOPT${CAAM_MKOPT:+ }$1";; -j) shift; CAAM_MKOPT="$MKOPT${MKOPT:+ }-j $1";; -k) CAAM_MKOPT="$CAAM_MKOPT${CAAM_MKOPT:+ }-k";; # -CC) setcc=1 ;; -c) DO="echo done";; -g) CAAM_MAKE=gmake ;; -cmake) CAAM_CFG=cmake; builddir=$build_subdir ;; -s) shift; SUSPEND="dosleep $1" ;; -S) SUSPEND=suspend ;; -d) debug=1 ;; -h) shift; HOOK="$1" ;; -l) LIBTOOLHACK=1 ;; -o) shift; logfile="$1" ;; *) break ;; esac shift done POSTDO=${TGT2:+" && ${SUDOMKI}${CAAM_MAKE} $TGT2"} DO=${DO:-"${CAAM_MAKE} ${CAAM_MKOPT} $MKTGT$POSTDO"} # Add extra path for p in $ca; do case "$p" in /*) PATH=${p}/bin:$PATH ;; *) PATH=$PROOT/${p}/bin:$PATH ;; esac done defprefix="gnu graphics xc X11-contrib Xclient" [ -f $DPF ] && defprefix=`grep -v '^#' $DPF` dpx=${cpx:-$defprefix} # extract pkg-config path's pcp=$PKG_CONFIG_PATH [ $debug ] && { echo d=$dir, top=$top, ca=$ca; } for e in $ca '' $dpx; do case "$e" in /*) pfx=$e ;; *) pfx=$PROOT/$e ;; esac [ $debug ] && echo checking $pfx [ -d $pfx ] || continue cf="$cf -I${pfx}${e:+/}include" lf="$lf -L${pfx}${e:+/}lib -Wl,-rpath=${pfx}${e:+/}lib" lp="$lp${lp:+:}${pfx}${e:+/}lib" [ -d $pfx/lib/pkgconfig ] && pcp=$pcp${pcp:+:}$pfx${e:+/}lib/pkgconfig done # Save old variable acvars=`env|grep '^ac_'|cut -d= -f 1` otvars=`env|egrep '(_CFLAGS|_LIBS?|_INCLUDES?)='|cut -d= -f 1` for e in PATH LD_LIBRARY_PATH LD_RUN_PATH PERL RUBY PYTHON M4 \ LIBTOOL SED INSTALL MAKE MSGFMT MKDIR \ CC CFLAGS CPPFLAGS LDFLAGS LIBS CXX CXXFLAGS \ LD AS \ CONFIG_SHELL DESTDIR \ PKG_CONFIG PKG_CONFIG_PATH \ CAAM_PREFIXES CAAM_ADD CFG MAKE MKOPT \ ACLOCAL AUTOCONF AUTOMAKE GETOPT \ $acvars $otvars; do eval "v=\$$e" if [ x"$v" != x"" ]; then eval "old_${e}=\"$v\"" kept_env="$kept_env $e" fi done CFLAGS=`echo $CFLAGS $cf` CPPFLAGS=`echo $CFLAGS $cf` LDFLAGS=`echo $LDFLAGS $lf` export LD_RUN_PATH LD_RUN_PATH="$lp" PKG_CONFIG_PATH=$pcp export PKG_CONFIG_PATH # Setup gcc wrapper environment # point to gcc wrapper if [ -d $WRAPDIR ]; then PATH=$WRAPDIR:$PATH ldf='' if [ x"$LD_RUN_PATH" != x"" ]; then oifs=$IFS IFS=: for d in $LD_RUN_PATH; do ldf=$ldf${ldf:+\ }"-Wl,-rpath=$d -L$d" done IFS=$oifs fi CAAM_LDF=$ldf; export CAAM_LDF fi dosleep() { cat<<_EOF_ ---------------------------------------------------------------------- Configure done. Sleeping $1 seconds. ---------------------------------------------------------------------- _EOF_ sleep $1 } suspend() { cat<<_EOF_ ====================================================================== Suspending caam. Type 'fg' to make caam work again. ====================================================================== _EOF_ kill -STOP $$ : } libtoolhack() { rm libtool && ln -s `which libtool` . } hook() { [ "$LIBTOOLHACK" ] && libtoolhack [ "$HOOK" ] || return 0 [ -f "$HOOK" ] || return 0 if [ -x "$HOOK" ]; then ls -l $HOOK $HOOK else $SHELL $HOOK fi } successlog() ( status=$? $CAAM_LOG || return $status if touch $logfile 2>/dev/null; then PWD=`pwd` # for compatibility uname=`uname -sm 2>/dev/null` [ -s $logfile ] || echo "### $logfile started at `date`" > $logfile (echo 1i echo "# ** $uname ** - $myname succeeded at `date`" cat <<EOF if [ x"\`uname -sm\`" = x"$uname" ]; then if [ x"\$1" = x"-n" ]; then sed -n -e '1,/#[:]BEGIN/d' -e '/^ exit\$/q' -e p \$0 \\ | sed -e 's/^ *//' -e 's/ "\$@"//' \\ | sed "s,\$PATH,\\\$PATH,"|sed '/PATH="\\\$PATH" /d' exit 0 fi #:BEGIN EOF for e in $kept_env; do eval v="\$old_$e" echo " "$e=\"$v\" \\ done echo " $myname" $myargs '"$@"' echo " exit" echo "fi" echo "#### ** $uname Success log ends here." echo .; echo w; echo q) | ed $logfile 2> /dev/null echo "Saved caam log in $logfile." echo "To build again with same parameters: sh $logfile" echo "To see successfull caam arguments: sh $logfile -n" else echo "Cannot output log to [$logfile]" >&2 fi exit $status ) # if [ $setcc ]; then # # CC="$CAAM_GCC $CFLAGS $LDFLAGS"; export CC # DO="$DO CC='$CAAM_GCC $CFLAGS $LDFLAGS'" # fi echo CFLAGS=\"$CFLAGS\" \ CPPFLAGS=\"$CFLAGS\" \ LDFLAGS=\"$LDFLAGS\" \ LD_LIBRARY_PATH="$lp" \ PKG_CONFIG_PATH=\"$PKG_CONFIG_PATH\" \ GCC=\"$CAAM_GCC\" \ CXX=\"$CAAM_CXX\" \ sh -c "$CAAM_CFG $* && $DO" PATH=$PATH \ CFLAGS="$CFLAGS" \ CPPFLAGS="$CFLAGS" \ LDFLAGS="$LDFLAGS" \ LD_LIBRARY_PATH="$lp" \ CAAM_GCC=$CAAM_GCC \ CAAM_CXX=$CAAM_CXX export PATH CFLAGS CPPFLAGS LDFLAGS LD_LIBRARY_PATH LD_RUN_PATH export CAAM_GCC CAAM_CXX sh -c "$CAAM_CFG $*" && hook && $SUSPEND && sh -c "$DO" && successlog