mirror of
https://github.com/brain-hackers/cegcc-build.git
synced 2024-12-22 20:20:08 +09:00
392b058298
These are disabled by default when `development=false`, which is set by `binutils/bfd/development.sh`. However, while `gdb/configure.ac` includes this file, `gdbsupport/configure.ac` does not, and thus the two disagree on whether unit tests shall be built. This causes linker failures due to missing symbols. By explicitly disabling the unit tests (or enabling them), both `configure` scripts agree on the setting and the build succeeds. Since we don't run the unit tests (and this is not a gdb development build), we should simply disable them. Closes https://github.com/MaxKellermann/cegcc-build/issues/6
504 lines
12 KiB
Bash
Executable File
504 lines
12 KiB
Bash
Executable File
#! /usr/bin/env bash
|
|
|
|
set -e
|
|
|
|
BASE_DIRECTORY=`dirname $0`
|
|
BASE_DIRECTORY=`(cd ${BASE_DIRECTORY}; pwd)`
|
|
ME=`basename $0`
|
|
|
|
# FIXME: some components need this (mingwdll), but they shouldn't.
|
|
export BASE_DIRECTORY
|
|
|
|
#
|
|
# Initializations.
|
|
#
|
|
export BUILD_DIR=`pwd`
|
|
|
|
ac_default_prefix="/opt/cegcc"
|
|
|
|
# The list of components, in build order. There's a build_FOO
|
|
# function for each of these components
|
|
COMPONENTS=( binutils bootstrap_gcc mingw w32api gcc )
|
|
#profile docs
|
|
COMPONENTS_NUM=${#COMPONENTS[*]}
|
|
|
|
# Build comma separated list of components, for user display.
|
|
for ((i=0;i<$COMPONENTS_NUM;i++)); do
|
|
if [ $i = 0 ]; then
|
|
COMPONENTS_COMMA_LIST=${COMPONENTS[${i}]}
|
|
else
|
|
COMPONENTS_COMMA_LIST="${COMPONENTS_COMMA_LIST}, ${COMPONENTS[${i}]}"
|
|
fi
|
|
done
|
|
|
|
usage()
|
|
{
|
|
cat << _ACEOF
|
|
|
|
$ME builds the mingw32ce toolchain.
|
|
|
|
Usage: $0 [OPTIONS] ...
|
|
|
|
-h, --help print this help, then exit
|
|
--prefix=PREFIX install toolchain in PREFIX
|
|
[$ac_default_prefix]
|
|
--host=HOST host on which the toolchain will run [BUILD]
|
|
--target=TARGET configure for building compilers for TARGET [arm-mingw32ce]
|
|
-j, --parallelism PARALLELISM Pass PARALLELISM as -jPARALLELISM
|
|
to make invocations.
|
|
--components=LIST specify which components to build
|
|
valid components are: ${COMPONENTS_COMMA_LIST}
|
|
[all]
|
|
--incremental do an incremental build
|
|
|
|
Report bugs to <cegcc-devel@lists.sourceforge.net>.
|
|
_ACEOF
|
|
|
|
}
|
|
|
|
ac_prev=
|
|
for ac_option
|
|
do
|
|
# If the previous option needs an argument, assign it.
|
|
if test -n "$ac_prev"; then
|
|
eval "$ac_prev=\$ac_option"
|
|
ac_prev=
|
|
continue
|
|
fi
|
|
|
|
ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)' ||true`
|
|
|
|
case $ac_option in
|
|
|
|
-help | --help | --hel | --he | -h)
|
|
usage; exit 0 ;;
|
|
|
|
-j | --parallelism | --parallelis | --paralleli | --parallel \
|
|
| --paralle | --parall | --paral | --para | --par \
|
|
| --pa)
|
|
ac_prev=parallelism ;;
|
|
-j=* | --parallelism=* | --parallelis=* | --paralleli=* | --parallel=* \
|
|
| --paralle=* | --parall=* | --paral=* | --para=* | --par=* \
|
|
| --pa=*)
|
|
parallelism=$ac_optarg ;;
|
|
-j*)
|
|
parallelism=`echo $ac_option | sed 's/-j//'` ;;
|
|
|
|
-prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
|
|
ac_prev=prefix ;;
|
|
-prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
|
|
prefix=$ac_optarg ;;
|
|
|
|
-components | --components | --component | --componen | \
|
|
--compone | --compon | --compo | --comp | --com \
|
|
| --co | --c)
|
|
ac_prev=components ;;
|
|
-components=* | --components=* | --component=* | --componen=* \
|
|
| --compone=* | --compon=* | --compo=* | --comp=* | --com=* \
|
|
| --co=* | --c=*)
|
|
components=$ac_optarg ;;
|
|
|
|
--host)
|
|
ac_prev=host ;;
|
|
--host=*)
|
|
host=$ac_optarg ;;
|
|
|
|
--target)
|
|
ac_prev=target ;;
|
|
--target=*)
|
|
target=$ac_optarg ;;
|
|
|
|
--incremental)
|
|
incremental=yes ;;
|
|
|
|
-*) { echo "$as_me: error: unrecognized option: $ac_option
|
|
Try \`$0 --help' for more information." >&2
|
|
{ (exit 1); exit 1; }; }
|
|
;;
|
|
|
|
*=*)
|
|
ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
|
|
# Reject names that are not valid shell variable names.
|
|
expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
|
|
{ echo "$as_me: error: invalid variable name: $ac_envvar" >&2
|
|
{ (exit 1); exit 1; }; }
|
|
ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
|
|
eval "$ac_envvar='$ac_optarg'"
|
|
export $ac_envvar ;;
|
|
|
|
*)
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# We don't want no errors from here on.
|
|
set -e
|
|
|
|
if test -n "$ac_prev"; then
|
|
ac_option=--`echo $ac_prev | sed 's/_/-/g'`
|
|
{ echo "$as_me: error: missing argument to $ac_option" >&2
|
|
{ (exit 1); exit 1; }; }
|
|
fi
|
|
|
|
# Be sure to have absolute paths.
|
|
for ac_var in prefix
|
|
do
|
|
eval ac_val=$`echo $ac_var`
|
|
case $ac_val in
|
|
[\\/$]* | ?:[\\/]* | NONE | '' ) ;;
|
|
*) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
|
|
{ (exit 1); exit 1; }; };;
|
|
esac
|
|
done
|
|
|
|
if [ "x${prefix}" != "x" ]; then
|
|
export PREFIX="${prefix}"
|
|
else
|
|
export PREFIX=${ac_default_prefix}
|
|
fi
|
|
|
|
# Figure out what components where requested to be built.
|
|
if test x"${components+set}" != xset; then
|
|
components=all
|
|
else
|
|
if test x"${components}" = x ||
|
|
test x"${components}" = xyes;
|
|
then
|
|
echo --components needs at least one argument 1>&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
if [ "x${parallelism}" != "x" ]; then
|
|
PARALLELISM="-j${parallelism}"
|
|
else
|
|
PARALLELISM=
|
|
fi
|
|
|
|
# embedded tabs in the sed below -- do not untabify
|
|
components=`echo "${components}" | sed -e 's/[ ,][ ,]*/,/g' -e 's/,$//'`
|
|
|
|
# Don't build in source directory, it will clobber things and cleanup is hard.
|
|
if [ -d ${BUILD_DIR}/.git ]; then
|
|
echo "Don't build in a source directory, please create an empty directory and build there."
|
|
echo "Example :"
|
|
echo " mkdir /tmp/cegcc-output"
|
|
echo " cd /tmp/cegcc-output"
|
|
echo " \$OLDPWD/build.sh $@"
|
|
exit 1
|
|
fi
|
|
|
|
# configure_module MODULE SUBDIR [configure-arguments ...]
|
|
function configure_module()
|
|
{
|
|
local module="$1"
|
|
local subdir="$2"
|
|
shift 2
|
|
|
|
src="${BASE_DIRECTORY}/${module}"
|
|
|
|
mkdir -p $subdir
|
|
cd $subdir
|
|
|
|
if [ "$incremental" = "yes" \
|
|
-a Makefile -nt $src/configure \
|
|
-a Makefile -nt $src/Makefile.in ]; then
|
|
# Makefile is fresh, don't need to reconfigure
|
|
return
|
|
fi
|
|
|
|
$src/configure \
|
|
--prefix=${PREFIX} \
|
|
--build=${BUILD} \
|
|
"$@"
|
|
}
|
|
|
|
function configure_host_module()
|
|
{
|
|
configure_module "$@" \
|
|
--host=${HOST} \
|
|
--target=${TARGET}
|
|
}
|
|
|
|
function configure_target_module()
|
|
{
|
|
configure_module "$@" \
|
|
--host=${TARGET} \
|
|
--target=${TARGET}
|
|
}
|
|
|
|
build_binutils()
|
|
{
|
|
echo ""
|
|
echo "BUILDING BINUTILS --------------------------"
|
|
echo ""
|
|
echo ""
|
|
configure_host_module binutils binutils \
|
|
--disable-unit-tests \
|
|
--disable-nls \
|
|
--disable-werror
|
|
|
|
make ${PARALLELISM}
|
|
make install
|
|
|
|
cd ${BUILD_DIR}
|
|
}
|
|
|
|
build_bootstrap_gcc()
|
|
{
|
|
configure_host_module gcc gcc-bootstrap \
|
|
--with-gcc \
|
|
--with-gnu-ld \
|
|
--with-gnu-as \
|
|
--disable-threads \
|
|
--disable-nls \
|
|
--enable-languages=c \
|
|
--disable-win32-registry \
|
|
--disable-multilib \
|
|
--disable-shared \
|
|
--disable-interwork \
|
|
--without-newlib \
|
|
--enable-checking
|
|
|
|
make ${PARALLELISM} all-gcc
|
|
make configure-target-libgcc
|
|
make install-gcc
|
|
|
|
gcc_version=`${PREFIX}/bin/${TARGET}-gcc -dumpversion`
|
|
|
|
cd ${TARGET}/libgcc
|
|
make ${PARALLELISM} libgcc.a
|
|
/usr/bin/install -c -m 644 libgcc.a ${PREFIX}/lib/gcc/${TARGET}/${gcc_version}
|
|
|
|
cd ${BUILD_DIR}
|
|
}
|
|
|
|
build_w32api()
|
|
{
|
|
configure_target_module w32api w32api
|
|
|
|
make ${PARALLELISM}
|
|
make install
|
|
|
|
#
|
|
# Create a cegcc.h file with some sensible input
|
|
# Code is copied from the scripts/make_release.sh script.
|
|
# This will probably always have "old" numbers
|
|
#
|
|
# CEGCC_VERSION_MAJOR=`echo $VERSION | awk -F. '{print $1}'`
|
|
# CEGCC_VERSION_MINOR=`echo $VERSION | awk -F. '{print $2}'`
|
|
# CEGCC_VERSION_PATCHLEVEL=`echo $VERSION | awk -F. '{print $3}'`
|
|
#
|
|
# Version patchlevel 999 refers to SVN from now on :-)
|
|
#
|
|
CEGCC_VERSION_MAJOR=0
|
|
CEGCC_VERSION_MINOR=55
|
|
CEGCC_VERSION_PATCHLEVEL=999
|
|
#
|
|
INCFILE=${BASE_DIRECTORY}/w32api/include/cegcc.h.in
|
|
DESTFILE=${PREFIX}/${TARGET}/include/cegcc.h
|
|
#
|
|
L1=`grep -s -n "Automatic changes below" ${INCFILE} | awk -F: '{print $1}'`
|
|
L2=`grep -s -n "Automatic changes above" ${INCFILE} | awk -F: '{print $1}'`
|
|
head -$L1 ${INCFILE} >${DESTFILE}
|
|
echo "#define __CEGCC_VERSION_MAJOR__ " $CEGCC_VERSION_MAJOR >> ${DESTFILE}
|
|
echo "#define __CEGCC_VERSION_MINOR__ " $CEGCC_VERSION_MINOR >> ${DESTFILE}
|
|
echo "#define __CEGCC_VERSION_PATCHLEVEL__ " $CEGCC_VERSION_PATCHLEVEL >> ${DESTFILE}
|
|
echo "#define __CEGCC_BUILD_DATE__" `date +%Y%m%d` >> ${DESTFILE}
|
|
tail -n +$L2 ${INCFILE} >>${DESTFILE}
|
|
|
|
cd ${BUILD_DIR}
|
|
}
|
|
|
|
build_mingw()
|
|
{
|
|
configure_target_module mingw mingw
|
|
|
|
make ${PARALLELISM}
|
|
make install
|
|
|
|
cd ${BUILD_DIR}
|
|
}
|
|
|
|
build_gcc()
|
|
{
|
|
configure_host_module gcc gcc \
|
|
--with-gcc \
|
|
--with-gnu-ld \
|
|
--with-gnu-as \
|
|
--enable-threads=win32 \
|
|
--disable-nls \
|
|
--enable-languages=c,c++ \
|
|
--disable-win32-registry \
|
|
--disable-multilib \
|
|
--disable-interwork \
|
|
--without-newlib \
|
|
--enable-checking \
|
|
--with-headers \
|
|
--disable-__cxa_atexit
|
|
# we build libstdc++ as dll, so we don't need this.
|
|
# --enable-fully-dynamic-string \
|
|
# --enable-sjlj-exceptions \
|
|
# --disable-clocale \
|
|
|
|
make ${PARALLELISM}
|
|
make install
|
|
|
|
#
|
|
# Clean up one file
|
|
#
|
|
|
|
cd ${BUILD_DIR}
|
|
}
|
|
|
|
build_gdb()
|
|
{
|
|
echo ""
|
|
echo "BUILDING GDB --------------------------"
|
|
echo ""
|
|
echo ""
|
|
|
|
configure_host_module gdb gdb \
|
|
--with-gcc \
|
|
--with-gnu-ld \
|
|
--with-gnu-as \
|
|
--disable-nls \
|
|
--disable-win32-registry \
|
|
--disable-multilib \
|
|
--disable-interwork \
|
|
--enable-checking
|
|
|
|
export CFLAGS=${PREV_CFLAGS}
|
|
|
|
make ${PARALLELISM}
|
|
make install
|
|
|
|
cd ${BUILD_DIR}
|
|
}
|
|
|
|
build_gdbserver()
|
|
{
|
|
echo ""
|
|
echo "BUILDING gdbserver --------------------------"
|
|
echo ""
|
|
echo ""
|
|
|
|
configure_target_module gdb/gdbserver gdbserver
|
|
|
|
make ${PARALLELISM}
|
|
make install
|
|
|
|
cd ${BUILD_DIR}
|
|
}
|
|
|
|
build_docs()
|
|
{
|
|
echo ""
|
|
echo "INSTALLING documentation --------------------------"
|
|
echo ""
|
|
echo ""
|
|
|
|
mkdir -p ${PREFIX}/share/docs
|
|
mkdir -p ${PREFIX}/share/images
|
|
|
|
cd ${BASE_DIRECTORY}/../docs
|
|
tar cf - . | (cd ${PREFIX}/share/docs; tar xf -)
|
|
cd ${BASE_DIRECTORY}/../website
|
|
tar cf - images | (cd ${PREFIX}/share; tar xf -)
|
|
|
|
cd ${BASE_DIRECTORY}/..
|
|
cp NEWS README ${PREFIX}
|
|
cp src/binutils/COPYING ${PREFIX}
|
|
cp src/binutils/COPYING.LIB ${PREFIX}
|
|
cp src/newlib/COPYING.NEWLIB ${PREFIX}
|
|
|
|
cd ${BUILD_DIR}
|
|
}
|
|
|
|
build_profile()
|
|
{
|
|
echo ""
|
|
echo "BUILDING profiling libraries --------------------------"
|
|
echo ""
|
|
echo ""
|
|
|
|
mkdir -p profile
|
|
cd profile
|
|
|
|
configure_target_module profile profile
|
|
|
|
make ${PARALLELISM}
|
|
make install
|
|
|
|
cd ${BUILD_DIR}
|
|
}
|
|
|
|
build_all()
|
|
{
|
|
for ((i=0;i<$COMPONENTS_NUM;i++)); do
|
|
comp=${COMPONENTS[${i}]}
|
|
build_$comp
|
|
done
|
|
}
|
|
|
|
split_components=`echo "${components}" | sed -e 's/,/ /g'`
|
|
|
|
# check for valid options before trying to build them all.
|
|
eval "set -- $split_components"
|
|
while [ -n "$1" ]; do
|
|
if [ "$1" != "all" ]; then
|
|
found=false
|
|
for ((i=0;i<$COMPONENTS_NUM;i++)); do
|
|
if [ "${COMPONENTS[${i}]}" = "$1" ]; then
|
|
found=true
|
|
fi
|
|
done
|
|
if [ $found = false ] ; then
|
|
echo "Please enter a valid build option."
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
shift
|
|
done
|
|
|
|
if [ "x${target}" != "x" ]; then
|
|
export TARGET="${target}"
|
|
else
|
|
export TARGET="arm-mingw32ce"
|
|
fi
|
|
|
|
export BUILD=`sh ${BASE_DIRECTORY}/gcc/config.guess`
|
|
|
|
if [ "x${host}" != "x" ]; then
|
|
export HOST="${host}"
|
|
else
|
|
export HOST=${BUILD}
|
|
fi
|
|
|
|
export PATH=${PREFIX}/bin:${PATH}
|
|
|
|
echo "Building mingw32ce:"
|
|
echo "source: ${BASE_DIRECTORY}"
|
|
echo "building in: ${BUILD_DIR}"
|
|
echo "prefix: ${PREFIX}"
|
|
echo "components: ${components}"
|
|
echo "Build: ${BUILD}"
|
|
echo "Host: ${HOST}"
|
|
echo "Target: ${TARGET}"
|
|
|
|
mkdir -p ${BUILD_DIR}
|
|
mkdir -p ${PREFIX}
|
|
|
|
# Now actually build them.
|
|
eval "set -- $split_components"
|
|
while [ -n "$1" ]; do
|
|
build_${1}
|
|
shift
|
|
done
|
|
|
|
echo ""
|
|
echo "DONE --------------------------"
|
|
echo ""
|
|
echo ""
|