Skip to content

Commit

Permalink
Clean up build process for cross-compiled targets.
Browse files Browse the repository at this point in the history
  * Over time, the process for producing an SBCL build for another
target architecture or OS has become more difficult and less
documented.

  * Move all make.sh argument processing to make-config.sh.

  * Have make-config.sh produce a file, output/build-config,
containing shell commands to set up important build parameters
such as where to find GNUMAKE, what SBCL_XC_HOST is, and so on.

  * Source output/build-config in most of the make*.sh scripts.

  * The practical upshot of all this is that a cross-compile
build is now a matter of alternating between target and host,
calling make-config.sh, make-host-1.sh, make-target-1.sh,
make-host-2.sh, make-target-2.sh, and following up with a
make-target-contrib.sh on the target, and you wind up with a
usable product.  And, as make-config.sh does all of the arg
parsing, you can pass --xc-host= or --dynamic-space-size= or
whatever and it all works out.
  • Loading branch information
Alastair Bridgewater committed Oct 22, 2011
1 parent c6989d6 commit 7d40722
Show file tree
Hide file tree
Showing 7 changed files with 202 additions and 175 deletions.
181 changes: 181 additions & 0 deletions make-config.sh
Expand Up @@ -17,6 +17,187 @@ set -e
# provided with absolutely no warranty. See the COPYING and CREDITS
# files for more information.

print_help="no"

# The classic form here was to use --userinit $DEVNULL --sysinit
# $DEVNULL, but that doesn't work on Win32 because SBCL doesn't handle
# device names properly. We still need $DEVNULL to be NUL on Win32
# because it's used elsewhere (such as canonicalize-whitespace), so we
# need an alternate solution for the init file overrides. --no-foos
# have now been available long enough that this should not stop anyone
# from building.
if [ "$OSTYPE" = "cygwin" -o "$OSTYPE" = "msys" ]
then
SBCL_PREFIX="$PROGRAMFILES/sbcl"
else
SBCL_PREFIX="/usr/local"
fi
SBCL_XC_HOST="sbcl --disable-debugger --no-userinit --no-sysinit"
export SBCL_XC_HOST

# Parse command-line options.
bad_option() {
echo $1
echo "Enter \"$0 --help\" for list of valid options."
exit 1
}

some_options=false
for option
do
optarg_ok=true
# Split --foo=bar into --foo and bar.
case $option in
*=*)
# For ease of scripting treat skip valued options with empty
# values.
optarg=`expr "X$option" : '[^=]*=\(.*\)'` || optarg_ok=false
option=`expr "X$option" : 'X\([^=]*=\).*'`
;;
*)
optarg=""
;;
esac

case $option in
--help | -help | -h)
print_help="yes" ;;
--prefix=)
$optarg_ok && SBCL_PREFIX=$optarg
;;
--xc-host=)
$optarg_ok && SBCL_XC_HOST=$optarg
;;
--dynamic-space-size=)
$optarg_ok && SBCL_DYNAMIC_SPACE_SIZE=$optarg
;;
-*)
bad_option "Unknown command-line option to $0: \"$option\""
;;
*)
if $some_options
then
bad_option "Unknown command-line option to $0: \"$option\""
else
legacy_xc_spec=$option
fi
;;
esac
some_options=true
done

# Previously XC host was provided as a positional argument.
if test -n "$legacy_xc_spec"
then
SBCL_XC_HOST="$legacy_xc_spec"
fi

