1*4882a593SmuzhiyunGCCMULTILIB = "--enable-multilib" 2*4882a593Smuzhiyunrequire gcc-configure-common.inc 3*4882a593Smuzhiyun 4*4882a593SmuzhiyunEXTRA_OECONF_PATHS = "\ 5*4882a593Smuzhiyun --with-build-sysroot=${STAGING_DIR_TARGET} \ 6*4882a593Smuzhiyun" 7*4882a593Smuzhiyun 8*4882a593SmuzhiyunEXTRA_OECONF:append:linuxstdbase = " --enable-clocale=gnu" 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun# Configure gcc running on the target to default to an architecture which will 11*4882a593Smuzhiyun# be compatible with that of gcc-runtime (which is cross compiled to be target 12*4882a593Smuzhiyun# specific). For example, for ARM, ARMv6+ adds atomic instructions that may 13*4882a593Smuzhiyun# affect the ABI in the gcc-runtime libs. Since we can't rely on gcc on the 14*4882a593Smuzhiyun# target to always be passed -march etc, its built-in default needs to be safe. 15*4882a593Smuzhiyun 16*4882a593SmuzhiyunARMFPARCHEXT ?= "" 17*4882a593Smuzhiyun 18*4882a593SmuzhiyunEXTRA_OECONF:append:armv6:class-target = " --with-arch=armv6${ARMFPARCHEXT}" 19*4882a593SmuzhiyunEXTRA_OECONF:append:armv7a:class-target = " --with-arch=armv7-a${ARMFPARCHEXT}" 20*4882a593SmuzhiyunEXTRA_OECONF:append:armv7ve:class-target = " --with-arch=armv7ve${ARMFPARCHEXT}" 21*4882a593SmuzhiyunEXTRA_OECONF:append:arc:class-target = " --with-cpu=${TUNE_PKGARCH}" 22*4882a593SmuzhiyunEXTRA_OECONF:append:x86-64:class-target = " --with-arch=native" 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun# libcc1 requres gcc_cv_objdump when cross build, but gcc_cv_objdump is 25*4882a593Smuzhiyun# set in subdir gcc, so subdir libcc1 can't use it, export it here to 26*4882a593Smuzhiyun# fix the problem. 27*4882a593Smuzhiyunexport gcc_cv_objdump = "${TARGET_PREFIX}objdump" 28*4882a593Smuzhiyun 29*4882a593SmuzhiyunEXTRA_OECONF_GCC_FLOAT = "${@get_gcc_float_setting(bb, d)}" 30*4882a593Smuzhiyun 31*4882a593SmuzhiyunPACKAGES = "\ 32*4882a593Smuzhiyun ${PN} ${PN}-plugins ${PN}-symlinks \ 33*4882a593Smuzhiyun g++ g++-symlinks \ 34*4882a593Smuzhiyun cpp cpp-symlinks \ 35*4882a593Smuzhiyun g77 g77-symlinks \ 36*4882a593Smuzhiyun gfortran gfortran-symlinks \ 37*4882a593Smuzhiyun gcov gcov-symlinks \ 38*4882a593Smuzhiyun ${PN}-doc \ 39*4882a593Smuzhiyun ${PN}-dev \ 40*4882a593Smuzhiyun ${PN}-dbg \ 41*4882a593Smuzhiyun" 42*4882a593Smuzhiyun 43*4882a593SmuzhiyunFILES:${PN} = "\ 44*4882a593Smuzhiyun ${bindir}/${TARGET_PREFIX}gcc* \ 45*4882a593Smuzhiyun ${bindir}/${TARGET_PREFIX}lto* \ 46*4882a593Smuzhiyun ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/collect2* \ 47*4882a593Smuzhiyun ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/g++-mapper-server \ 48*4882a593Smuzhiyun ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/lto* \ 49*4882a593Smuzhiyun ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/lib*${SOLIBS} \ 50*4882a593Smuzhiyun ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/liblto*${SOLIBSDEV} \ 51*4882a593Smuzhiyun ${gcclibdir}/${TARGET_SYS}/${BINV}/*.o \ 52*4882a593Smuzhiyun ${gcclibdir}/${TARGET_SYS}/${BINV}/specs \ 53*4882a593Smuzhiyun ${gcclibdir}/${TARGET_SYS}/${BINV}/lib*${SOLIBS} \ 54*4882a593Smuzhiyun ${gcclibdir}/${TARGET_SYS}/${BINV}/include \ 55*4882a593Smuzhiyun ${gcclibdir}/${TARGET_SYS}/${BINV}/include-fixed \ 56*4882a593Smuzhiyun ${libdir}/bfd-plugins/*.so \ 57*4882a593Smuzhiyun" 58*4882a593SmuzhiyunINSANE_SKIP:${PN} += "dev-so" 59*4882a593SmuzhiyunRRECOMMENDS:${PN} += "\ 60*4882a593Smuzhiyun libssp \ 61*4882a593Smuzhiyun libssp-dev \ 62*4882a593Smuzhiyun" 63*4882a593SmuzhiyunRDEPENDS:${PN} += "cpp" 64*4882a593Smuzhiyun 65*4882a593SmuzhiyunFILES:${PN}-dev = "\ 66*4882a593Smuzhiyun ${gcclibdir}/${TARGET_SYS}/${BINV}/lib*${SOLIBSDEV} \ 67*4882a593Smuzhiyun ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/lib*${SOLIBSDEV} \ 68*4882a593Smuzhiyun ${gcclibdir}/${TARGET_SYS}/${BINV}/plugin/include/ \ 69*4882a593Smuzhiyun ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/plugin/gengtype \ 70*4882a593Smuzhiyun ${gcclibdir}/${TARGET_SYS}/${BINV}/plugin/gtype.state \ 71*4882a593Smuzhiyun" 72*4882a593SmuzhiyunFILES:${PN}-symlinks = "\ 73*4882a593Smuzhiyun ${bindir}/cc \ 74*4882a593Smuzhiyun ${bindir}/gcc \ 75*4882a593Smuzhiyun ${bindir}/gccbug \ 76*4882a593Smuzhiyun" 77*4882a593Smuzhiyun 78*4882a593SmuzhiyunFILES:${PN}-plugins = "\ 79*4882a593Smuzhiyun ${gcclibdir}/${TARGET_SYS}/${BINV}/plugin \ 80*4882a593Smuzhiyun" 81*4882a593SmuzhiyunALLOW_EMPTY:${PN}-plugins = "1" 82*4882a593Smuzhiyun 83*4882a593SmuzhiyunFILES:g77 = "\ 84*4882a593Smuzhiyun ${bindir}/${TARGET_PREFIX}g77 \ 85*4882a593Smuzhiyun ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/f771 \ 86*4882a593Smuzhiyun" 87*4882a593SmuzhiyunFILES:g77-symlinks = "\ 88*4882a593Smuzhiyun ${bindir}/g77 \ 89*4882a593Smuzhiyun ${bindir}/f77 \ 90*4882a593Smuzhiyun" 91*4882a593SmuzhiyunRRECOMMENDS:g77 = "\ 92*4882a593Smuzhiyun libg2c \ 93*4882a593Smuzhiyun libg2c-dev \ 94*4882a593Smuzhiyun" 95*4882a593Smuzhiyun 96*4882a593SmuzhiyunFILES:gfortran = "\ 97*4882a593Smuzhiyun ${bindir}/${TARGET_PREFIX}gfortran \ 98*4882a593Smuzhiyun ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/f951 \ 99*4882a593Smuzhiyun" 100*4882a593SmuzhiyunRRECOMMENDS:gfortran = "\ 101*4882a593Smuzhiyun libquadmath \ 102*4882a593Smuzhiyun libquadmath-dev \ 103*4882a593Smuzhiyun" 104*4882a593SmuzhiyunFILES:gfortran-symlinks = "\ 105*4882a593Smuzhiyun ${bindir}/gfortran \ 106*4882a593Smuzhiyun ${bindir}/f95" 107*4882a593Smuzhiyun 108*4882a593SmuzhiyunFILES:cpp = "\ 109*4882a593Smuzhiyun ${bindir}/${TARGET_PREFIX}cpp* \ 110*4882a593Smuzhiyun ${base_libdir}/cpp \ 111*4882a593Smuzhiyun ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/cc1" 112*4882a593SmuzhiyunFILES:cpp-symlinks = "${bindir}/cpp" 113*4882a593Smuzhiyun 114*4882a593SmuzhiyunFILES:gcov = "${bindir}/${TARGET_PREFIX}gcov* \ 115*4882a593Smuzhiyun ${bindir}/${TARGET_PREFIX}gcov-tool* \ 116*4882a593Smuzhiyun" 117*4882a593SmuzhiyunFILES:gcov-symlinks = "${bindir}/gcov \ 118*4882a593Smuzhiyun ${bindir}/gcov-tool \ 119*4882a593Smuzhiyun" 120*4882a593Smuzhiyun 121*4882a593SmuzhiyunFILES:g++ = "\ 122*4882a593Smuzhiyun ${bindir}/${TARGET_PREFIX}g++* \ 123*4882a593Smuzhiyun ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/cc1plus \ 124*4882a593Smuzhiyun" 125*4882a593SmuzhiyunFILES:g++-symlinks = "\ 126*4882a593Smuzhiyun ${bindir}/c++ \ 127*4882a593Smuzhiyun ${bindir}/g++ \ 128*4882a593Smuzhiyun" 129*4882a593SmuzhiyunRRECOMMENDS:g++ = "\ 130*4882a593Smuzhiyun libstdc++ \ 131*4882a593Smuzhiyun libstdc++-dev \ 132*4882a593Smuzhiyun libatomic \ 133*4882a593Smuzhiyun libatomic-dev \ 134*4882a593Smuzhiyun" 135*4882a593Smuzhiyun 136*4882a593SmuzhiyunFILES:${PN}-doc = "\ 137*4882a593Smuzhiyun ${infodir} \ 138*4882a593Smuzhiyun ${mandir} \ 139*4882a593Smuzhiyun ${gcclibdir}/${TARGET_SYS}/${BINV}/include/README \ 140*4882a593Smuzhiyun" 141*4882a593Smuzhiyun 142*4882a593Smuzhiyundo_compile () { 143*4882a593Smuzhiyun # Prevent full target sysroot path from being used in configargs.h header, 144*4882a593Smuzhiyun # as it will be rewritten when used by other sysroots preventing support 145*4882a593Smuzhiyun # for gcc plugins. Additionally the path is embeddeded into the output 146*4882a593Smuzhiyun # binary, this prevents building a reproducible binary. 147*4882a593Smuzhiyun oe_runmake configure-gcc 148*4882a593Smuzhiyun sed -i 's@${STAGING_DIR_TARGET}@/@g' ${B}/gcc/configargs.h 149*4882a593Smuzhiyun sed -i 's@${STAGING_DIR_HOST}@/@g' ${B}/gcc/configargs.h 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun # Prevent sysroot/workdir paths from being used in checksum-options. 152*4882a593Smuzhiyun # checksum-options is used to generate a checksum which is embedded into 153*4882a593Smuzhiyun # the output binary. 154*4882a593Smuzhiyun oe_runmake TARGET-gcc=checksum-options all-gcc 155*4882a593Smuzhiyun sed -i 's@${DEBUG_PREFIX_MAP}@@g' ${B}/gcc/checksum-options 156*4882a593Smuzhiyun sed -i 's@${STAGING_DIR_TARGET}@/@g' ${B}/gcc/checksum-options 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun oe_runmake all-host 159*4882a593Smuzhiyun} 160*4882a593Smuzhiyun 161*4882a593Smuzhiyundo_install () { 162*4882a593Smuzhiyun oe_runmake 'DESTDIR=${D}' install-host 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun # Add unwind.h, it comes from libgcc which we don't want to build again 165*4882a593Smuzhiyun install ${STAGING_LIBDIR_NATIVE}/${TARGET_SYS}/gcc/${TARGET_SYS}/${BINV}/include/unwind.h ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/include/ 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun # Info dir listing isn't interesting at this point so remove it if it exists. 168*4882a593Smuzhiyun if [ -e "${D}${infodir}/dir" ]; then 169*4882a593Smuzhiyun rm -f ${D}${infodir}/dir 170*4882a593Smuzhiyun fi 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun # Cleanup some of the ${libdir}{,exec}/gcc stuff ... 173*4882a593Smuzhiyun rm -r ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/install-tools 174*4882a593Smuzhiyun rm -r ${D}${libexecdir}/gcc/${TARGET_SYS}/${BINV}/install-tools 175*4882a593Smuzhiyun rm -rf ${D}${libexecdir}/gcc/${TARGET_SYS}/${BINV}/*.la 176*4882a593Smuzhiyun rmdir ${D}${includedir} 177*4882a593Smuzhiyun rm -rf ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/finclude 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun # Hack around specs file assumptions 180*4882a593Smuzhiyun test -f ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/specs && sed -i -e '/^*cross_compile:$/ { n; s/1/0/; }' ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/specs 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun # Cleanup manpages.. 183*4882a593Smuzhiyun rm -rf ${D}${mandir}/man7 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun # Don't package details about the build host 186*4882a593Smuzhiyun rm -f ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/plugin/include/auto-build.h 187*4882a593Smuzhiyun rm -f ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/plugin/include/bconfig.h 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun cd ${D}${bindir} 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun # We care about g++ not c++ 192*4882a593Smuzhiyun rm -f *c++* 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun # We don't care about the gcc-<version> ones for this 195*4882a593Smuzhiyun rm -f *gcc-?*.?* 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun # Not sure why we end up with these but we don't want them... 198*4882a593Smuzhiyun rm -f ${TARGET_PREFIX}${TARGET_PREFIX}* 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun # Symlinks so we can use these trivially on the target 201*4882a593Smuzhiyun if [ -e ${TARGET_PREFIX}g77 ]; then 202*4882a593Smuzhiyun ln -sf ${TARGET_PREFIX}g77 g77 || true 203*4882a593Smuzhiyun ln -sf g77 f77 || true 204*4882a593Smuzhiyun fi 205*4882a593Smuzhiyun if [ -e ${TARGET_PREFIX}gfortran ]; then 206*4882a593Smuzhiyun ln -sf ${TARGET_PREFIX}gfortran gfortran || true 207*4882a593Smuzhiyun ln -sf gfortran f95 || true 208*4882a593Smuzhiyun fi 209*4882a593Smuzhiyun ln -sf ${TARGET_PREFIX}g++ g++ 210*4882a593Smuzhiyun ln -sf ${TARGET_PREFIX}gcc gcc 211*4882a593Smuzhiyun ln -sf ${TARGET_PREFIX}cpp cpp 212*4882a593Smuzhiyun ln -sf ${TARGET_PREFIX}gcov gcov 213*4882a593Smuzhiyun ln -sf ${TARGET_PREFIX}gcov-tool gcov-tool 214*4882a593Smuzhiyun install -d ${D}${base_libdir} 215*4882a593Smuzhiyun ln -sf ${bindir}/${TARGET_PREFIX}cpp ${D}${base_libdir}/cpp 216*4882a593Smuzhiyun ln -sf g++ c++ 217*4882a593Smuzhiyun ln -sf gcc cc 218*4882a593Smuzhiyun install -d ${D}${libdir}/bfd-plugins 219*4882a593Smuzhiyun ln -sf ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/liblto_plugin.so ${D}${libdir}/bfd-plugins/liblto_plugin.so 220*4882a593Smuzhiyun chown -R root:root ${D} 221*4882a593Smuzhiyun} 222*4882a593Smuzhiyun 223*4882a593Smuzhiyundo_install:append () { 224*4882a593Smuzhiyun # 225*4882a593Smuzhiyun # Thefixinc.sh script, run on the gcc's compile phase, looks into sysroot header 226*4882a593Smuzhiyun # files and places the modified files into 227*4882a593Smuzhiyun # {D}${libdir}/gcc/${TARGET_SYS}/${BINV}/include-fixed folder. This makes the 228*4882a593Smuzhiyun # build not deterministic. The following code prunes all those headers 229*4882a593Smuzhiyun # except those under include-fixed/linux, *limits.h and README, yielding 230*4882a593Smuzhiyun # the same include-fixed folders no matter what sysroot 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun include_fixed="${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/include-fixed" 233*4882a593Smuzhiyun for f in $(find ${include_fixed} -type f); do 234*4882a593Smuzhiyun case $f in 235*4882a593Smuzhiyun */include-fixed/linux/*) 236*4882a593Smuzhiyun continue 237*4882a593Smuzhiyun ;; 238*4882a593Smuzhiyun */include-fixed/*limits.h) 239*4882a593Smuzhiyun continue 240*4882a593Smuzhiyun ;; 241*4882a593Smuzhiyun */include-fixed/README) 242*4882a593Smuzhiyun continue 243*4882a593Smuzhiyun ;; 244*4882a593Smuzhiyun *) 245*4882a593Smuzhiyun # remove file and directory if empty 246*4882a593Smuzhiyun bbdebug 2 "Pruning $f" 247*4882a593Smuzhiyun rm $f 248*4882a593Smuzhiyun find $(dirname $f) -maxdepth 0 -empty -exec rmdir {} \; 249*4882a593Smuzhiyun ;; 250*4882a593Smuzhiyun esac 251*4882a593Smuzhiyun done 252*4882a593Smuzhiyun} 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun# Installing /usr/lib/gcc/* means we'd have two copies, one from gcc-cross 255*4882a593Smuzhiyun# and one from here. These can confuse gcc cross where includes use #include_next 256*4882a593Smuzhiyun# and builds track file dependencies (e.g. perl and its makedepends code). 257*4882a593Smuzhiyun# For determinism we don't install this ever and rely on the copy from gcc-cross. 258*4882a593Smuzhiyun# [YOCTO #7287] 259*4882a593SmuzhiyunSYSROOT_DIRS_IGNORE += "${libdir}/gcc" 260