caam

annotate bin/caam @ 37:a151a2cb61e8

Recent pkgconfig stays in $prefix/share.
author HIROSE Yuuji <yuuji@gentei.org>
date Sat, 29 Feb 2020 10:38:49 +0900
parents 381840eb8030
children 428dca96344b
rev   line source
yuuji@0 1 #!/bin/sh
yuuji@0 2 # caam - Configure And And Make
yuuji@33 3 # (C)2008-2020 by HIROSE, Yuuji [yuuji/at/gentei.org]
yuuji@18 4 # $HGid$
yuuji@0 5 # http://www.gentei.org/~yuuji/software/caam/
yuuji@0 6
yuuji@0 7 ca=`echo $CAAM_ADD|tr : ' '`
yuuji@0 8 cpx=`echo $CAAM_PREFIXES|tr : ' '`
yuuji@17 9 CAAM_GCC=${GCC:-`which cc`}
yuuji@13 10 CAAM_CXX=${CXX:-`which c++`}
yuuji@0 11 if [ -x /usr/xpg4/bin/sh ]; then
yuuji@0 12 CAAM_SH=/usr/xpg4/bin/sh
yuuji@0 13 else
yuuji@0 14 CAAM_SH=`which sh`
yuuji@0 15 fi
yuuji@0 16 CONFIG_SHELL=${CONFIG_SHELL:-${CAAM_SH}}
yuuji@0 17 export CONFIG_SHELL
yuuji@0 18
yuuji@0 19 # setup final callee
yuuji@0 20 ####DO=${DO:-${MAKE:-make}}
yuuji@1 21 CAAM_MAKE=${CAAM_MAKE:-${MAKE:-make}}
yuuji@0 22 CAAM_CFG=${CFG:-"$CONFIG_SHELL ./configure"}
yuuji@0 23 MKTGT=''
yuuji@0 24 CAAM_MKOPT=${MKOPT:-""}
yuuji@0 25 TGT2=''
yuuji@0 26
yuuji@0 27 myname=`basename $0`
yuuji@0 28 mydir=`dirname $0`
yuuji@0 29 mydir=`(cd $mydir; pwd -P)`
yuuji@0 30 myargs=$*
yuuji@0 31 dir=`dirname $mydir`
yuuji@0 32 case "$dir" in
yuuji@0 33 */caam*) top=`dirname $dir` ;;
yuuji@0 34 *) top="$dir" ;;
yuuji@0 35 esac
yuuji@0 36
yuuji@27 37 chasemytop () (
yuuji@0 38 me=$0; cd $mydir
yuuji@0 39 while [ -L $me ]; do
yuuji@0 40 me=`ls -l $me|awk '{print $NF}'`
yuuji@0 41 d=`dirname $me`
yuuji@0 42 me=`basename $me`
yuuji@0 43 cd $d
yuuji@0 44 done
yuuji@27 45 cd ..; pwd -P
yuuji@27 46 )
yuuji@0 47
yuuji@0 48 mytop=`chasemytop`
yuuji@0 49
yuuji@0 50 PROOT=$top
yuuji@0 51 CONFDIR=${CAAM_CONFDIR:-$mydir}
yuuji@0 52 DPF="$CONFDIR/caam.dirs"
yuuji@0 53 WRAPDIR=$mytop/wrap
yuuji@0 54 [ "$CAAM_DEBUG" ] && echo wrapdir=$WRAPDIR
yuuji@10 55 SUSPEND=:
yuuji@29 56 build_subdir=build.caam
yuuji@29 57 builddir=""
yuuji@26 58 CAAM_LOG=true
yuuji@28 59 logsuffix=${CAAM_LOGSUFFIX:-$myname}
yuuji@28 60 if [ -w .. ]; then
yuuji@28 61 logfile=../`basename $PWD`.$logsuffix
yuuji@28 62 else
yuuji@28 63 logdir=/tmp/caamLogBy-`logname` # No need to care race condition
yuuji@28 64 [ -d $logdir ] || mkdir $logdir
yuuji@28 65 logfile=$logdir/`basename $PWD`.$logsuffix
yuuji@28 66 fi
yuuji@0 67
yuuji@28 68 usage() {
yuuji@28 69 cat<<-EOF
yuuji@28 70 $myname: Configure And And Make helper
yuuji@28 71 Usage: $myname [caam-options] [configure-options]
yuuji@28 72 Available caam-options:
yuuji@28 73 -m Do make only, not calling configure
yuuji@36 74 -b Bashism
yuuji@28 75 -c Do configure only, not calling make
yuuji@28 76 -g Call "gmake" instead of default "make"
yuuji@29 77 -cmake Call "cmake" instead of default "./configure"
yuuji@28 78 -mai, -gmai "make all install", "gmake all install"
yuuji@28 79 -maic, -gmaic "make all install clean", ditto for gmake
yuuji@28 80 -t TGT Set TGT as "make" target instead of "all"
yuuji@28 81 -k MKOPT Call make with option MKOPT
yuuji@28 82 -jN, -j N Make job concurrency set to N
yuuji@28 83 -s SEC Sleep SEC seconds between configure and make
yuuji@28 84 -S Suspend execution of $myname before calling make
yuuji@28 85 -h HOOK Call HOOK script between configure and make
yuuji@28 86 -l Replace ./libtool to that of the system
yuuji@28 87 -o LOG Output log to LOG (default: $logfile)
yuuji@28 88 -d Debug information
yuuji@29 89 -- End of caam-options
yuuji@28 90
yuuji@28 91 Available environment variables:
yuuji@28 92 CAAM_PREFIXES Reset default prefix
yuuji@28 93 CAAM_ADD Colon delimited additional prefixes
yuuji@28 94 CAAM_LOGSUFFIX Logfile's suffix w/o dot (default: $myname)
yuuji@28 95 CC, CFLAGS, CXX, LDFLAGS, CPPFLAGS and ac_cv_* for many compiler
yuuji@28 96 systems are also passed to them
yuuji@28 97 Examples:
yuuji@28 98 $myname -j5
yuuji@28 99 --> ./configure && make -j5
yuuji@28 100
yuuji@28 101 $myname -gmai --prefix=/usr/local/foo
yuuji@28 102 --> ./configure --prefix=/usr/local/foo && gmake all install
yuuji@28 103
yuuji@28 104 CAAM_ADD=gtk2:/usr/X11R7 $myname -maic --prefix=/usr/local/bar
yuuji@28 105 --> Add -I$top/gtk2/include and -I/usr/X11R7/include
yuuji@28 106 to CFLAGS, add
yuuji@35 107 -L$top/gtk2/lib -Wl,-rpath=$top/gtk2/lib
yuuji@35 108 -L/usr/X11R7/lib -Wl,-rpath=/usr/X11R7/lib
yuuji@28 109 to LDFLAGS, then call
yuuji@28 110 ./configure --preifx=/usr/local/bar && make all install clean
yuuji@28 111 EOF
yuuji@28 112 exit 0
yuuji@28 113 }
yuuji@0 114 # Parse my own arguments
yuuji@0 115 while [ x"" != x"$1" ]; do
yuuji@0 116 case "$1" in
yuuji@29 117 --) shift; break;;
yuuji@28 118 -help|--help) usage ;;
yuuji@0 119 -gmaic) TGT2="install clean"; CAAM_MAKE=gmake;;
yuuji@0 120 -maic) TGT2="install clean";;
yuuji@0 121 -gmai) TGT2="install"; CAAM_MAKE=gmake;;
yuuji@0 122 -mai) TGT2="install";;
yuuji@26 123 -nolog) CAAM_LOG=false ;;
yuuji@32 124 -smi) SUDOMKI="sudo " ;;
yuuji@32 125 -dmi) SUDOMKI="doas " ;;
yuuji@0 126 -m) CAAM_CFG="echo configure done";;
yuuji@0 127 -t) shift; MKTGT=${MKTGT:+"all "}"$1" ;;
yuuji@14 128 -j[0-9]*) CAAM_MKOPT="$CAAM_MKOPT${CAAM_MKOPT:+ }$1";;
yuuji@0 129 -j) shift; CAAM_MKOPT="$MKOPT${MKOPT:+ }-j $1";;
yuuji@14 130 -k) CAAM_MKOPT="$CAAM_MKOPT${CAAM_MKOPT:+ }-k";;
yuuji@0 131 # -CC) setcc=1 ;;
yuuji@36 132 -b) SHELL=`which bash`; CONFIG_SHELL=$SHELL;;
yuuji@0 133 -c) DO="echo done";;
yuuji@0 134 -g) CAAM_MAKE=gmake ;;
yuuji@29 135 -cmake) CAAM_CFG=cmake; builddir=$build_subdir ;;
yuuji@14 136 -s) shift; SUSPEND="dosleep $1" ;;
yuuji@10 137 -S) SUSPEND=suspend ;;
yuuji@0 138 -d) debug=1 ;;
yuuji@14 139 -h) shift; HOOK="$1" ;;
yuuji@14 140 -l) LIBTOOLHACK=1 ;;
yuuji@29 141 -o) shift; logfile="$1" ;;
yuuji@0 142 *) break ;;
yuuji@0 143 esac
yuuji@0 144 shift
yuuji@0 145 done
yuuji@32 146 POSTDO=${TGT2:+" && ${SUDOMKI}${CAAM_MAKE} $TGT2"}
yuuji@0 147 DO=${DO:-"${CAAM_MAKE} ${CAAM_MKOPT} $MKTGT$POSTDO"}
yuuji@0 148
yuuji@0 149 # Add extra path
yuuji@0 150 for p in $ca; do
yuuji@0 151 case "$p" in
yuuji@0 152 /*) PATH=${p}/bin:$PATH ;;
yuuji@0 153 *) PATH=$PROOT/${p}/bin:$PATH ;;
yuuji@0 154 esac
yuuji@0 155 done
yuuji@0 156
yuuji@0 157 defprefix="gnu graphics xc X11-contrib Xclient"
yuuji@0 158 [ -f $DPF ] && defprefix=`grep -v '^#' $DPF`
yuuji@0 159 dpx=${cpx:-$defprefix}
yuuji@0 160
yuuji@0 161 # extract pkg-config path's
yuuji@0 162 pcp=$PKG_CONFIG_PATH
yuuji@0 163
yuuji@28 164 [ $debug ] && { echo d=$dir, top=$top, ca=$ca; }
yuuji@0 165 for e in $ca '' $dpx; do
yuuji@0 166 case "$e" in
yuuji@0 167 /*) pfx=$e ;;
yuuji@0 168 *) pfx=$PROOT/$e ;;
yuuji@0 169 esac
yuuji@0 170 [ $debug ] && echo checking $pfx
yuuji@0 171 [ -d $pfx ] || continue
yuuji@0 172 cf="$cf -I${pfx}${e:+/}include"
yuuji@17 173 lf="$lf -L${pfx}${e:+/}lib -Wl,-rpath=${pfx}${e:+/}lib"
yuuji@0 174 lp="$lp${lp:+:}${pfx}${e:+/}lib"
yuuji@0 175 [ -d $pfx/lib/pkgconfig ] && pcp=$pcp${pcp:+:}$pfx${e:+/}lib/pkgconfig
yuuji@37 176 [ -d $pfx/share/pkgconfig ] && pcp=$pcp${pcp:+:}$pfx${e:+/}share/pkgconfig
yuuji@0 177 done
yuuji@0 178
yuuji@0 179 # Save old variable
yuuji@1 180 acvars=`env|grep '^ac_'|cut -d= -f 1`
yuuji@3 181 otvars=`env|egrep '(_CFLAGS|_LIBS?|_INCLUDES?)='|cut -d= -f 1`
yuuji@0 182 for e in PATH LD_LIBRARY_PATH LD_RUN_PATH PERL RUBY PYTHON M4 \
yuuji@25 183 LIBTOOL SED INSTALL MAKE MSGFMT MKDIR \
yuuji@19 184 CC CFLAGS CPPFLAGS LDFLAGS LIBS CXX CXXFLAGS \
yuuji@19 185 LD AS \
yuuji@15 186 CONFIG_SHELL DESTDIR \
yuuji@18 187 PKG_CONFIG PKG_CONFIG_PATH \
yuuji@18 188 CAAM_PREFIXES CAAM_ADD CFG MAKE MKOPT \
yuuji@33 189 ACLOCAL AUTOCONF AUTOMAKE GETOPT \
yuuji@1 190 $acvars $otvars; do
yuuji@0 191 eval "v=\$$e"
yuuji@0 192 if [ x"$v" != x"" ]; then
yuuji@0 193 eval "old_${e}=\"$v\""
yuuji@0 194 kept_env="$kept_env $e"
yuuji@0 195 fi
yuuji@0 196 done
yuuji@0 197
yuuji@0 198 CFLAGS=`echo $CFLAGS $cf`
yuuji@0 199 CPPFLAGS=`echo $CFLAGS $cf`
yuuji@0 200 LDFLAGS=`echo $LDFLAGS $lf`
yuuji@0 201 export LD_RUN_PATH
yuuji@0 202 LD_RUN_PATH="$lp"
yuuji@0 203 PKG_CONFIG_PATH=$pcp
yuuji@0 204 export PKG_CONFIG_PATH
yuuji@36 205 export CONFIG_SHELL
yuuji@0 206
yuuji@0 207 # Setup gcc wrapper environment
yuuji@0 208 # point to gcc wrapper
yuuji@0 209 if [ -d $WRAPDIR ]; then
yuuji@0 210 PATH=$WRAPDIR:$PATH
yuuji@0 211 ldf=''
yuuji@0 212 if [ x"$LD_RUN_PATH" != x"" ]; then
yuuji@0 213 oifs=$IFS
yuuji@0 214 IFS=:
yuuji@0 215 for d in $LD_RUN_PATH; do
yuuji@17 216 ldf=$ldf${ldf:+\ }"-Wl,-rpath=$d -L$d"
yuuji@0 217 done
yuuji@0 218 IFS=$oifs
yuuji@0 219 fi
yuuji@0 220 CAAM_LDF=$ldf; export CAAM_LDF
yuuji@0 221 fi
yuuji@0 222
yuuji@14 223 dosleep() {
yuuji@14 224 cat<<_EOF_
yuuji@14 225 ----------------------------------------------------------------------
yuuji@14 226 Configure done. Sleeping $1 seconds.
yuuji@14 227 ----------------------------------------------------------------------
yuuji@14 228 _EOF_
yuuji@14 229 sleep $1
yuuji@14 230 }
yuuji@14 231
yuuji@10 232 suspend() {
yuuji@12 233 cat<<_EOF_
yuuji@12 234 ======================================================================
yuuji@12 235 Suspending caam. Type 'fg' to make caam work again.
yuuji@12 236 ======================================================================
yuuji@12 237 _EOF_
yuuji@10 238 kill -STOP $$
yuuji@12 239 :
yuuji@10 240 }
yuuji@14 241 libtoolhack() {
yuuji@14 242 rm libtool && ln -s `which libtool` .
yuuji@14 243 }
yuuji@14 244
yuuji@14 245 hook() {
yuuji@14 246 [ "$LIBTOOLHACK" ] && libtoolhack
yuuji@14 247 [ "$HOOK" ] || return 0
yuuji@14 248 [ -f "$HOOK" ] || return 0
yuuji@14 249 if [ -x "$HOOK" ]; then
yuuji@14 250 ls -l $HOOK
yuuji@14 251 $HOOK
yuuji@14 252 else
yuuji@14 253 $SHELL $HOOK
yuuji@14 254 fi
yuuji@14 255 }
yuuji@10 256
yuuji@26 257 successlog() (
yuuji@0 258 status=$?
yuuji@31 259 $CAAM_LOG || return $status
yuuji@28 260 if touch $logfile 2>/dev/null; then
yuuji@26 261 PWD=`pwd` # for compatibility
yuuji@26 262 uname=`uname -sm 2>/dev/null`
yuuji@26 263 [ -s $logfile ] || echo "### $logfile started at `date`" > $logfile
yuuji@26 264 (echo 1i
yuuji@26 265 echo "# ** $uname ** - $myname succeeded at `date`"
yuuji@26 266 cat <<EOF
yuuji@7 267 if [ x"\`uname -sm\`" = x"$uname" ]; then
yuuji@7 268 if [ x"\$1" = x"-n" ]; then
yuuji@8 269 sed -n -e '1,/#[:]BEGIN/d' -e '/^ exit\$/q' -e p \$0 \\
yuuji@8 270 | sed -e 's/^ *//' -e 's/ "\$@"//' \\
yuuji@8 271 | sed "s,\$PATH,\\\$PATH,"|sed '/PATH="\\\$PATH" /d'
yuuji@8 272 exit 0
yuuji@7 273 fi
yuuji@8 274 #:BEGIN
yuuji@7 275 EOF
yuuji@26 276 for e in $kept_env; do
yuuji@26 277 eval v="\$old_$e"
yuuji@26 278 echo " "$e=\"$v\" \\
yuuji@26 279 done
yuuji@26 280 echo " $myname" $myargs '"$@"'
yuuji@26 281 echo " exit"
yuuji@26 282 echo "fi"
yuuji@26 283 echo "#### ** $uname Success log ends here."
yuuji@26 284 echo .; echo w; echo q) | ed $logfile 2> /dev/null
yuuji@7 285
yuuji@7 286 echo "Saved caam log in $logfile."
yuuji@7 287 echo "To build again with same parameters: sh $logfile"
yuuji@7 288 echo "To see successfull caam arguments: sh $logfile -n"
yuuji@28 289 else
yuuji@28 290 echo "Cannot output log to [$logfile]" >&2
yuuji@26 291 fi
yuuji@26 292 exit $status
yuuji@26 293 )
yuuji@0 294
yuuji@0 295 # if [ $setcc ]; then
yuuji@0 296 # # CC="$CAAM_GCC $CFLAGS $LDFLAGS"; export CC
yuuji@0 297 # DO="$DO CC='$CAAM_GCC $CFLAGS $LDFLAGS'"
yuuji@0 298 # fi
yuuji@0 299
yuuji@0 300 echo CFLAGS=\"$CFLAGS\" \
yuuji@0 301 CPPFLAGS=\"$CFLAGS\" \
yuuji@0 302 LDFLAGS=\"$LDFLAGS\" \
yuuji@0 303 LD_LIBRARY_PATH="$lp" \
yuuji@0 304 PKG_CONFIG_PATH=\"$PKG_CONFIG_PATH\" \
yuuji@0 305 GCC=\"$CAAM_GCC\" \
yuuji@13 306 CXX=\"$CAAM_CXX\" \
yuuji@0 307 sh -c "$CAAM_CFG $* && $DO"
yuuji@0 308
yuuji@0 309 PATH=$PATH \
yuuji@0 310 CFLAGS="$CFLAGS" \
yuuji@0 311 CPPFLAGS="$CFLAGS" \
yuuji@0 312 LDFLAGS="$LDFLAGS" \
yuuji@0 313 LD_LIBRARY_PATH="$lp" \
yuuji@0 314 CAAM_GCC=$CAAM_GCC \
yuuji@13 315 CAAM_CXX=$CAAM_CXX
yuuji@13 316 export PATH CFLAGS CPPFLAGS LDFLAGS LD_LIBRARY_PATH LD_RUN_PATH
yuuji@13 317 export CAAM_GCC CAAM_CXX
yuuji@12 318 sh -c "$CAAM_CFG $*" &&
yuuji@14 319 hook && $SUSPEND && sh -c "$DO" && successlog