if test "$print_help" = "yes"
then
cat <<EOF
\`make.sh' drives the SBCL build.
Usage: $0 [OPTION]...
Important: make.sh does not currently control the entirety of the
build: configuration file customize-target-features.lisp and certain
environment variables play a role as well. see file INSTALL for
details.
Options:
-h, --help Display this help and exit.
--prefix=<path> Specify the install location.
Script install.sh installs SBCL under the specified prefix
path: runtime as prefix/bin/sbcl, additional files under
prefix/lib/sbcl, and documentation under prefix/share.
This option also affects the binaries: built-in default for
SBCL_HOME is: prefix/lib/sbcl/
Default prefix is: /usr/local
--dynamic-space-size=<size> Default dynamic-space size for target.
This specifies the default dynamic-space size for the SBCL
being built. If you need to control the dynamic-space size
of the host SBCL, use the --xc-host option.
If not provided, the default is platform-specific. <size> is
taken to be megabytes unless explicitly suffixed with Gb in
order to specify the size in gigabytes.
--xc-host=<string> Specify the Common Lisp compilation host.
The string provided should be a command to invoke the
cross-compilation Lisp system in such a way, that it reads
commands from standard input, and terminates when it reaches end
of file on standard input.
Examples:
"sbcl --disable-debugger --no-sysinit --no-userinit"
Use an existing SBCL binary as a cross-compilation
host even though you have stuff in your
initialization files which makes it behave in such a
non-standard way that it keeps the build from
working. Also disable the debugger instead of
waiting endlessly for a programmer to help it out
with input on *DEBUG-IO*. (This is the default.)
"sbcl"
Use an existing SBCL binary as a cross-compilation
host, including your initialization files and
building with the debugger enabled. Not recommended
for casual users.
"lisp -noinit -batch"
Use an existing CMU CL binary as a cross-compilation
host when you have weird things in your .cmucl-init
file.
EOF
exit 1
fi

mkdir -p output
# Save prefix for make and install.sh.
echo "SBCL_PREFIX='$SBCL_PREFIX'" > output/prefix.def
echo "$SBCL_DYNAMIC_SPACE_SIZE" > output/dynamic-space-size.txt

# FIXME: Tweak this script, and the rest of the system, to support
# a second bootstrapping pass in which the cross-compilation host is
# known to be SBCL itself, so that the cross-compiler can do some
# optimizations (especially specializable arrays) that it doesn't
# know how to implement how in a portable way. (Or maybe that wouldn't
# require a second pass, just testing at build-the-cross-compiler time
# whether the cross-compilation host returns suitable values from
# UPGRADED-ARRAY-ELEMENT-TYPE?)

if [ "$OSTYPE" = "cygwin" -o "$OSTYPE" = "msys" ] ; then
DEVNULL=NUL
else
DEVNULL=/dev/null
fi
export DEVNULL

. ./find-gnumake.sh
find_gnumake

. ./generate-version.sh
generate_version

# Now that we've done our option parsing and found various
# dependencies, write them out to a file to be sourced by other
# scripts.

echo "export DEVNULL=\"$DEVNULL\"" > output/build-config
echo "export GNUMAKE=\"$GNUMAKE\"" >> output/build-config
echo "export SBCL_XC_HOST=\"$SBCL_XC_HOST\"" >> output/build-config
echo "export legacy_xc_spec=\"$legacy_xc_spec\"" >> output/build-config

# And now, sorting out the per-target dependencies...

case `uname` in
Linux)
sbcl_os="linux"
Expand Down
3 changes: 3 additions & 0 deletions make-host-1.sh
Expand Up @@ -20,6 +20,9 @@ LANG=C
LC_ALL=C
export LANG LC_ALL

# Load our build configuration
. output/build-config

# Compile and load the cross-compiler. (We load it here not because we're
# about to use it, but because it's written under the assumption that each
# file will be loaded before the following file is compiled.)
Expand Down
3 changes: 3 additions & 0 deletions make-host-2.sh
Expand Up @@ -20,6 +20,9 @@ LANG=C
LC_ALL=C
export LANG LC_ALL

# Load our build configuration
. output/build-config

# In some cases, a debugging build of the system will creates a core
# file output/after-xc.core in the next step. In cases where it
# doesn't, it's confusing and basically useless to have any old copies
Expand Down
3 changes: 3 additions & 0 deletions make-target-1.sh
Expand Up @@ -20,6 +20,9 @@ LANG=C
LC_ALL=C
export LANG LC_ALL

# Load our build configuration
. output/build-config

# Build the runtime system and symbol table (.nm) file.
#
# (This C build has to come after the first genesis in order to get
Expand Down
3 changes: 3 additions & 0 deletions make-target-2.sh
Expand Up @@ -20,6 +20,9 @@ LANG=C
LC_ALL=C
export LANG LC_ALL

# Load our build configuration
. output/build-config

# Do warm init stuff, e.g. building and loading CLOS, and stuff which
# can't be done until CLOS is running.
#
Expand Down
4 changes: 2 additions & 2 deletions make-target-contrib.sh
Expand Up @@ -20,8 +20,8 @@ LANG=C
LC_ALL=C
export LANG LC_ALL

. ./find-gnumake.sh
find_gnumake
# Load our build configuration
. output/build-config

. ./sbcl-pwd.sh
sbcl_pwd
Expand Down

0 comments on commit 7d40722

Please sign in to comment.