Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* revamped gdb_mbuild.sh
@ 2002-11-25 10:51 Andrew Cagney
  2002-11-26  1:53 ` Richard Earnshaw
  2002-11-26  8:50 ` David Carlton
  0 siblings, 2 replies; 16+ messages in thread
From: Andrew Cagney @ 2002-11-25 10:51 UTC (permalink / raw)
  To: Richard Earnshaw, gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2060 bytes --]

Richard,

Finally got to trying the gdb_mbuild.sh script and, in the process, 
integrated some, er, `new features' from my old local script:

The changes are:


- restartable

Instead of starting over from scratch, it tries to continue on from 
where the last run left off (after being CNTRL-Ced or failing).  To 
force a complete rebuild of each target, use the option:

`-f' (force) will force a new run


- stop on failure

The script, by default, aborts on the first failed build.  The 
assumption is that the problem will be fixed and then the script 
re-started.  This can be overriden with the option:

`-k' (keep going) will force the script to try and build everything 
possible (the flag is passed to make as well).


- parallel

Rather than having separate configure and build phases (waiting on all 
the configures to finish before starting the builds), this script 
directly starts the parallel sub-shells.  Each sub-shell then tries to 
do a full configure, build and run for its target.  The number of jobs 
is specified with the option:

`-j <maxjobs>' controls the number of parallel jobs

(the implementation isn't perfect mind, it misses a second job finishing 
before a first).

- testing

In addition to checking the configure and build, the script also tries 
to run the built GDB to the point where it checks that '(gdb) maint 
print architecture' succeeds.

(NB: The h8500hms target currently barfs when run, I think I might 
propose that it be booted out of the build list).


- selecting targets

A sub-set of targets can be selected using the option:

`-e <targexp>' Select a subset of the targets using the (grep) regular 
expression <targexp>.  Multiple expressions can be specified.


- the output was changed vis:
mn10300-elf ,-Werror ...
ns32k-netbsd ,-Werror ...
... configuring mn10300-elf
... configuring ns32k-netbsd
... compiling ns32k-netbsd
... compiling mn10300-elf
... running ns32k-netbsd
... ns32k-netbsd built
... running mn10300-elf
... mn10300-elf built

Comments (for instance on the choice of options),

Andrew


[-- Attachment #2: gdb_mbuild.sh --]
[-- Type: text/plain, Size: 6349 bytes --]

#!/bin/sh

#  Multi-build script for testing compilation of all maintained configs of GDB.
#  Copyright (C) 2002  Free Software Foundation, Inc.
#  Contributed by Richard Earnshaw  (rearnsha@arm.com)

#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.

#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.

#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

usage() {
    cat <<EOF
Usage: gdb_mbuild.sh [ <options> ... ] <srcdir> <builddir>
 Options:
  -j <maxjobs>  Run <maxjobs> in parallel.  On a single cpu machine,
                2 is recommended.
  -k            Keep going.  Do not stop after the first build fails.
  -e <regexp>   Regular expression for selecting the targets to build.
  -f            Force rebuild.  Even rebuild previously built directories.
 Environment variables examined (with default if not defined):
  MAKE (make)"
 Note: Everything in <builddir>/gdb-allcross will be blown away.
EOF
    exit 1;
}

### COMMAND LINE OPTIONS

maxjobs=1
keepgoing=false
force=false
targexp=""
while test $# -gt 0
do
    case "$1" in
    -j )
	# Number of parallel make jobs (you probably want about 2 jobs
	# per cpu for maximum throughput)
	shift
	test $# -ge 1 || usage
	maxjobs=$1
	;;
    -k )
	# Should we soldier on after the first build fails?
	keepgoing=true
	;;
    -e )
	# A regular expression for selecting targets
	shift
	test $# -ge 1 || usage
	targexp="${targexp} -e ${1}"
	;;
    -f )
	# Force a rebuild
	force=true ; shift ;;
    -* ) usage ;;
    *) break ;;
    esac
    shift
done


### COMMAND LINE PARAMETERS

if test $# -ne 2
then
    usage
fi

# Convert these to absolute directory paths.

# Where the sources live
srcdir=`cd $1 && /bin/pwd` || exit 1

# Where the builds occur
builddir=`cd $2 && /bin/pwd` || exit 1


### ENVIRONMENT PARAMETERS

# Version of make to use
make=${MAKE:-make}
MAKE=${make}
export MAKE


# Where to look for the list of targets to test
maintainers=${srcdir}/gdb/MAINTAINERS
if [ ! -r ${maintainers} ]
then
    echo Maintainers file ${maintainers} not found
    exit 1
fi

# Get the list of targets and the build options
alltarg=`cat ${maintainers} | tr -s '[\t]' '[ ]' | sed -n '
/^[ ]*[-a-z0-9\.]*[ ]*[(]*--target=.*/ !d
s/^.*--target=//
s/).*$//
h
:loop
  g
  /^[^ ]*,/ !b end
  s/,[^ ]*//
  p
  g
  s/^[^,]*,//
  h
