Newer
Older
caam / bin / caam
@HIROSE Yuuji HIROSE Yuuji on 23 Feb 2020 8 KB In usage, replace -R with -Wl,-rpath=
#!/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