+ fi
+
+ # From now on, we're in this target's build directory
+
+ mkdir -p ${dir}
+ cd ${dir} || exit 1
+
+ # Configure, if not already. Should this go back to being
+ # separate and done in parallel?
+
+ if test ! -r Makefile
+ then
+ # Default SIMOPTS to GDBOPTS.
+ test -z "${simopts}" && simopts="${gdbopts}"
+ # The config options
+ __target="--target=${target}"
+ __enable_gdb_build_warnings=`test -z "${gdbopts}" \
+ || echo "--enable-gdb-build-warnings=${gdbopts}"`
+ __enable_sim_build_warnings=`test -z "${simopts}" \
+ || echo "--enable-sim-build-warnings=${simopts}"`
+ __configure="${srcdir}/configure \
+ ${__target} \
+ ${__enable_gdb_build_warnings} \
+ ${__enable_sim_build_warnings}"
+ echo ... ${__configure}
+ trap "echo Removing partially configured ${dir} directory ...; rm -rf ${dir}; exit 1" 1 2 15
+ ${__configure} 2>&1 | log 2 Config.log
+ trap "exit 1" 1 2 15
+ fi
+ fail "configure failed" ! -r Makefile
+
+ # Build, if not built.
+
+ if test ! -x gdb/gdb -a ! -x gdb/gdb.exe
+ then
+ # Iff the build fails remove the final build target so that
+ # the follow-on code knows things failed. Stops the follow-on
+ # code thinking that a failed rebuild succeeded (executable
+ # left around from previous build).
+ echo ... ${make} ${keepgoing} ${makejobs} ${target}
+ ( ${make} ${keepgoing} ${makejobs} all-gdb || rm -f gdb/gdb gdb/gdb.exe
+ ) 2>&1 | log 1 Build.log
+ fi
+ fail "compile failed" ! -x gdb/gdb -a ! -x gdb/gdb.exe
+
+ # Check that the built GDB can at least print it's architecture.
+
+ echo ... run ${target}
+ rm -f core gdb.core ${dir}/gdb/x
+ cat <<EOF > x
+maint print architecture
+quit
+EOF
+ ./gdb/gdb -batch -nx -x x 2>&1 | log 1 Gdb.log
+ fail "gdb dumped core" -r core -o -r gdb.core
+ fail "gdb printed no output" ! -s Gdb.log
+ grep -e internal-error Gdb.log && fail "gdb panic" 1
+
+ echo ... cleanup ${target}
+
+ # Create a sed script that cleans up the output from GDB.
+ rm -f mbuild.sed
+ touch mbuild.sed || exit 1
+ # Rules to replace <0xNNNN> with the corresponding function's
+ # name.
+ sed -n -e '/<0x0*>/d' -e 's/^.*<0x\([0-9a-f]*\)>.*$/0x\1/p' Gdb.log \
+ | sort -u \
+ | while read addr
+ do
+ func="`addr2line -f -e ./gdb/gdb -s ${addr} | sed -n -e 1p`"
+ test ${verbose} -gt 0 && echo "${addr} ${func}" 1>&2
+ echo "s/<${addr}>/<${func}>/g"
+ done >> mbuild.sed
+ # Rules to strip the leading paths off of file names.
+ echo 's/"\/.*\/gdb\//"gdb\//g' >> mbuild.sed
+ # Run the script
+ sed -f mbuild.sed Gdb.log > Mbuild.log
+
+ # Replace the build directory with a file as semaphore that stops
+ # a rebuild. (should the logs be saved?)
+
+ cd ${builddir}
+
+ if ${keep}
+ then
+ :
+ else
+ rm -f ${target}.tmp
+ mv ${target}/Mbuild.log ${target}.tmp
+ rm -rf ${target}
+ mv ${target}.tmp ${target}
+ fi
+
+ # Success!
+ echo ... ${target} built
+