b loop
:end
p
' | if test "${targexp}" = ""
then
    grep -v -e broken -e OBSOLETE
else
    grep ${targexp}
fi`


# Run several jobs in parallel.
set --


# Usage: fail <message> <test-that-should-succeed>.  Should the build
# fail?  If the test is true, and we don't want to keep going, print
# the message and shoot everything in sight and abort the build.

fail ()
{
    msg="$1" ; shift
    if test "$@"
    then
	echo "${target}: ${msg}"
	if ${keepgoing}
	then
	    exit 0
	else
	    kill $$
	    exit 1
	fi
    fi
}


# Warn the user of what is comming, print the list of targets
echo "$alltarg"
echo ""


# For each target, configure and build it.
echo "$alltarg" | while true
do

    # Keep forking jobs until we've exceed our job capacity

    while test $# -lt ${maxjobs} && read target gdbopts simopts
    do

	(
	    trap "exit 1"  1 2 15
	    dir=${builddir}/${target}

	    # Should a scratch rebuild be forced?
	    if ${force}
	    then
		rm -rf ${dir}
	    fi
	    
	    # Don't bother re-building a built target (indicated by
	    # ${dir} being a file).
	    if test -f ${dir}
	    then
		#echo "${target}: already built"
		exit 0
	    fi

	    echo ${target} ${gdbopts} ${simopts} ...

	    # The config options
	    __target="--target=${target}"
	    __enable_gdb_warnings=`test -z "${gdbopts}" \
		|| echo "--enable-gdb-warnings=${gdbopts}"`
	    __enable_sim_warnings=`test -z "${simopts}" \
		|| echo "--enable-sim-warnings=${simopts}"`

	    # Did the previous configure attempt fail?  If it did
	    # restart from scratch.
	    if test ! -r ${dir}/gdb/Makefile
	    then
		rm -rf ${dir}
		mkdir -p ${dir}
	    fi

	    # From now on, we're in this target's build directory
	    cd ${dir} || exit 1

	    # Configure, if not already.
	    if test ! -r gdb/Makefile
	    then
		echo "... configuring ${target}"
		trap 'echo Removing partially configured ${target} directory ...; rm -rf ${dir}; exit 1' 1 2 15
		${srcdir}/configure \
		    ${__target} \
		    ${__enable_gdb_warnings} \
		    ${__enable_sim_warnings} \
		> Config.log 2>&1
		trap "exit 1"  1 2 15
	    fi
	    fail "configure failed" ! -r gdb/Makefile

	    # Build, if not built.
	    if test ! -x gdb/gdb -a ! -x gdb/gdb.exe
	    then
		echo "... compiling ${target}"
		${make} all-gdb > Build.log 2>&1
	    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 "... running ${target}"
	    rm -f core gdb.core ${dir}/gdb/x
	    cat <<EOF > x
maint print architecture
quit
EOF
	    ./gdb/gdb -batch -nx -x x > Arch.log 2>&1 < /dev/null
	    fail "gdb dumped core" -r core -o -r gdb.core
	    fail "gdb printed no output" ! -s Arch.log
	    grep -e internal-error Arch.log && fail "gdb panic" 1

	    # Replace the build directory with a file as semaphore
	    # that stops a rebuild. (should the logs be saved?)
	    cd ${builddir}
	    rm -f ${target}.tmp
	    mv ${target}/Arch.log ${target}.tmp
	    rm -rf ${target}
	    mv ${target}.tmp ${target}

	    # Success!
	    echo "... ${target} built"

	) &

	# Append this to the list of things to wait for.  Grr, there
	# is a race condition as the cntrl-c could come in before the
	# trap is updated.
	trap "echo Killing jobs $@ $!; kill $@ $!; wait ; exit 1" 1 2 15
	set -- "$@" $!

    done

    # If we've got zero jobs, we're finished
    if test $# -eq 0
    then
	break
    fi

    # Reap the first running process, then starting again
    wait $1 ; shift

done

exit 0

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: revamped gdb_mbuild.sh
  2002-11-25 10:51 revamped gdb_mbuild.sh Andrew Cagney
@ 2002-11-26  1:53 ` Richard Earnshaw
  2002-11-26  7:11   ` Andrew Cagney
  2002-11-26  8:50 ` David Carlton
  1 sibling, 1 reply; 16+ messages in thread
