executor/util/configure.sh

581 lines
14 KiB
Bash
Executable File

#!/bin/sh
# usage: ./configure.sh [options]
# options:
# --cflags='flags' (default "-g")
# --host='host' (no default)
# --host-file-format='format (no default)
# --build='build' (no default)
# --host-gcc='gcc' (default "gcc", if build and host are same)
# --host-strip='strip' (default "strip")
# --host-nm='nm' (default "nm")
# --root='dir' (default "..")
# --front-end='front-end'
# one of `x', `nextstep', `dos', `svgalib', `win32', 'sdl' (no default)
# --syn68k-host='host'
# --sound='sound'
cflags='-g'
root='..'
# save away arguments to be used when creating the `config.status'
arguments=''
while [ $# != 0 ]; do
arg="$1"; shift
# append the next argument onto the argument list for `config.status'
arguments="$arguments '$arg'"
case "${arg}" in
# options
-*=*)
opt=`echo ${arg} | sed 's:^-*\([^=]*\)=.*$:\1:'`
val=`echo ${arg} | sed 's:^-*[^=]*=\(.*\)$:\1:'`
## Change `-' in the option name to `_'.
optname="${opt}"
opt="`echo ${opt} | tr - _`"
case "${opt}" in
"cflags")
cflags="${val}"
;;
"root")
root="${val}"
;;
"host")
host="${val}"
;;
"host_gcc")
host_gcc="${val}"
;;
"host_strip")
host_strip="${val}"
;;
"host_nm")
host_nm="${val}"
;;
"build")
build="${val}"
;;
"front_end")
front_end="${val}"
;;
"host_file_format")
host_file_format="${val}"
;;
"syn68k_host")
syn68k_host="${val}"
;;
"sound")
sound="${val}"
;;
*)
echo "unknown option \`${arg}', ignored"
;;
esac
;;
*)
echo "unknown option \`${arg}', ignored"
;;
esac
done
util_dir=${root}/util
if [ "${host}" = "" ]; then
echo "Fatal error: you must specify a host. Exiting."
exit 1
fi
if [ "${front_end}" = "" ]; then
echo "Fatal error: you must specify a front end. Exiting."
exit 1
fi
if [ "${build}" = "" ]; then
echo "You did not specify a build. Taking a guess."
build=`${root}/util/config.guess`
if [ "${build}" = "" ]; then
echo "config.guess failed to determine the build type. Exiting."
exit 1
else
echo "This appears to be a \`${build}'."
fi
fi
case "${front_end}" in
x | nextstep | dos | svgalib | win32 | sdl)
;;
*)
echo "Fatal error: unknown front end \`${front_end}'. Exiting."
exit 1
;;
esac
case "${sound}" in
dummy | djgpp | linux | sdl)
;;
*)
echo "Fatal error: unknown sound \`${sound}'. Exiting."
exit 1
;;
esac
# canonicalize the name of the host; this should
# give us the name used for tool configuration
if canonical_host=`${root}/util/config.sub "${host}"` ; then : ; else
exit $?
fi
# canonicalize the name of the build; this should
# give us the name used for tool configuration
if canonical_build=`${root}/util/config.sub "${build}"` ; then : ; else
exit $?
fi
if [ "${host_gcc}" = "" ]; then
if [ "${canonical_host}" = "${canonical_build}" ]; then
host_gcc=gcc
else
echo "Fatal error: host and build differ, host gcc must by specified. Exiting."
exit 1
fi
fi
if [ "${host_nm}" = "" ]; then
host_nm=nm
fi
if [ "${host_strip}" = "" ]; then
host_strip=strip
fi
case ${canonical_host} in
m68k-next-ns* | m68k-next-bsd* | m68k-next-mach* | m68k-next-nextstep*)
host_os='next'
host_syn68k='next'
host_arch='m68k'
host_file_format='mach-o'
objc='yes'
;;
i[3456]86-next-ns* | i[3456]86-next-bsd* | i[3456]86-next-mach* \
| i[3456]86-next-nextstep*)
host_os='next'
host_syn68k='next'
host_arch='i386'
host_file_format='mach-o'
objc='yes'
;;
i[3456]86-msdos-go32 | i[3456]86-go32-bsd | i[3456]86-unknown-msdos)
host_os='msdos'
host_syn68k='msdos'
host_file_format='coff'
host_arch='i386'
;;
# NOTE: Historically we've used mingw32 but called it cygwin. The reason
# we use mingw32 is because it has a license compatible with Executor.
# However, since internally we've called it cygwin, I'm hesitant to change
# cygwin to mingw32 everywhere right now (20031217).
i[3456]86-pc-mingw32)
host_os='cygwin32'
host_syn68k='mingw32'
echo host os set to cygwin32 which is a misnomer. this really is mingw32
host_file_format='pe'
host_arch='i386'
;;
i[3456]86-pc-cygwin32)
host_os='cygwin32'
host_syn68k='cygwin32'
host_file_format='pe'
host_arch='i386'
;;
alpha-unknown-linux)
host_os='linux'
host_syn68k='linux'
host_file_format='elf'
host_arch='alpha'
;;
powerpc-unknown-linux)
host_os='linux'
host_syn68k='linux'
host_file_format='elf'
host_arch='powerpc'
;;
i[3456]86-unknown-linux)
host_os='linux'
host_syn68k='linux'
host_arch='i386'
if [ x"${host_file_format}" = x"" ]; then
# default linux file format; this may change
host_file_format='a.out'
fi
;;
i[456]86-unknown-macosx)
host_os='macosx'
host_syn68k='macosx'
host_arch='i386'
if [ x"${host_file_format}" = x"" ]; then
# default linux file format; this may change
host_file_format='mach-o'
fi
;;
powerpc-unknown-macosx)
host_os='macosx'
host_syn68k='macosx'
host_arch='powerpc' # how we refer to it
host_gcc_arch='ppc' # how gcc -arch wants us to call it
if [ x"${host_file_format}" = x"" ]; then
# default linux file format; this may change
host_file_format='mach-o'
fi
;;
*)
echo "Fatal error: unknown host \`${canonical_host}'. Exiting."
exit 1
;;
esac
case ${canonical_build} in
m68k-next-ns* | m68k-next-bsd* | m68k-next-mach* \
| m68k-next-nextstep*)
build_os='next'
build_arch='m68k'
objc='yes'
;;
i[3456]86-next-ns* | i[3456]86-next-bsd* | i[3456]86-next-mach* \
| i[3456]86-next-nextstep*)
build_os='next'
build_arch='i386'
objc='yes'
;;
i[3456]86-msdos-go32 | i[3456]86-go32-bsd | i[3456]86-unknown-msdos)
build_os='msdos'
build_arch='i386'
;;
alpha-unknown-linux)
build_os='linux'
build_arch='alpha'
;;
powerpc-unknown-linux)
build_os='linux'
build_arch='powerpc'
;;
i[3456]86-unknown-linux)
build_os='linux'
build_arch='i386'
;;
i[456]86-unknown-macosx)
build_os='macosx'
build_arch='i386'
objc='yes'
;;
powerpc-unknown-macosx)
build_os='macosx'
build_arch='powerpc'
objc='yes'
;;
*)
echo "Fatal error: unknown build \`${canonical_build}'. Exiting."
exit 1
;;
esac
# check for the host directories
host_arch_dir=${root}/src/config/arch/${host_arch}
if [ ! -d ${host_arch_dir} ]; then
echo "Fatal error: host arch directory \`${host_arch_dir}' not found. Exiting."
exit 1
fi
host_os_dir=${root}/src/config/os/${host_os}
if [ ! -d ${host_os_dir} ]; then
echo "Fatal error: host os directory \`${host_os_dir}' not found. Exiting."
exit 1
fi
if [ -r ${root}/src/config/os/${host_os}/${host_os}.make ]; then
if [ -r ${root}/src/config/os/${host_os}/${host_os}.sh ]; then
${root}/src/config/os/${host_os}/${host_os}.sh \
"${host_gcc}" \
"${cflags}" \
${root}/src/config/os/${host_os}/${host_os}.make \
__config__.host_os.make
if [ $? != "0" ]; then
echo "Fatal error: host os configuration failed. Exiting."
exit 1
fi
host_os_make=__config__.host_os.make
else
host_os_make=${root}/src/config/os/${host_os}/${host_os}.make
fi
else
host_os_make="/dev/null"
fi
if [ -r ${root}/src/config/arch/${host_arch}/${host_arch}.make ]; then
host_arch_make=${root}/src/config/arch/${host_arch}/${host_arch}.make
else
host_arch_make="/dev/null"
fi
if [ -r ${root}/src/config/front-ends/${front_end}/${front_end}.sh ]; then
# generate the front end makefile front the front end template
# make file `${front_end}.make'
# there must be a front-end makefile fragment
${root}/src/config/front-ends/${front_end}/${front_end}.sh \
"${host_gcc}" \
"${cflags}" \
${root}/src/config/front-ends/${front_end}/${front_end}.make \
__config__.front_end.make
if [ $? != "0" ]; then
echo "Fatal error: front end configuration failed. Exiting"
exit 1
fi
front_end_make=__config__.front_end.make
else
# there must be a front-end makefile fragment
front_end_make=${root}/src/config/front-ends/${front_end}/${front_end}.make
fi
# there must be a front-end config header
front_end_config_h=${root}/src/config/front-ends/${front_end}/${front_end}.h
if [ -r ${root}/src/config/sound/${sound}/${sound}.make ]; then
if [ -r ${root}/src/config/sound/${sound}/${sound}.sh ]; then
${root}/src/config/sound/${sound}/${sound}.sh \
"${host_gcc}" \
"${cflags}" \
${root}/src/config/sound/${sound}/${sound}.make \
__config__.sound.make
if [ $? != "0" ]; then
echo "Fatal error: host os configuration failed. Exiting."
exit 1
fi
sound_make=__config__.sound.make
else
sound_make=${root}/src/config/sound/${sound}/${sound}.make
fi
else
sound_make="/dev/null"
fi
executor_make=${root}/src/executor.make
# link `front-end-config.h' to the front end config header
rm -f front-end-config.h
ln -s ${front_end_config_h} front-end-config.h
# arch determines syn68k usage
rm -f host-arch-config.h
if [ -r ${root}/src/config/arch/${host_arch}/${host_arch}.h ]; then
host_arch_h=${root}/src/config/arch/${host_arch}/${host_arch}.h
ln -s ${host_arch_h} host-arch-config.h
cat > ./test.c.sed << __EOF__
#include <stdio.h>
#include "@host_arch_h@"
int main ()
{
printf (
#if defined (SYN68K)
"yes"
#else
""
#endif /* SYN68K */
);
}
__EOF__
sed -e "s:@host_arch_h@:${host_arch_h}:" \
< ./test.c.sed > ./test.c
gcc -I${root}/src/include -o ./test ./test.c
if [ x"`./test`" = x"" ]; then
syn68k=''
else
syn68k='yes'
fi
rm -f ./test.c.sed ./test.c ./test
else
# create an empty `host-arch-config.h'
touch host-arch-config.h
host_conf_h=""
syn68k=''
fi
rm -f host-os-config.h
if [ -r ${root}/src/config/os/${host_os}/${host_os}.h ]; then
host_os_h=${root}/src/config/os/${host_os}/${host_os}.h
ln -s ${host_os_h} host-os-config.h
else
# create an empty `host-os-config.h'
touch host-os-config.h
host_os_h=""
fi
rm -f build-arch-config.h
if [ -r ${root}/src/config/arch/${build_arch}/${build_arch}.h ]; then
build_arch_h=${root}/src/config/arch/${build_arch}/${build_arch}.h
ln -s ${build_arch_h} build-arch-config.h
else
# create an empty `build-arch-config.h'
touch build-arch-config.h
build_arch_h=""
fi
rm -f build-os-config.h
if [ -r ${root}/src/config/os/${build_os}/${build_os}.h ]; then
build_os_h=${root}/src/config/os/${build_os}/${build_os}.h
ln -s ${build_os_h} build-os-config.h
else
# create an empty `build-os-config.h'
touch build-os-config.h
build_os_h=""
fi
rm -f sound-config.h
if [ -r ${root}/src/config/sound/${sound}/${sound}-sound.h ]; then
sound_h=${root}/src/config/sound/${sound}/${sound}-sound.h
ln -s ${sound_h} sound-config.h
else
# create an empty `sound-config.h'
touch sound-config.h
sound_h=""
fi
if [ x"${syn68k}" = x"yes" ]; then
# syn68k_define='-DSYN68K'
syn68k_define=''
syn68k_lib='libsyn68k.a'
if [ x$syn68k_host = x"" ]; then
syn68k_host="${host_arch}-${host_syn68k}-${host_file_format}"
fi
else
syn68k_define=''
syn68k_lib=''
syn68k_host=''
fi
cat > ./test.c << __EOF__
int foo;
__EOF__
${host_gcc} -c test.c
symbol=`${host_nm} test.o | awk '/foo/ { print $3; }'`
case ${symbol} in
_foo)
symbol_prefix='_'
;;
foo)
symbol_prefix=''
;;
*)
echo "Error: unknown asm symbol \`${symbol}', exiting."
exit 1
esac
rm -f ./test.c ./test.o
if ${host_gcc} --version | egrep -q 'egcs-2\.91'; then
egcs_dcconvert_workaround=-fno-omit-frame-pointer
else
egcs_dcconvert_workaround=
fi
${util_dir}/subst.pl \
@host_arch_make@:${host_arch_make} \
@host_os_make@:${host_os_make} \
@front_end_make@:${front_end_make} \
@sound_make@:${sound_make} \
@executor_make@:${executor_make} < ${root}/src/config/Makefile.in > ./tmp-Makefile.in
if [ x"${host_gcc_arch}" = x"" ]; then
host_gcc_arch="$host_arch"
fi
sed -e "s:@symbol_prefix@:${symbol_prefix}:g
s:@host@:${host}:g
s:@canonical_host@:${canonical_host}:g
s:@host_arch@:${host_arch}:g
s:@host_os@:${host_os}:g
s:@host_gcc@:${host_gcc}:g
s:@host_strip@:${host_strip}:g
s:@host_file_format@:${host_file_format}:g
s:@build@:${build}:g
s:@canonical_build@:${canonical_build}:g
s:@build_arch@:${build_arch}:g
s:@build_os@:${build_os}:g
s:@front_end@:${front_end}:g
s:@sound@:${sound}:g
s:@front_end_make@:${front_end_make}:g
s:@root@:${root}:g
s:@syn68k_define@:${syn68k_define}:g
s:@syn68k_lib@:${syn68k_lib}:g
s:@syn68k_host@:${syn68k_host}:g
s:@cflags@:${cflags}:g
s:@egcs_dcconvert_workaround@:${egcs_dcconvert_workaround}:g
s:@arch@:${host_gcc_arch}:g" < ./tmp-Makefile.in > ./Makefile
rm -f ./tmp-Makefile.in
if [ x"${syn68k}" = x"yes" ]; then
sed -e "/^ifnosyn68k$/,/^end ifnosyn68k$/d" \
-e "/^ifsyn68k$/d" \
-e "/^end ifsyn68k$/d" < ./Makefile > ./tmp-Makefile
else
sed -e "/^ifsyn68k$/,/^end ifsyn68k$/d" \
-e "/^ifnosyn68k$/d" \
-e "/^end ifnosyn68k$/d" < ./Makefile > ./tmp-Makefile
fi
rm -f ./Makefile
mv ./tmp-Makefile ./Makefile
if [ x"${objc}" = x"yes" ]; then
sed -e "/^ifobjc$/d" \
-e "/^end ifobjc$/d" < ./Makefile > ./tmp-Makefile
else
sed -e "/^ifobjc$/,/^end ifobjc$/d" < ./Makefile > ./tmp-Makefile
fi
rm -f ./Makefile
mv ./tmp-Makefile ./Makefile
# cleanup
rm -f __config__.*
# create a config.status
mv config.status config.status.running
rm -rf config.status.running
echo '#!/bin/sh' > config.status
echo >> config.status
echo "${root}/util/configure.sh $arguments" >> config.status
chmod +x config.status
echo "Executor is now configured for \`${host_arch}-${host_os}/${front_end}'."