1*4882a593Smuzhiyuninherit cross-canadian 2*4882a593Smuzhiyun 3*4882a593SmuzhiyunSUMMARY = "GNU cc and gcc C compilers (cross-canadian for ${TARGET_ARCH} target)" 4*4882a593SmuzhiyunPN = "gcc-cross-canadian-${TRANSLATED_TARGET_ARCH}" 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunDEPENDS = "virtual/${TARGET_PREFIX}gcc virtual/${HOST_PREFIX}gcc-crosssdk virtual/${HOST_PREFIX}binutils-crosssdk virtual/nativesdk-libc nativesdk-gettext flex-native virtual/libc" 7*4882a593Smuzhiyun 8*4882a593SmuzhiyunGCCMULTILIB = "--enable-multilib" 9*4882a593Smuzhiyun 10*4882a593Smuzhiyunrequire gcc-configure-common.inc 11*4882a593Smuzhiyun 12*4882a593SmuzhiyunEXTRA_OECONF += "--with-plugin-ld=ld" 13*4882a593SmuzhiyunEXTRA_OECONF_PATHS = "\ 14*4882a593Smuzhiyun --with-gxx-include-dir=/not/exist${target_includedir}/c++/${BINV} \ 15*4882a593Smuzhiyun --with-build-time-tools=${STAGING_DIR_NATIVE}${prefix_native}/${TARGET_SYS}/bin \ 16*4882a593Smuzhiyun --with-sysroot=/not/exist \ 17*4882a593Smuzhiyun --with-build-sysroot=${STAGING_DIR_TARGET} \ 18*4882a593Smuzhiyun" 19*4882a593Smuzhiyun# We have to point gcc at a sysroot but we don't need to rebuild if this changes 20*4882a593Smuzhiyun# e.g. we switch between different machines with different tunes. 21*4882a593SmuzhiyunEXTRA_OECONF_PATHS[vardepsexclude] = "TUNE_PKGARCH" 22*4882a593SmuzhiyunTARGET_ARCH[vardepsexclude] = "TUNE_ARCH" 23*4882a593Smuzhiyunget_gcc_float_setting[vardepvalue] = "" 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun# 26*4882a593Smuzhiyun# gcc-cross looks and finds these in ${exec_prefix} but we're not so lucky 27*4882a593Smuzhiyun# for the sdk. Hardcoding the paths ensures the build doesn't go canadian or worse. 28*4882a593Smuzhiyun# 29*4882a593Smuzhiyunexport AR_FOR_TARGET = "${TARGET_PREFIX}ar" 30*4882a593Smuzhiyunexport AS_FOR_TARGET = "${TARGET_PREFIX}as" 31*4882a593Smuzhiyunexport DLLTOOL_FOR_TARGET = "${TARGET_PREFIX}dlltool" 32*4882a593Smuzhiyunexport CC_FOR_TARGET = "${TARGET_PREFIX}gcc" 33*4882a593Smuzhiyunexport CXX_FOR_TARGET = "${TARGET_PREFIX}g++" 34*4882a593Smuzhiyunexport GCC_FOR_TARGET = "${TARGET_PREFIX}gcc" 35*4882a593Smuzhiyunexport LD_FOR_TARGET = "${TARGET_PREFIX}ld" 36*4882a593Smuzhiyunexport LIPO_FOR_TARGET = "${TARGET_PREFIX}lipo" 37*4882a593Smuzhiyunexport NM_FOR_TARGET = "${TARGET_PREFIX}nm" 38*4882a593Smuzhiyunexport OBJDUMP_FOR_TARGET = "${TARGET_PREFIX}objdump" 39*4882a593Smuzhiyunexport RANLIB_FOR_TARGET = "${TARGET_PREFIX}ranlib" 40*4882a593Smuzhiyunexport STRIP_FOR_TARGET = "${TARGET_PREFIX}strip" 41*4882a593Smuzhiyunexport WINDRES_FOR_TARGET = "${TARGET_PREFIX}windres" 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun# 44*4882a593Smuzhiyun# We need to override this and make sure the compiler can find staging 45*4882a593Smuzhiyun# 46*4882a593Smuzhiyunexport ARCH_FLAGS_FOR_TARGET = "--sysroot=${STAGING_DIR_TARGET}" 47*4882a593Smuzhiyun 48*4882a593Smuzhiyundo_configure () { 49*4882a593Smuzhiyun if [ ! -d ${RECIPE_SYSROOT}/${target_includedir} ]; then 50*4882a593Smuzhiyun mkdir -p ${RECIPE_SYSROOT}/${target_includedir} 51*4882a593Smuzhiyun fi 52*4882a593Smuzhiyun export CC_FOR_BUILD="${BUILD_CC}" 53*4882a593Smuzhiyun export CXX_FOR_BUILD="${BUILD_CXX}" 54*4882a593Smuzhiyun export CFLAGS_FOR_BUILD="${BUILD_CFLAGS}" 55*4882a593Smuzhiyun export CPPFLAGS_FOR_BUILD="${BUILD_CPPFLAGS}" 56*4882a593Smuzhiyun export CXXFLAGS_FOR_BUILD="${BUILD_CXXFLAGS}" 57*4882a593Smuzhiyun export LDFLAGS_FOR_BUILD="${BUILD_LDFLAGS}" 58*4882a593Smuzhiyun export CFLAGS_FOR_TARGET="${TARGET_CFLAGS}" 59*4882a593Smuzhiyun export CPPFLAGS_FOR_TARGET="${TARGET_CPPFLAGS}" 60*4882a593Smuzhiyun export CXXFLAGS_FOR_TARGET="${TARGET_CXXFLAGS}" 61*4882a593Smuzhiyun export LDFLAGS_FOR_TARGET="${TARGET_LDFLAGS}" 62*4882a593Smuzhiyun oe_runconf 63*4882a593Smuzhiyun} 64*4882a593Smuzhiyun 65*4882a593Smuzhiyundo_compile () { 66*4882a593Smuzhiyun oe_runmake all-host configure-target-libgcc 67*4882a593Smuzhiyun (cd ${B}/${TARGET_SYS}/libgcc; oe_runmake enable-execute-stack.c unwind.h md-unwind-support.h sfp-machine.h gthr-default.h) 68*4882a593Smuzhiyun} 69*4882a593Smuzhiyun 70*4882a593SmuzhiyunPACKAGES = "${PN}-dbg ${PN} ${PN}-doc" 71*4882a593Smuzhiyun 72*4882a593SmuzhiyunFILES:${PN} = "\ 73*4882a593Smuzhiyun ${exec_prefix}/bin/* \ 74*4882a593Smuzhiyun ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/* \ 75*4882a593Smuzhiyun ${gcclibdir}/${TARGET_SYS}/${BINV}/*.o \ 76*4882a593Smuzhiyun ${gcclibdir}/${TARGET_SYS}/${BINV}/specs \ 77*4882a593Smuzhiyun ${gcclibdir}/${TARGET_SYS}/${BINV}/lib* \ 78*4882a593Smuzhiyun ${gcclibdir}/${TARGET_SYS}/${BINV}/include \ 79*4882a593Smuzhiyun ${gcclibdir}/${TARGET_SYS}/${BINV}/include-fixed \ 80*4882a593Smuzhiyun ${gcclibdir}/${TARGET_SYS}/${BINV}/plugin/include/ \ 81*4882a593Smuzhiyun ${gcclibdir}/${TARGET_SYS}/${BINV}/plugin/gtype.* \ 82*4882a593Smuzhiyun ${libdir}/bfd-plugins/*.so \ 83*4882a593Smuzhiyun ${includedir}/c++/${BINV} \ 84*4882a593Smuzhiyun ${prefix}/${TARGET_SYS}/bin/* \ 85*4882a593Smuzhiyun ${prefix}/${TARGET_SYS}/lib/* \ 86*4882a593Smuzhiyun ${prefix}/${TARGET_SYS}${target_includedir}/* \ 87*4882a593Smuzhiyun" 88*4882a593SmuzhiyunINSANE_SKIP:${PN} += "dev-so" 89*4882a593Smuzhiyun 90*4882a593SmuzhiyunFILES:${PN}-doc = "\ 91*4882a593Smuzhiyun ${infodir} \ 92*4882a593Smuzhiyun ${mandir} \ 93*4882a593Smuzhiyun ${gcclibdir}/${TARGET_SYS}/${BINV}/include/README \ 94*4882a593Smuzhiyun" 95*4882a593Smuzhiyun 96*4882a593SmuzhiyunEXEEXT = "" 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun# Compute how to get from libexecdir to bindir in python (easier than shell) 99*4882a593SmuzhiyunBINRELPATH = "${@os.path.relpath(d.expand("${bindir}"), d.expand("${libexecdir}/gcc/${TARGET_SYS}/${BINV}"))}" 100*4882a593Smuzhiyun# linker plugin path 101*4882a593SmuzhiyunLIBRELPATH = "${@os.path.relpath(d.expand("${libexecdir}/gcc/${TARGET_SYS}/${BINV}"), d.expand("${libdir}/bfd-plugins"))}" 102*4882a593Smuzhiyun 103*4882a593Smuzhiyundo_install () { 104*4882a593Smuzhiyun ( cd ${B}/${TARGET_SYS}/libgcc; oe_runmake 'DESTDIR=${D}' install-unwind_h-forbuild install-unwind_h ) 105*4882a593Smuzhiyun oe_runmake 'DESTDIR=${D}' install-host 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun # Cleanup some of the ${libdir}{,exec}/gcc stuff ... 108*4882a593Smuzhiyun rm -r ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/install-tools 109*4882a593Smuzhiyun rm -r ${D}${libexecdir}/gcc/${TARGET_SYS}/${BINV}/install-tools 110*4882a593Smuzhiyun rm -rf ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/finclude 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun # We care about g++ not c++ 113*4882a593Smuzhiyun rm -f ${D}${bindir}/*c++ 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun # We don't care about the gcc-<version> copies 116*4882a593Smuzhiyun rm -f ${D}${bindir}/*gcc-${BINV}* 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun # Cleanup empty directories which are not shipped 119*4882a593Smuzhiyun # we use rmdir instead of 'rm -f' to ensure the non empty directories are not deleted 120*4882a593Smuzhiyun # ${D}${libdir}/../lib only seems to appear with SDKMACHINE=i686 121*4882a593Smuzhiyun local empty_dirs="${D}${libdir}/../lib ${D}${prefix}/${TARGET_SYS}/lib ${D}${prefix}/${TARGET_SYS} ${D}${includedir}" 122*4882a593Smuzhiyun for i in $empty_dirs; do 123*4882a593Smuzhiyun [ -d $i ] && rmdir --ignore-fail-on-non-empty $i 124*4882a593Smuzhiyun done 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun # Insert symlinks into libexec so when tools without a prefix are searched for, the correct ones are 127*4882a593Smuzhiyun # found. 128*4882a593Smuzhiyun dest=${D}${libexecdir}/gcc/${TARGET_SYS}/${BINV}/ 129*4882a593Smuzhiyun install -d $dest 130*4882a593Smuzhiyun suffix=${EXEEXT} 131*4882a593Smuzhiyun for t in ar as ld ld.bfd ld.gold nm objcopy objdump ranlib strip g77 gcc cpp gfortran; do 132*4882a593Smuzhiyun if [ "$t" = "g77" -o "$t" = "gfortran" ] && [ ! -e ${D}${bindir}/${TARGET_PREFIX}$t$suffix ]; then 133*4882a593Smuzhiyun continue 134*4882a593Smuzhiyun fi 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun ln -sf ${BINRELPATH}/${TARGET_PREFIX}$t$suffix $dest$t$suffix 137*4882a593Smuzhiyun done 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun # libquadmath headers need to be available in the gcc libexec dir 140*4882a593Smuzhiyun install -d ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/include/ 141*4882a593Smuzhiyun cp ${S}/libquadmath/quadmath.h ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/include/ 142*4882a593Smuzhiyun cp ${S}/libquadmath/quadmath_weak.h ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/include/ 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun # install LTO linker plugins where binutils tools can find it 145*4882a593Smuzhiyun install -d ${D}${libdir}/bfd-plugins 146*4882a593Smuzhiyun ln -sf ${LIBRELPATH}/liblto_plugin.so ${D}${libdir}/bfd-plugins/liblto_plugin.so 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun chown -R root:root ${D} 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun cross_canadian_bindirlinks 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun for i in linux ${CANADIANEXTRAOS} 153*4882a593Smuzhiyun do 154*4882a593Smuzhiyun for v in ${CANADIANEXTRAVENDOR} 155*4882a593Smuzhiyun do 156*4882a593Smuzhiyun d=${D}${bindir}/../${TARGET_ARCH}$v-$i 157*4882a593Smuzhiyun install -d $d 158*4882a593Smuzhiyun for j in ${TARGET_PREFIX}gcc${EXEEXT} ${TARGET_PREFIX}g++${EXEEXT} 159*4882a593Smuzhiyun do 160*4882a593Smuzhiyun p=${TARGET_ARCH}$v-$i-`echo $j | sed -e s,${TARGET_PREFIX},,` 161*4882a593Smuzhiyun case $i in 162*4882a593Smuzhiyun *musl*) 163*4882a593Smuzhiyun rm -rf $d/$p 164*4882a593Smuzhiyun echo "#!/usr/bin/env sh" > $d/$p 165*4882a593Smuzhiyun echo "exec \`dirname \$0\`/../${TARGET_SYS}/$j -mmusl \$@" >> $d/$p 166*4882a593Smuzhiyun chmod 0755 $d/$p 167*4882a593Smuzhiyun ;; 168*4882a593Smuzhiyun *) 169*4882a593Smuzhiyun ;; 170*4882a593Smuzhiyun esac 171*4882a593Smuzhiyun done 172*4882a593Smuzhiyun done 173*4882a593Smuzhiyun done 174*4882a593Smuzhiyun} 175*4882a593Smuzhiyun 176*4882a593SmuzhiyunELFUTILS = "nativesdk-elfutils" 177*4882a593SmuzhiyunDEPENDS += "nativesdk-gmp nativesdk-mpfr nativesdk-libmpc ${ELFUTILS} nativesdk-zlib nativesdk-zstd" 178*4882a593SmuzhiyunRDEPENDS:${PN} += "nativesdk-mpfr nativesdk-libmpc ${ELFUTILS}" 179*4882a593Smuzhiyun 180*4882a593SmuzhiyunSYSTEMHEADERS = "${target_includedir}/" 181*4882a593SmuzhiyunSYSTEMLIBS = "${target_base_libdir}/" 182*4882a593SmuzhiyunSYSTEMLIBS1 = "${target_libdir}/" 183*4882a593Smuzhiyun 184*4882a593SmuzhiyunEXTRA_OECONF += "--enable-poison-system-directories" 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun# gcc 4.7 needs -isystem 187*4882a593Smuzhiyunexport ARCH_FLAGS_FOR_TARGET = "--sysroot=${STAGING_DIR_TARGET} -isystem=${target_includedir}" 188