From: Richard Earnshaw @ 2002-11-26  1:53 UTC (permalink / raw)
  To: Andrew Cagney; +Cc: Richard Earnshaw, gdb-patches

> Richard,
> 
> Finally got to trying the gdb_mbuild.sh script and, in the process, 
> integrated some, er, `new features' from my old local script:
> 

Looks pretty good to me.  My only comment is that we loose the ability to 
run gnumake with -j <n> replacing it with simultaneous configures/builds 
of different targets.  That means a higher transient disk usage (storage) 
which would be a marginal problem for me due to lack of disk quota on the 
multi-way machines... ;-(  But that's me thinking about my environment, so 
it isn't a major objection

R.


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: revamped gdb_mbuild.sh
  2002-11-26  1:53 ` Richard Earnshaw
@ 2002-11-26  7:11   ` Andrew Cagney
  2002-11-26  7:41     ` Richard Earnshaw
  0 siblings, 1 reply; 16+ messages in thread
From: Andrew Cagney @ 2002-11-26  7:11 UTC (permalink / raw)
  Cc: Richard Earnshaw, gdb-patches

> Richard,
>> 
>> Finally got to trying the gdb_mbuild.sh script and, in the process, 
>> integrated some, er, `new features' from my old local script:
>> 
> 
> 
> Looks pretty good to me.  My only comment is that we loose the ability to 
> run gnumake with -j <n> replacing it with simultaneous configures/builds 
> of different targets.  That means a higher transient disk usage (storage) 
> which would be a marginal problem for me due to lack of disk quota on the 
> multi-way machines... ;-(  But that's me thinking about my environment, so 
> it isn't a major objection

I was wondering about a schema where one resource was allocated to 
configure while the remaining N-1 were allocated to a single build. 
That would mean an even faster turnaround on the first build (which I've 
found is what I'm after :-).

I guess we just wonder ...

Andrew



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: revamped gdb_mbuild.sh
  2002-11-26  7:11   ` Andrew Cagney
@ 2002-11-26  7:41     ` Richard Earnshaw
  2002-11-26  7:50       ` Andrew Cagney
  0 siblings, 1 reply; 16+ messages in thread
From: Richard Earnshaw @ 2002-11-26  7:41 UTC (permalink / raw)
  To: Andrew Cagney; +Cc: Richard Earnshaw, gdb-patches

> > Richard,
> >> 
> >> Finally got to trying the gdb_mbuild.sh script and, in the process, 
> >> integrated some, er, `new features' from my old local script:
> >> 
> > 
> > 
> > Looks pretty good to me.  My only comment is that we loose the ability to 
> > run gnumake with -j <n> replacing it with simultaneous configures/builds 
> > of different targets.  That means a higher transient disk usage (storage) 
> > which would be a marginal problem for me due to lack of disk quota on the 
> > multi-way machines... ;-(  But that's me thinking about my environment, so 
> > it isn't a major objection
> 
> I was wondering about a schema where one resource was allocated to 
> configure while the remaining N-1 were allocated to a single build. 
> That would mean an even faster turnaround on the first build (which I've 
> found is what I'm after :-).
> 
> I guess we just wonder ...
> 
> Andrew
> 
> 


How about -c <x> -j <y>?  Ie x configures in parallel & y make jobs in 
parallel?

R.


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: revamped gdb_mbuild.sh
  2002-11-26  7:41     ` Richard Earnshaw
@ 2002-11-26  7:50       ` Andrew Cagney
  2002-11-26  9:30         ` Richard Earnshaw
  0 siblings, 1 reply; 16+ messages in thread
From: Andrew Cagney @ 2002-11-26  7:50 UTC (permalink / raw)
  Cc: Richard Earnshaw, gdb-patches


> How about -c <x> -j <y>?  Ie x configures in parallel & y make jobs in 
> parallel?

In that script, a mindless implementation would result in:

	-c 2 -j 2

creating two tasks (-c 2), each running 'make -j 2' (for jobs at the max).

Is that your intent?  Or, as I suspect, try to sustain two configures 
and a single 'make -j 2'.

Andrew



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: revamped gdb_mbuild.sh
  2002-11-25 10:51 revamped gdb_mbuild.sh Andrew Cagney
  2002-11-26  1:53 ` Richard Earnshaw
@ 2002-11-26  8:50 ` David Carlton
  1 sibling, 0 replies; 16+ messages in thread
