inherit cross INHIBIT_DEFAULT_DEPS = "1" EXTRADEPENDS = "" DEPENDS = "virtual/${TARGET_PREFIX}binutils ${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 \ " 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_configure_prepend () { install -d ${RECIPE_SYSROOT}${target_includedir} touch ${RECIPE_SYSROOT}${target_includedir}/limits.h } 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-${TARGET_SYS}" do_gcc_stash_builddir[sstate-fixmedir] = "${COMPONENTS_DIR}/${BUILD_ARCH}/gcc-stashed-builddir-${TARGET_SYS}" python do_gcc_stash_builddir_setscene () { sstate_setscene(d) } addtask do_gcc_stash_builddir_setscene require gcc-testsuite.inc check_prepare_sysroot () { if [ ! -s ${RECIPE_SYSROOT}${target_includedir}/limits.h ]; then # this file was created by the configure task, but is replaced by the # libc version when populating the sysroot for the do_check task rm ${RECIPE_SYSROOT}${target_includedir}/limits.h fi } EXTRA_OEMAKE_prepend_task-check = "${PARALLEL_MAKE} " MAKE_CHECK_TARGETS ??= "check-gcc check-g++ check-lto" python () { # crosssdk deps have different virtual targets if bb.data.inherits_class('crosssdk', d): d.appendVarFlag("do_check", "depends", " virtual/nativesdk-${TARGET_PREFIX}compilerlibs:do_populate_sysroot") else: d.appendVarFlag("do_check", "depends", " virtual/${TARGET_PREFIX}compilerlibs:do_populate_sysroot") } # specific host and target dependencies required for test suite running do_check[depends] += "dejagnu-native:do_populate_sysroot expect-native:do_populate_sysroot" do_check[depends] += "virtual/libc:do_populate_sysroot" # only depend on qemu if targeting linux user execution do_check[depends] += "${@'qemu-native:do_populate_sysroot' if "user" in d.getVar('BUILD_TEST_TARGET') else ''}" # check_prepare_sysroot is before extend in order to perform the limits.h removal do_check[prefuncs] += "check_prepare_sysroot" do_check[prefuncs] += "extend_recipe_sysroot" do_check[prefuncs] += "check_prepare" do_check[dirs] = "${WORKDIR}/dejagnu ${B}" do_check[nostamp] = "1" do_check() { export DEJAGNU="${WORKDIR}/dejagnu/site.exp" oe_runmake -i -C ${B}/gcc ${MAKE_CHECK_TARGETS} RUNTESTFLAGS="${MAKE_CHECK_BOARDARGS}" } addtask check after do_compile do_populate_sysroot