mirror of
https://git.yoctoproject.org/poky
synced 2026-04-27 03:32:12 +02:00
Passing --with-mpfr and --with-mpc when compiling the cross compiler
appears to be at best unnecessary, and at worst can cause build failures.
Firstly, the paths passed in gcc-cross-canadian are using the undefined
${layout_exec_prefix}. This results in configure passing
-I${STAGING_DIR_HOST}/include twice to the compiler when it's doing its
test builds. This is mostly pointless since that directory doesn't exist
with the default oe-core configuration - the correct path would be
-I${STAGING_DIR_HOST}/usr/include.
The path for mpfr passed in gcc-cross is correct, but unnecessary since it
is just the sysroot default.
I've gone back through the history, and it seems that these lines (or
similar ones) were originally added way back in
8800d8be25 for GCC 4.1.1 in 2006! I asked[1]
if anyone knew why this was necessary but received no response, so I can
only assume that no-one knows.
I've successfully built for various targets with this patch applied and
observed no problems.
[1] http://lists.openembedded.org/pipermail/openembedded-core/2018-September/155971.html
(From OE-Core rev: 2f9f02d5fda9884ccf9ae22ceb00d59b99036a49)
Signed-off-by: Mike Crowe <mac@mcrowe.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
219 lines
8.2 KiB
PHP
219 lines
8.2 KiB
PHP
inherit cross
|
|
|
|
INHIBIT_DEFAULT_DEPS = "1"
|
|
EXTRADEPENDS = ""
|
|
DEPENDS = "virtual/${TARGET_PREFIX}binutils virtual/${TARGET_PREFIX}libc-for-gcc ${EXTRADEPENDS} ${NATIVEDEPS}"
|
|
PROVIDES = "virtual/${TARGET_PREFIX}gcc virtual/${TARGET_PREFIX}g++"
|
|
python () {
|
|
if d.getVar("TARGET_OS").startswith("linux"):
|
|
d.setVar("EXTRADEPENDS", "linux-libc-headers")
|
|
}
|
|
|
|
PN = "gcc-cross-${TARGET_ARCH}"
|
|
|
|
# Ignore how TARGET_ARCH is computed.
|
|
TARGET_ARCH[vardepvalue] = "${TARGET_ARCH}"
|
|
|
|
require gcc-configure-common.inc
|
|
|
|
# While we want the 'gnu' hash style, we explicitly set it to sysv here to
|
|
# ensure that any recipe which doesn't obey our LDFLAGS (which also set it to
|
|
# gnu) will hit a QA failure.
|
|
LINKER_HASH_STYLE ?= "sysv"
|
|
|
|
EXTRA_OECONF += "--enable-poison-system-directories"
|
|
EXTRA_OECONF_append_sh4 = " \
|
|
--with-multilib-list= \
|
|
--enable-incomplete-targets \
|
|
"
|
|
|
|
EXTRA_OECONF += "\
|
|
--with-system-zlib \
|
|
"
|
|
|
|
DEPENDS_remove_libc-baremetal := "virtual/${TARGET_PREFIX}libc-for-gcc"
|
|
EXTRA_OECONF_append_libc-baremetal = " --without-headers"
|
|
EXTRA_OECONF_remove_libc-baremetal = "--enable-threads=posix"
|
|
EXTRA_OECONF_remove_libc-newlib = "--enable-threads=posix"
|
|
|
|
EXTRA_OECONF_PATHS = "\
|
|
--with-gxx-include-dir=/not/exist${target_includedir}/c++/${BINV} \
|
|
--with-sysroot=/not/exist \
|
|
--with-build-sysroot=${STAGING_DIR_TARGET} \
|
|
"
|
|
|
|
ARCH_FLAGS_FOR_TARGET += "-isystem${STAGING_DIR_TARGET}${target_includedir}"
|
|
|
|
do_compile () {
|
|
export CC="${BUILD_CC}"
|
|
export AR_FOR_TARGET="${TARGET_SYS}-ar"
|
|
export RANLIB_FOR_TARGET="${TARGET_SYS}-ranlib"
|
|
export LD_FOR_TARGET="${TARGET_SYS}-ld"
|
|
export NM_FOR_TARGET="${TARGET_SYS}-nm"
|
|
export CC_FOR_TARGET="${CCACHE} ${TARGET_SYS}-gcc"
|
|
export CFLAGS_FOR_TARGET="${TARGET_CFLAGS}"
|
|
export CPPFLAGS_FOR_TARGET="${TARGET_CPPFLAGS}"
|
|
export CXXFLAGS_FOR_TARGET="${TARGET_CXXFLAGS}"
|
|
export LDFLAGS_FOR_TARGET="${TARGET_LDFLAGS}"
|
|
|
|
oe_runmake all-host configure-target-libgcc
|
|
(cd ${B}/${TARGET_SYS}/libgcc; oe_runmake enable-execute-stack.c unwind.h md-unwind-support.h sfp-machine.h gthr-default.h)
|
|
# now generate script to drive testing
|
|
echo "#!/usr/bin/env sh" >${B}/${TARGET_PREFIX}testgcc
|
|
set >> ${B}/${TARGET_PREFIX}testgcc
|
|
# prune out the unneeded vars
|
|
sed -i -e "/^BASH/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^USER/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^OPT/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^DIRSTACK/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^EUID/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^FUNCNAME/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^GROUPS/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^HOST/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^HOME/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^IFS/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^LC_ALL/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^LOGNAME/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^MACHTYPE/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^OSTYPE/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^PIPE/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^SHELL/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^'/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^UID/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^TERM/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^PKG_/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^POSIXLY_/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^PPID/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^PS4/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^Q/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^SHLVL/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^STAGING/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^LD_LIBRARY_PATH/d" ${B}/${TARGET_PREFIX}testgcc
|
|
sed -i -e "/^PSEUDO/d" ${B}/${TARGET_PREFIX}testgcc
|
|
|
|
# append execution part of the script
|
|
cat >> ${B}/${TARGET_PREFIX}testgcc << STOP
|
|
target="\$1"
|
|
usage () {
|
|
echo "Usage:"
|
|
echo "\$0 user@target 'extra options to dejagnu'"
|
|
echo "\$0 target 'extra options to dejagnu'"
|
|
echo "\$0 target"
|
|
echo "e.g. \$0 192.168.7.2 ' dg.exp=visibility-d.c'"
|
|
echo "will only run visibility-d.c test case"
|
|
echo "e.g. \$0 192.168.7.2 '/-mthumb dg.exp=visibility-d.c'"
|
|
echo "will only run visibility-d.c test case in thumb mode"
|
|
echo "You need to have dejagnu autogen expect installed"
|
|
echo "on the build host"
|
|
}
|
|
if [ "x\$target" = "x" ]
|
|
then
|
|
echo "Please specify the target machine and remote user in form of user@target\n"
|
|
usage
|
|
exit 1;
|
|
fi
|
|
|
|
shift
|
|
|
|
echo "\$target" | grep "@" 2>&1 > /dev/null
|
|
if [ "x\$?" = "x0" ]
|
|
then
|
|
user=\$(echo \$target | cut -d '@' -f 1)
|
|
target=\$(echo \$target | cut -d '@' -f 2)
|
|
else
|
|
user=\$USER
|
|
fi
|
|
ssh \$user@\$target date 2>&1 > /dev/null
|
|
if [ "x\$?" != "x0" ]
|
|
then
|
|
echo "Failed connecting to \$user@\$target it could be because"
|
|
echo "you don't have passwordless ssh setup to access \$target"
|
|
echo "or sometimes host key has been changed"
|
|
echo "in such case do something like below on build host"
|
|
echo "ssh-keygen -f "~/.ssh/known_hosts" -R \$target"
|
|
echo "and then try ssh \$user@\$target"
|
|
|
|
usage
|
|
exit 1
|
|
fi
|
|
echo "lappend boards_dir [pwd]/../../.." > ${B}/site.exp
|
|
echo "load_generic_config \"unix\"" > ${B}/${PACKAGE_ARCH}.exp
|
|
echo "set_board_info username \$user" >> ${B}/${PACKAGE_ARCH}.exp
|
|
echo "set_board_info rsh_prog ssh" >> ${B}/${PACKAGE_ARCH}.exp
|
|
echo "set_board_info rcp_prog scp" >> ${B}/${PACKAGE_ARCH}.exp
|
|
echo "set_board_info hostname \$target" >> ${B}/${PACKAGE_ARCH}.exp
|
|
DEJAGNU=${B}/site.exp make -k check RUNTESTFLAGS="--target_board=${PACKAGE_ARCH}\$@"
|
|
|
|
STOP
|
|
|
|
chmod +x ${B}/${TARGET_PREFIX}testgcc
|
|
|
|
}
|
|
|
|
INHIBIT_PACKAGE_STRIP = "1"
|
|
|
|
# Compute how to get from libexecdir to bindir in python (easier than shell)
|
|
BINRELPATH = "${@os.path.relpath(d.expand("${STAGING_DIR_NATIVE}${prefix_native}/bin/${TARGET_SYS}"), d.expand("${libexecdir}/gcc/${TARGET_SYS}/${BINV}"))}"
|
|
|
|
do_install () {
|
|
( cd ${B}/${TARGET_SYS}/libgcc; oe_runmake 'DESTDIR=${D}' install-unwind_h-forbuild install-unwind_h )
|
|
oe_runmake 'DESTDIR=${D}' install-host
|
|
|
|
install -d ${D}${target_base_libdir}
|
|
install -d ${D}${target_libdir}
|
|
|
|
# Link gfortran to g77 to satisfy not-so-smart configure or hard coded g77
|
|
# gfortran is fully backwards compatible. This is a safe and practical solution.
|
|
if [ -n "${@d.getVar('FORTRAN')}" ]; then
|
|
ln -sf ${STAGING_DIR_NATIVE}${prefix_native}/bin/${TARGET_PREFIX}gfortran ${STAGING_DIR_NATIVE}${prefix_native}/bin/${TARGET_PREFIX}g77 || true
|
|
fortsymlinks="g77 gfortran"
|
|
fi
|
|
|
|
# Insert symlinks into libexec so when tools without a prefix are searched for, the correct ones are
|
|
# found. These need to be relative paths so they work in different locations.
|
|
dest=${D}${libexecdir}/gcc/${TARGET_SYS}/${BINV}/
|
|
install -d $dest
|
|
for t in ar as ld ld.bfd ld.gold nm objcopy objdump ranlib strip gcc cpp $fortsymlinks; do
|
|
ln -sf ${BINRELPATH}/${TARGET_PREFIX}$t $dest$t
|
|
ln -sf ${BINRELPATH}/${TARGET_PREFIX}$t ${dest}${TARGET_PREFIX}$t
|
|
done
|
|
|
|
# Remove things we don't need but keep share/java
|
|
for d in info man share/doc share/locale share/man share/info; do
|
|
rm -rf ${D}${STAGING_DIR_NATIVE}${prefix_native}/$d
|
|
done
|
|
|
|
# libquadmath headers need to be available in the gcc libexec dir
|
|
install -d ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/include/
|
|
cp ${S}/libquadmath/quadmath.h ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/include/
|
|
cp ${S}/libquadmath/quadmath_weak.h ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/include/
|
|
|
|
# We use libiberty from binutils
|
|
find ${D}${exec_prefix}/lib -name libiberty.a | xargs rm -f
|
|
find ${D}${exec_prefix}/lib -name libiberty.h | xargs rm -f
|
|
}
|
|
|
|
do_package[noexec] = "1"
|
|
do_packagedata[noexec] = "1"
|
|
do_package_write_ipk[noexec] = "1"
|
|
do_package_write_rpm[noexec] = "1"
|
|
do_package_write_deb[noexec] = "1"
|
|
|
|
BUILDDIRSTASH = "${WORKDIR}/stashed-builddir"
|
|
do_gcc_stash_builddir[dirs] = "${B}"
|
|
do_gcc_stash_builddir[cleandirs] = "${BUILDDIRSTASH}"
|
|
do_gcc_stash_builddir () {
|
|
dest=${BUILDDIRSTASH}
|
|
hardlinkdir . $dest
|
|
}
|
|
addtask do_gcc_stash_builddir after do_compile before do_install
|
|
SSTATETASKS += "do_gcc_stash_builddir"
|
|
do_gcc_stash_builddir[sstate-inputdirs] = "${BUILDDIRSTASH}"
|
|
do_gcc_stash_builddir[sstate-outputdirs] = "${COMPONENTS_DIR}/${BUILD_ARCH}/gcc-stashed-builddir${COMPILERINITIAL}-${TARGET_SYS}"
|
|
do_gcc_stash_builddir[sstate-fixmedir] = "${COMPONENTS_DIR}/${BUILD_ARCH}/gcc-stashed-builddir${COMPILERINITIAL}-${TARGET_SYS}"
|
|
|
|
python do_gcc_stash_builddir_setscene () {
|
|
sstate_setscene(d)
|
|
}
|
|
addtask do_gcc_stash_builddir_setscene
|