From: David Carlton @ 2002-11-26  8:50 UTC (permalink / raw)
  To: Andrew Cagney; +Cc: Richard Earnshaw, gdb-patches

Just checking: if I do 'gdb_mbuild.sh -f -k' I'll get behavior like
the current script?  (Well, the current script plus a small amount of
testing.)  I usually run this overnight, so I like the current
behavior.

David Carlton
carlton@math.stanford.edu


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: revamped gdb_mbuild.sh
  2002-11-26  7:50       ` Andrew Cagney
@ 2002-11-26  9:30         ` Richard Earnshaw
  2002-11-26 10:53           ` Andrew Cagney
  0 siblings, 1 reply; 16+ messages in thread
From: Richard Earnshaw @ 2002-11-26  9:30 UTC (permalink / raw)
  To: Andrew Cagney; +Cc: Richard Earnshaw, gdb-patches

> 
> > How about -c <x> -j <y>?  Ie x configures in parallel & y make jobs in 
> > parallel?
> 
> In that script, a mindless implementation would result in:
> 
> 	-c 2 -j 2
> 
> creating two tasks (-c 2), each running 'make -j 2' (for jobs at the max).
> 
> Is that your intent?  Or, as I suspect, try to sustain two configures 
> and a single 'make -j 2'.
> 
> Andrew
> 
> 


Yep, it would mean that in my case you could effectively run -c 1 -j 10 
and get fast builds with only the configures dropping down to single 
threaded (which would get most of the parallelism with the least transient 
disk space use) -- or have -c 2 -j 5 for a bit more configure parallelism 
with less make parallelism.  It would be a trade off that could be made by 
each user, and the load would be the product of the two.

R.


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: revamped gdb_mbuild.sh
  2002-11-26  9:30         ` Richard Earnshaw
@ 2002-11-26 10:53           ` Andrew Cagney
  2002-11-26 11:15             ` Richard Earnshaw
  0 siblings, 1 reply; 16+ messages in thread
From: Andrew Cagney @ 2002-11-26 10:53 UTC (permalink / raw)
  To: Richard.Earnshaw; +Cc: Richard Earnshaw, gdb-patches

