caam

view bin/caam @ 36:381840eb8030

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