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