(Technical nit, -j 10 (or -j 2), right now doesn't work.  The sim 
directory, well at least mn10300, has some missing dependencies :-()

> 
> 
> Yep, it would mean that in my case you could effectively run -c 1 -j 10 
> and get fast builds with only the configures dropping down to single 
> threaded (which would get most of the parallelism with the least transient 
> disk space use) -- or have -c 2 -j 5 for a bit more configure parallelism 
> with less make parallelism.  It would be a trade off that could be made by 
> each user, and the load would be the product of the two.

M'kay (already appears to work).  How about `-b N' where `-b' stands for 
``build'' (configure, make, run, ...) for the option name.

Andrew


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: revamped gdb_mbuild.sh
  2002-11-26 10:53           ` Andrew Cagney
@ 2002-11-26 11:15             ` Richard Earnshaw
  2002-11-27  8:30               ` Andrew Cagney
  0 siblings, 1 reply; 16+ messages in thread
From: Richard Earnshaw @ 2002-11-26 11:15 UTC (permalink / raw)
  To: Andrew Cagney; +Cc: Richard.Earnshaw, Richard Earnshaw, gdb-patches

> (Technical nit, -j 10 (or -j 2), right now doesn't work.  The sim 
> directory, well at least mn10300, has some missing dependencies :-()
> 

There you are, it's found one bug already :-) 

> > 
> > 
> > Yep, it would mean that in my case you could effectively run -c 1 -j 10 
> > and get fast builds with only the configures dropping down to single 
> > threaded (which would get most of the parallelism with the least transient 
> > disk space use) -- or have -c 2 -j 5 for a bit more configure parallelism 
> > with less make parallelism.  It would be a trade off that could be made by 
> > each user, and the load would be the product of the two.
> 
> M'kay (already appears to work).  How about `-b N' where `-b' stands for 
> ``build'' (configure, make, run, ...) for the option name.

Don't mind what they're called (provided they aren't 100 characters long 
:-)

R.


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: revamped gdb_mbuild.sh
  2002-11-26 11:15             ` Richard Earnshaw
@ 2002-11-27  8:30               ` Andrew Cagney
  2002-11-27  9:41                 ` Andrew Cagney
  2002-11-27  9:49                 ` Richard Earnshaw
  0 siblings, 2 replies; 16+ messages in thread
From: Andrew Cagney @ 2002-11-27  8:30 UTC (permalink / raw)
  To: Richard Earnshaw, David Carlton; +Cc: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2244 bytes --]

Ok,

Attached is an updated script:

> The changes are:
> 
> 
> - restartable
> 
> Instead of starting over from scratch, it tries to continue on from where the last run left off (after being CNTRL-Ced or failing).  To force a complete rebuild of each target, use the option:
> 
> `-f' (force) will force a new run
> 
> 
> - stop on failure
> 
> The script, by default, aborts on the first failed build.  The assumption is that the problem will be fixed and then the script re-started.  This can be overriden with the option:
> 
> `-k' (keep going) will force the script to try and build everything possible (the flag is passed to make as well).
> 
> 
> - parallel

It is possible to specify parallism at two levels.  Firstly the number 
of builds, and secondly the number of jobs MAKE tries to sustain.  Two 
options control this:

`-b MAXBUILDS' The number of builds to run in parallel.
`-j MAXJOBS' The number of jobs, whithin a build, that MAKE should run 
in parallel (using `make -j MAXJOBS').

These options are orthoginal, `-b 3 -j 2' will result in the script 
running up to three simultaneous `make -j 2'.

> - testing
> 
> In addition to checking the configure and build, the script also tries to run the built GDB to the point where it checks that '(gdb) maint print architecture' succeeds.
> 
> (NB: The h8500hms target currently barfs when run, I think I might propose that it be booted out of the build list).
> 
> 
> - selecting targets
> 
> A sub-set of targets can be selected using the option:
> 
> `-e <targexp>' Select a subset of the targets using the (grep) regular expression <targexp>.  Multiple expressions can be specified.

- more verbose output

By default the output from the configure and build is supressed (saved 
to a log file).  This can be disabled with:

-v (verbose) Provide more verbose output (e.g., output the configure, 
build and run results to stdout).

This is very useful from within emacs.  Something like `M-X compile' 
`./gdb_build.sh -v .. /tmp' works.


David, yes, `gdb_build.sh -k -f' should give you back something like the 
old behavior.

Richard, should `-j 2' be the default?  Now that this doesn't lead to 
two parallel configures (which is what I think hammers the poor host).

Andrew

[-- Attachment #2: gdb_mbuild.sh --]
[-- Type: text/plain, Size: 7552 bytes --]

#!/bin/sh

#  Multi-build script for testing compilation of all maintained configs of GDB.
#  Copyright (C) 2002  Free Software Foundation, Inc.
#  Contributed by Richard Earnshaw  (rearnsha@arm.com)

#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.

#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.

#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

usage() {
    cat <<EOF
Usage: gdb_mbuild.sh [ <options> ... ] <srcdir> <builddir>
 Options:
  -j <makejobs>  Run <makejobs> in parallel.  Passed to make.
		 On a single cpu machine, 2 is recommended.
  -b <maxbuilds> Run <maxbuild> builds in parallel.
		 On a single cpu machine, 1 is recommended.
  -v             Be more (and more, and more) verbose.
  -k             Keep going.  Do not stop after the first build fails.
  -e <regexp>    Regular expression for selecting the targets to build.
  -f             Force rebuild.  Even rebuild previously built directories.
 Environment variables examined (with default if not defined):
  MAKE (make)"
 Note: Everything in <builddir>/gdb-allcross will be blown away.
EOF
    exit 1;
}

### COMMAND LINE OPTIONS

makejobs=
maxbuilds=1
keepgoing=false
force=false
targexp=""
verbose=0
while test $# -gt 0
do
    case "$1" in
    -j )
	# Number of parallel make jobs.
	shift
	test $# -ge 1 || usage
	makejobs="-j $1"
	;;
    -b | -c )
	# Number of builds to fire off in parallel.
	shift
	test $# -ge 1 || usage
	maxbuilds=$1
	;;
    -k )
	# Should we soldier on after the first build fails?
	keepgoing=true
	;;
    -e )
	# A regular expression for selecting targets
	shift
	test $# -ge 1 || usage
	targexp="${targexp} -e ${1}"
	;;
    -f )
	# Force a rebuild
	force=true ; shift ;;
    -v )
	# Be more, and more, and more, verbose
	verbose=`expr ${verbose} + 1`
	;;
    -* ) usage ;;
    *) break ;;
    esac
    shift
done


### COMMAND LINE PARAMETERS

if test $# -ne 2
then
    usage
fi

# Convert these to absolute directory paths.

# Where the sources live
srcdir=`cd $1 && /bin/pwd` || exit 1

# Where the builds occur
builddir=`cd $2 && /bin/pwd` || exit 1


### ENVIRONMENT PARAMETERS

# Version of make to use
make=${MAKE:-make}
MAKE=${make}
export MAKE


# Where to look for the list of targets to test
maintainers=${srcdir}/gdb/MAINTAINERS
if [ ! -r ${maintainers} ]
then
    echo Maintainers file ${maintainers} not found
    exit 1
fi

# Get the list of targets and the build options
alltarg=`cat ${maintainers} | tr -s '[\t]' '[ ]' | sed -n '
/^[ ]*[-a-z0-9\.]*[ ]*[(]*--target=.*/ !d
s/^.*--target=//
s/).*$//
h
:loop
  g
  /^[^ ]*,/ !b end
  s/,[^ ]*//
  p
  g
  s/^[^,]*,//
  h
b loop
:end
p
' | if test "${targexp}" = ""
then
    grep -v -e broken -e OBSOLETE
else
    grep ${targexp}
fi`


# Run several jobs in parallel.
set --


# Usage: fail <message> <test-that-should-succeed>.  Should the build
# fail?  If the test is true, and we don't want to keep going, print
# the message and shoot everything in sight and abort the build.

fail ()
{
    msg="$1" ; shift
    if test "$@"
    then
	echo "${target}: ${msg}"
	if ${keepgoing}
	then
	    exit 1
	else
	    kill $$
	    exit 1
	fi
    fi
}


# Usage: log <logfile>.  Write standard input to <logfile> and (if
# verbose) stdout.

log ()
{
    if test ${verbose} -gt 0
    then
	tee $1
    else
	cat > $1
    fi
}



# Warn the user of what is comming, print the list of targets
echo "$alltarg"
echo ""


# For each target, configure and build it.
echo "$alltarg" | while true
do

    # Keep forking builds until we've exceed our build capacity

    while test $# -lt ${maxbuilds} && read target gdbopts simopts
    do

	(
	    trap "exit 1"  1 2 15
	    dir=${builddir}/${target}

	    # Should a scratch rebuild be forced?
	    if ${force}
	    then
		echo ... forcing ${target}
		rm -rf ${dir}
	    fi
	    
	    # Don't bother re-building a built target (indicated by
	    # ${dir} being a file).
	    if test -f ${dir}
	    then
		echo "${target}"
		exit 0
	    fi

	    echo ${target} ...

	    # Did the previous configure attempt fail?  If it did
	    # restart from scratch.
	    if test -d ${dir} -a ! -r ${dir}/gdb/Makefile
	    then
		echo ... removing partially configured ${target}
		rm -rf ${dir}
		if test -d ${dir}
		then
		    echo "${target}: unable to remove directory ${dir}"
		    exit 1
		fi
	    fi

	    # From now on, we're in this target's build directory
	    mkdir -p ${dir}
	    cd ${dir} || exit 1

	    # Configure, if not already.
	    if test ! -r gdb/Makefile
	    then
		# The config options
		__target="--target=${target}"
		__enable_gdb_warnings=`test -z "${gdbopts}" \
		    || echo "--enable-gdb-warnings=${gdbopts}"`
		__enable_sim_warnings=`test -z "${simopts}" \
		    || echo "--enable-sim-warnings=${simopts}"`
		echo ... configure ${target} \
		    ${__enable_gdb_warnings} \
		    ${__enable_sim_warnings}
		trap "echo Removing partially configured ${dir} directory ...; rm -rf ${dir}; exit 1" 1 2 15
		${srcdir}/configure \
		    ${__target} \
		    ${__enable_gdb_warnings} \
		    ${__enable_sim_warnings} \
		2>&1 | log Config.log
		trap "exit 1"  1 2 15
	    fi
	    fail "configure failed" ! -r gdb/Makefile

	    # Build, if not built.
	    if test ! -x gdb/gdb -a ! -x gdb/gdb.exe
	    then
		echo ... make ${makejobs} ${target}
		${make} ${makejobs} all-gdb 2>&1 | log 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 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

	    # Replace the build directory with a file as semaphore
	    # that stops a rebuild. (should the logs be saved?)
	    cd ${builddir}
	    rm -f ${target}.tmp
	    mv ${target}/Gdb.log ${target}.tmp
	    rm -rf ${target}
	    mv ${target}.tmp ${target}

	    # Success!
	    echo ... ${target} built

	) &

	# Append this to the list of things to wait for.  Grr, there
	# is a race condition as the cntrl-c could come in before the
	# trap is updated.
	set -- $* $!
	trap "echo Killing $*; kill $*; wait ; exit 1" 1 2 15

    done

    # If we've got zero jobs, we're finished
    if test $# -eq 0
    then
	break
    fi

    # Reap the first running process.  Unfortunatly, this doesn't help
    # if that process turns out to be the slowest.  Anyone got a
    # better suggestion?
    wait $1 ; shift

    # Prune the remaining processes, cuting out any others that have
    # finished.  This hopefully helps a little with the above problem
    # by maximising the number of jobs started each time round the
    # loop.
    jobs=""
    while test $# -gt 0
    do
	# still running?
	if kill -0 $1 > /dev/null 2>&1
	then
	    jobs="${jobs} $1"
	else
	    wait $1
	fi
	shift
    done
    set -- ${jobs}

done

exit 0

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: revamped gdb_mbuild.sh
  2002-11-27  8:30               ` Andrew Cagney
@ 2002-11-27  9:41                 ` Andrew Cagney
  2002-11-27  9:51                   ` Richard Earnshaw
  2002-11-27  9:49                 ` Richard Earnshaw
  1 sibling, 1 reply; 16+ messages in thread
From: Andrew Cagney @ 2002-11-27  9:41 UTC (permalink / raw)
  To: gdb-patches; +Cc: Andrew Cagney, Richard Earnshaw, David Carlton

PS: Something I forgot to mention.

The new script, once it has successfully configured, built, and run a 
target, replaces the BUILDDIR/TARGET directory with a BUILDDIR/TARGET 
file (-f removes this, this is how the script knows to not try to re-do 
a build).

Anyway, the significant thing here is that the file contains the output 
from the TARGET's ``(gdb) maint print architecture'' command.  Having 
that output for each architectures available [suddenly] makes it 
possible to examine/compare all the settings and, consequently, change 
those settings to something more logical.

enjoy,
Andrew


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: revamped gdb_mbuild.sh
  2002-11-27  8:30               ` Andrew Cagney
  2002-11-27  9:41                 ` Andrew Cagney
@ 2002-11-27  9:49                 ` Richard Earnshaw
  1 sibling, 0 replies; 16+ messages in thread
From: Richard Earnshaw @ 2002-11-27  9:49 UTC (permalink / raw)
  To: Andrew Cagney; +Cc: Richard Earnshaw, David Carlton, gdb-patches


ac131313@redhat.com said:
> Richard, should `-j 2' be the default?  Now that this doesn't lead to
> two parallel configures (which is what I think hammers the poor host).
> 

No, since I suspect output is harder to parse (interleaved messages).

R.


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: revamped gdb_mbuild.sh
  2002-11-27  9:41                 ` Andrew Cagney
@ 2002-11-27  9:51                   ` Richard Earnshaw
  2002-11-27 10:05                     ` Andrew Cagney
  0 siblings, 1 reply; 16+ messages in thread
From: Richard Earnshaw @ 2002-11-27  9:51 UTC (permalink / raw)
  To: Andrew Cagney; +Cc: gdb-patches, Richard Earnshaw, David Carlton

> PS: Something I forgot to mention.
> 
> The new script, once it has successfully configured, built, and run a 
> target, replaces the BUILDDIR/TARGET directory with a BUILDDIR/TARGET 
> file (-f removes this, this is how the script knows to not try to re-do 
> a build).
> 
> Anyway, the significant thing here is that the file contains the output 
> from the TARGET's ``(gdb) maint print architecture'' command.  Having 
> that output for each architectures available [suddenly] makes it 
> possible to examine/compare all the settings and, consequently, change 
> those settings to something more logical.
> 
> enjoy,
> Andrew
> 

What happens to the build logs?  Do we keep those?

R.


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: revamped gdb_mbuild.sh
  2002-11-27  9:51                   ` Richard Earnshaw
@ 2002-11-27 10:05                     ` Andrew Cagney
  2002-11-27 10:21                       ` David Carlton
  0 siblings, 1 reply; 16+ messages in thread
From: Andrew Cagney @ 2002-11-27 10:05 UTC (permalink / raw)
  To: Richard.Earnshaw; +Cc: gdb-patches, Richard Earnshaw, David Carlton

> PS: Something I forgot to mention.
>> 
>> The new script, once it has successfully configured, built, and run a 
>> target, replaces the BUILDDIR/TARGET directory with a BUILDDIR/TARGET 
>> file (-f removes this, this is how the script knows to not try to re-do 
>> a build).
>> 
>> Anyway, the significant thing here is that the file contains the output 
>> from the TARGET's ``(gdb) maint print architecture'' command.  Having 
>> that output for each architectures available [suddenly] makes it 
>> possible to examine/compare all the settings and, consequently, change 
>> those settings to something more logical.
>> 
>> enjoy,
>> Andrew
>> 
> 
> 
> What happens to the build logs?  Do we keep those?

At present both build and config logs, and the build directory get 
removed.  Only architecture output is left.

I think this is ok since, unlike before, the command is restartable.  If 
the build fails, just restart it with a more verbose option(1).

?
Andrew

(1) Although this doesn't help the mn10300's -j 2 build problem.  The 
second run mysteriously worked.





^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: revamped gdb_mbuild.sh
  2002-11-27 10:05                     ` Andrew Cagney
@ 2002-11-27 10:21                       ` David Carlton
  2002-11-27 10:37                         ` Andrew Cagney
  0 siblings, 1 reply; 16+ messages in thread
From: David Carlton @ 2002-11-27 10:21 UTC (permalink / raw)
  To: Andrew Cagney; +Cc: Richard.Earnshaw, gdb-patches

On Wed, 27 Nov 2002 13:05:35 -0500, Andrew Cagney <ac131313@redhat.com> said:

>>> The new script, once it has successfully configured, built, and run
>>> a target, replaces the BUILDDIR/TARGET directory with a
>>> BUILDDIR/TARGET file (-f removes this, this is how the script knows
>>> to not try to re-do a build).

> At present both build and config logs, and the build directory get
> removed.  Only architecture output is left.

> I think this is ok since, unlike before, the command is restartable.
> If the build fails, just restart it with a more verbose option.

Just checking: if the build fails, the logs aren't removed, right?
That's what you seem to be saying above, and that seems to be what the
script does if I'm reading it correctly, but given that I'm not sure I
understand your last paragraph.

Certainly I think it would be bad if the logs were deleted if the
build fails, but I don't mind if they're deleted if the build
succeeds.

David Carlton
carlton@math.stanford.edu


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: revamped gdb_mbuild.sh
  2002-11-27 10:21                       ` David Carlton
@ 2002-11-27 10:37                         ` Andrew Cagney
  0 siblings, 0 replies; 16+ messages in thread
From: Andrew Cagney @ 2002-11-27 10:37 UTC (permalink / raw)
  To: David Carlton; +Cc: Richard.Earnshaw, gdb-patches

> On Wed, 27 Nov 2002 13:05:35 -0500, Andrew Cagney <ac131313@redhat.com> said:
> 
> 
>>>> The new script, once it has successfully configured, built, and run
>>>> a target, replaces the BUILDDIR/TARGET directory with a
>>>> BUILDDIR/TARGET file (-f removes this, this is how the script knows
>>>> to not try to re-do a build).
> 
> 
>> At present both build and config logs, and the build directory get
>> removed.  Only architecture output is left.
> 
> 
>> I think this is ok since, unlike before, the command is restartable.
>> If the build fails, just restart it with a more verbose option.
> 
> 
> Just checking: if the build fails, the logs aren't removed, right?
> That's what you seem to be saying above, and that seems to be what the
> script does if I'm reading it correctly, but given that I'm not sure I
> understand your last paragraph.

Yes.

If the build fails, nothing, for that build, is removed.  The directory 
is still there, the logs are still there.  You can even cd to the 
corresponding build directory and try finishing the build by hand.  The 
next time the script is run, it will pick up from where you left off.

> Certainly I think it would be bad if the logs were deleted if the
> build fails, but I don't mind if they're deleted if the build
> succeeds.

Andrew



^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2002-11-27 18:37 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-11-25 10:51 revamped gdb_mbuild.sh Andrew Cagney
2002-11-26  1:53 ` Richard Earnshaw
2002-11-26  7:11   ` Andrew Cagney
2002-11-26  7:41     ` Richard Earnshaw
2002-11-26  7:50       ` Andrew Cagney
2002-11-26  9:30         ` Richard Earnshaw
2002-11-26 10:53           ` Andrew Cagney
2002-11-26 11:15             ` Richard Earnshaw
2002-11-27  8:30               ` Andrew Cagney
2002-11-27  9:41                 ` Andrew Cagney
2002-11-27  9:51                   ` Richard Earnshaw
2002-11-27 10:05                     ` Andrew Cagney
2002-11-27 10:21                       ` David Carlton
2002-11-27 10:37                         ` Andrew Cagney
2002-11-27  9:49                 ` Richard Earnshaw
2002-11-26  8:50 ` David Carlton

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox