From 9eef527d26394a917224187350765ab1b46e13a8 Mon Sep 17 00:00:00 2001 From: Mark Hatle Date: Tue, 28 Jan 2020 16:08:11 -0800 Subject: Enable multilib baremetal toolchains Distro Changes: When building a multilib, we need to disable configsite cache. Otherwise the system will fail to generate the SDK as there are no configsite entries due to newlib based multilibs. Recipe Changes: gcc - globally disable multilib configuration - Disable Linux specific configurations (EXTRACONFFUNCS) gcc-cross-canadian - enable multilib on a recipe specific basis libgcc - add a noop override to do_multilib_install to avoid Linux specific multilib processing newlib - arm/v6+m/nofp and arm/v8-m.base/nofp do not have newlib trap implementations. libgloss contains these, workaround by disabling builtin trap syscall handler. - misc workarounds for multilib installs libgloss - Allow MLPREFIX for newlib dependencies meta-toolchain - adjust to install only the items we want/need packagegroup-newlib-standalone-sdk-target - new pkggroup for the custom baremetal SDK to select the right set of packages Signed-off-by: Mark Hatle --- .../conf/distro/xilinx-standalone.conf | 5 +++- .../recipes-bsp/newlib/libgloss_3.1.%.bbappend | 2 ++ .../recipes-bsp/newlib/newlib_3.1.%.bbappend | 9 ++++++ .../recipes-core/meta/meta-toolchain.bbappend | 1 + .../packagegroup-newlib-standalone-sdk-target.bb | 11 +++++++ .../gcc/gcc-cross-canadian_%.bbappend | 7 +++++ .../recipes-devtools/gcc/gcc-cross_%.bbappend | 4 +++ .../recipes-devtools/gcc/gcc-runtime_%.bbappend | 34 ++++++++-------------- .../recipes-devtools/gcc/gcc-xilinx-standalone.inc | 2 -- .../recipes-devtools/gcc/libgcc_%.bbappend | 22 ++++++++++++++ 10 files changed, 72 insertions(+), 25 deletions(-) create mode 100644 meta-xilinx-standalone/recipes-core/meta/meta-toolchain.bbappend create mode 100644 meta-xilinx-standalone/recipes-core/packagegroups/packagegroup-newlib-standalone-sdk-target.bb create mode 100644 meta-xilinx-standalone/recipes-devtools/gcc/libgcc_%.bbappend diff --git a/meta-xilinx-standalone/conf/distro/xilinx-standalone.conf b/meta-xilinx-standalone/conf/distro/xilinx-standalone.conf index cece6848..1017202d 100644 --- a/meta-xilinx-standalone/conf/distro/xilinx-standalone.conf +++ b/meta-xilinx-standalone/conf/distro/xilinx-standalone.conf @@ -13,4 +13,7 @@ require conf/distro/include/yocto-uninative.inc INHERIT += "uninative" # Hold this until it gets merged in core, we need libc.a and libgloss.a for cross-canadian -LIBC_DEPENDENCIES_append = " newlib-staticdev libgloss-staticdev" \ No newline at end of file +LIBC_DEPENDENCIES_append = " newlib-staticdev libgloss-staticdev" + +# No cached configsite files +TOOLCHAIN_NEED_CONFIGSITE_CACHE = "" diff --git a/meta-xilinx-standalone/recipes-bsp/newlib/libgloss_3.1.%.bbappend b/meta-xilinx-standalone/recipes-bsp/newlib/libgloss_3.1.%.bbappend index cd6a7d8d..d7f0d068 100644 --- a/meta-xilinx-standalone/recipes-bsp/newlib/libgloss_3.1.%.bbappend +++ b/meta-xilinx-standalone/recipes-bsp/newlib/libgloss_3.1.%.bbappend @@ -1,3 +1,5 @@ +DEPENDS += "${MLPREFIX}newlib" + do_configure_prepend_microblaze() { # hack for microblaze, which needs xilinx.ld to literally do any linking (its hard coded in its LINK_SPEC) export CC="${CC} -L${S}/libgloss/microblaze" diff --git a/meta-xilinx-standalone/recipes-bsp/newlib/newlib_3.1.%.bbappend b/meta-xilinx-standalone/recipes-bsp/newlib/newlib_3.1.%.bbappend index 1b6e00ee..9f5774fb 100644 --- a/meta-xilinx-standalone/recipes-bsp/newlib/newlib_3.1.%.bbappend +++ b/meta-xilinx-standalone/recipes-bsp/newlib/newlib_3.1.%.bbappend @@ -1,3 +1,6 @@ +# Some of the currently required multilibs require specific workarounds. +# The override values below are linked specifically to the baremetal toolchain BSPs + do_configure_prepend_microblaze() { # hack for microblaze, which needs xilinx.ld to literally do any linking (its hard coded in its LINK_SPEC) export CC="${CC} -L${S}/libgloss/microblaze" @@ -7,6 +10,12 @@ do_configure_prepend(){ export CC_FOR_TARGET="${CC}" } +# Fix for multilib newlib installations +do_install_prepend() { + mkdir -p $(dirname ${D}${libdir}) + mkdir -p $(dirname ${D}${includedir}) +} + # Add MicroBlaze Patches FILESEXTRAPATHS_append := "${THISDIR}/files:" SRC_URI_append = " \ diff --git a/meta-xilinx-standalone/recipes-core/meta/meta-toolchain.bbappend b/meta-xilinx-standalone/recipes-core/meta/meta-toolchain.bbappend new file mode 100644 index 00000000..0b4812d0 --- /dev/null +++ b/meta-xilinx-standalone/recipes-core/meta/meta-toolchain.bbappend @@ -0,0 +1 @@ +TOOLCHAIN_TARGET_TASK_xilinx-standalone = "${@multilib_pkg_extend(d, 'packagegroup-newlib-standalone-sdk-target')}" diff --git a/meta-xilinx-standalone/recipes-core/packagegroups/packagegroup-newlib-standalone-sdk-target.bb b/meta-xilinx-standalone/recipes-core/packagegroups/packagegroup-newlib-standalone-sdk-target.bb new file mode 100644 index 00000000..d943938b --- /dev/null +++ b/meta-xilinx-standalone/recipes-core/packagegroups/packagegroup-newlib-standalone-sdk-target.bb @@ -0,0 +1,11 @@ +SUMMARY = "Target packages for the standalone SDK" + +PACKAGE_ARCH = "${TUNE_PKGARCH}" + +inherit packagegroup + +RDEPENDS_${PN} = "\ + libgcc-dev \ + libstdc++-dev \ + ${LIBC_DEPENDENCIES} \ + " diff --git a/meta-xilinx-standalone/recipes-devtools/gcc/gcc-cross-canadian_%.bbappend b/meta-xilinx-standalone/recipes-devtools/gcc/gcc-cross-canadian_%.bbappend index 822891be..90dbae9a 100644 --- a/meta-xilinx-standalone/recipes-devtools/gcc/gcc-cross-canadian_%.bbappend +++ b/meta-xilinx-standalone/recipes-devtools/gcc/gcc-cross-canadian_%.bbappend @@ -1,5 +1,12 @@ require gcc-xilinx-standalone.inc +# We want to use the stock multilib configs, when available +EXTRACONFFUNCS_xilinx-standalone = "" + +EXTRA_OECONF_append_xilinx-standalone = " \ + --enable-multilib \ +" + # Temporary hack to build gcc cross canadian for tclibc-newlib as --with-sysroot=/not/exist # has been removed from TARGET_OS for elf and eabi in gcc-cross-canadian.inc diff --git a/meta-xilinx-standalone/recipes-devtools/gcc/gcc-cross_%.bbappend b/meta-xilinx-standalone/recipes-devtools/gcc/gcc-cross_%.bbappend index 19862cb9..dd810a12 100644 --- a/meta-xilinx-standalone/recipes-devtools/gcc/gcc-cross_%.bbappend +++ b/meta-xilinx-standalone/recipes-devtools/gcc/gcc-cross_%.bbappend @@ -1 +1,5 @@ require gcc-xilinx-standalone.inc + +# We want to use the stock multilib configs, when available +EXTRACONFFUNCS_xilinx-standalone = "" + diff --git a/meta-xilinx-standalone/recipes-devtools/gcc/gcc-runtime_%.bbappend b/meta-xilinx-standalone/recipes-devtools/gcc/gcc-runtime_%.bbappend index cc99009c..873f83ea 100644 --- a/meta-xilinx-standalone/recipes-devtools/gcc/gcc-runtime_%.bbappend +++ b/meta-xilinx-standalone/recipes-devtools/gcc/gcc-runtime_%.bbappend @@ -9,7 +9,6 @@ EXTRA_OECONF_append_xilinx-standalone_class-target = " \ --enable-plugins \ --with-gnu-as \ --disable-libitm \ - --enable-multilib \ " EXTRA_OECONF_append_xilinx-standalone_aarch64_class-target = " \ @@ -45,28 +44,19 @@ EXTRA_OECONF_append_xilinx-standalone_microblaze_class-target = " \ # Changes local to gcc-runtime... -# Due to multilibs, we need to clear the default TUNE_CCARGS on arm -TUNE_CCARGS_xilinx-standalone_arm_class-target = "" - -# Configure fails on multilib when using a cache file, this re-sets it to nothing -EXTRA_OECONF_append_xilinx-standalone_class-target = " --cache-file=" - # Dont build libitm, etc. RUNTIMETARGET_xilinx-standalone_class-target = "libstdc++-v3" -# Recursve 5 levels due to the several combinations of multilibs built -FILES_libstdc++-staticdev_append_xilinx-standalone_class-target = " \ - ${libdir}/libsupc++.a* \ - ${libdir}/libstdc++*.a* \ - ${libdir}/**/libsupc++.a* \ - ${libdir}/**/libstdc++*.a* \ - ${libdir}/**/**/libsupc++.a* \ - ${libdir}/**/**/libstdc++*.a* \ - ${libdir}/**/**/**/libsupc++.a* \ - ${libdir}/**/**/**/libstdc++*.a* \ - ${libdir}/**/**/**/**/libsupc++.a* \ - ${libdir}/**/**/**/**/libstdc++*.a* \ - ${libdir}/**/**/**/**/**/libsupc++.a* \ - ${libdir}/**/**/**/**/**/libstdc++*.a* \ -" +do_install_append_xilinx-standalone_class-target() { + # Fixup what gcc-runtime normally would do, we don't want linux directories! + rm -rf ${D}${includedir}/c++/${BINV}/${TARGET_ARCH}${TARGET_VENDOR}-linux + # The multilibs have different headers, so stop combining them! + if [ "${TARGET_VENDOR_MULTILIB_ORIGINAL}" != "" -a "${TARGET_VENDOR}" != "${TARGET_VENDOR_MULTILIB_ORIGINAL}" ]; then + rm -rf ${D}${includedir}/c++/${BINV}/${TARGET_ARCH}${TARGET_VENDOR_MULTILIB_ORIGINAL}-${TARGET_OS} + fi +} + +FILES_${PN}-dbg_append_xilinx-standalone_class-target = "\ + ${libdir}/libstdc++.a-gdb.py \ +" diff --git a/meta-xilinx-standalone/recipes-devtools/gcc/gcc-xilinx-standalone.inc b/meta-xilinx-standalone/recipes-devtools/gcc/gcc-xilinx-standalone.inc index 6e3fca0c..21d30361 100644 --- a/meta-xilinx-standalone/recipes-devtools/gcc/gcc-xilinx-standalone.inc +++ b/meta-xilinx-standalone/recipes-devtools/gcc/gcc-xilinx-standalone.inc @@ -1,5 +1,4 @@ # Any changes to this file should be synced with gcc-runtime_%.bbappend - LINKER_HASH_STYLE_xilinx-standalone = "" SYMVERS_CONF_xilinx-standalone = "" @@ -10,7 +9,6 @@ EXTRA_OECONF_append_xilinx-standalone = " \ --enable-plugins \ --with-gnu-as \ --disable-libitm \ - --enable-multilib \ " EXTRA_OECONF_append_xilinx-standalone_aarch64 = " \ diff --git a/meta-xilinx-standalone/recipes-devtools/gcc/libgcc_%.bbappend b/meta-xilinx-standalone/recipes-devtools/gcc/libgcc_%.bbappend new file mode 100644 index 00000000..e6801c2f --- /dev/null +++ b/meta-xilinx-standalone/recipes-devtools/gcc/libgcc_%.bbappend @@ -0,0 +1,22 @@ +python do_multilib_install_xilinx-standalone_class-target () { + pass +} + +standalone_fixup () { + ( + cd ${D}${libdir} + for each in ${TARGET_SYS}/*/* ; do + ln -s $each $(basename $each) + done + ) +} + +FIXUP_FUNCTION = "" +FIXUP_FUNCTION_xilinx-standalone_class-target = " standalone_fixup" + +do_install[postfuncs] .= "${FIXUP_FUNCTION}" + +FILES_${PN}-dev_append_xilinx-standalone_class-target = " \ + ${libdir}/*.a \ + ${libdir}/*.o \ +" -- cgit v1.2.3-54-g00ecf