1*4882a593SmuzhiyunBPN = "libgcc" 2*4882a593Smuzhiyun 3*4882a593Smuzhiyunrequire gcc-configure-common.inc 4*4882a593Smuzhiyun 5*4882a593SmuzhiyunINHIBIT_DEFAULT_DEPS = "1" 6*4882a593Smuzhiyun 7*4882a593Smuzhiyundo_configure () { 8*4882a593Smuzhiyun install -d ${D}${base_libdir} ${D}${libdir} 9*4882a593Smuzhiyun mkdir -p ${B}/${BPN} 10*4882a593Smuzhiyun mkdir -p ${B}/${TARGET_SYS}/${BPN}/ 11*4882a593Smuzhiyun cd ${B}/${BPN} 12*4882a593Smuzhiyun chmod a+x ${S}/${BPN}/configure 13*4882a593Smuzhiyun relpath=${@os.path.relpath("${S}/${BPN}", "${B}/${BPN}")} 14*4882a593Smuzhiyun $relpath/configure ${CONFIGUREOPTS} ${EXTRA_OECONF} 15*4882a593Smuzhiyun} 16*4882a593SmuzhiyunEXTRACONFFUNCS += "extract_stashed_builddir" 17*4882a593Smuzhiyundo_configure[depends] += "${COMPILERDEP}" 18*4882a593Smuzhiyun 19*4882a593Smuzhiyundo_compile () { 20*4882a593Smuzhiyun cd ${B}/${BPN} 21*4882a593Smuzhiyun oe_runmake MULTIBUILDTOP=${B}/${TARGET_SYS}/${BPN}/ 22*4882a593Smuzhiyun} 23*4882a593Smuzhiyun 24*4882a593Smuzhiyundo_install () { 25*4882a593Smuzhiyun cd ${B}/${BPN} 26*4882a593Smuzhiyun oe_runmake 'DESTDIR=${D}' MULTIBUILDTOP=${B}/${TARGET_SYS}/${BPN}/ install 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun # Move libgcc_s into /lib 29*4882a593Smuzhiyun mkdir -p ${D}${base_libdir} 30*4882a593Smuzhiyun if [ -f ${D}${libdir}/nof/libgcc_s.so ]; then 31*4882a593Smuzhiyun mv ${D}${libdir}/nof/libgcc* ${D}${base_libdir} 32*4882a593Smuzhiyun else 33*4882a593Smuzhiyun mv ${D}${libdir}/libgcc* ${D}${base_libdir} || true 34*4882a593Smuzhiyun fi 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun # install the runtime in /usr/lib/ not in /usr/lib/gcc on target 37*4882a593Smuzhiyun # so that cross-gcc can find it in the sysroot 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun mv ${D}${libdir}/gcc/* ${D}${libdir} 40*4882a593Smuzhiyun rm -rf ${D}${libdir}/gcc/ 41*4882a593Smuzhiyun # unwind.h is installed here which is shipped in gcc-cross 42*4882a593Smuzhiyun # as well as target gcc and they are identical so we dont 43*4882a593Smuzhiyun # ship one with libgcc here 44*4882a593Smuzhiyun rm -rf ${D}${libdir}/${TARGET_SYS}/${BINV}/include 45*4882a593Smuzhiyun} 46*4882a593Smuzhiyun 47*4882a593Smuzhiyundo_install:append:libc-baremetal () { 48*4882a593Smuzhiyun if [ "${base_libdir}" != "${libdir}" ]; then 49*4882a593Smuzhiyun rmdir ${D}${base_libdir} 50*4882a593Smuzhiyun fi 51*4882a593Smuzhiyun} 52*4882a593Smuzhiyundo_install:append:libc-newlib () { 53*4882a593Smuzhiyun if [ "${base_libdir}" != "${libdir}" ]; then 54*4882a593Smuzhiyun rmdir ${D}${base_libdir} 55*4882a593Smuzhiyun fi 56*4882a593Smuzhiyun} 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun# No rpm package is actually created but -dev depends on it, avoid dnf error 59*4882a593SmuzhiyunRDEPENDS:${PN}-dev:libc-baremetal = "" 60*4882a593SmuzhiyunRDEPENDS:${PN}-dev:libc-newlib = "" 61*4882a593Smuzhiyun 62*4882a593SmuzhiyunBBCLASSEXTEND = "nativesdk" 63*4882a593Smuzhiyun 64*4882a593Smuzhiyunaddtask multilib_install after do_install before do_package do_populate_sysroot 65*4882a593Smuzhiyun# this makes multilib gcc files findable for target gcc 66*4882a593Smuzhiyun# e.g. 67*4882a593Smuzhiyun# /usr/lib/i586-pokymllib32-linux/4.7/ 68*4882a593Smuzhiyun# by creating this symlink to it 69*4882a593Smuzhiyun# /usr/lib64/x86_64-poky-linux/4.7/32 70*4882a593Smuzhiyun 71*4882a593Smuzhiyunfakeroot python do_multilib_install() { 72*4882a593Smuzhiyun import re 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun multilibs = d.getVar('MULTILIB_VARIANTS') 75*4882a593Smuzhiyun if not multilibs or bb.data.inherits_class('nativesdk', d): 76*4882a593Smuzhiyun return 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun binv = d.getVar('BINV') 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun mlprefix = d.getVar('MLPREFIX') 81*4882a593Smuzhiyun if ('%slibgcc' % mlprefix) != d.getVar('PN'): 82*4882a593Smuzhiyun return 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun if mlprefix: 85*4882a593Smuzhiyun orig_tune = d.getVar('DEFAULTTUNE_MULTILIB_ORIGINAL') 86*4882a593Smuzhiyun orig_tune_params = get_tune_parameters(orig_tune, d) 87*4882a593Smuzhiyun orig_tune_baselib = orig_tune_params['baselib'] 88*4882a593Smuzhiyun orig_tune_bitness = orig_tune_baselib.replace('lib', '') 89*4882a593Smuzhiyun if not orig_tune_bitness: 90*4882a593Smuzhiyun orig_tune_bitness = '32' 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun src = '../../../' + orig_tune_baselib + '/' + \ 93*4882a593Smuzhiyun d.getVar('TARGET_SYS_MULTILIB_ORIGINAL') + '/' + binv + '/' 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun dest = d.getVar('D') + d.getVar('libdir') + '/' + \ 96*4882a593Smuzhiyun d.getVar('TARGET_SYS') + '/' + binv + '/' + orig_tune_bitness 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun if os.path.lexists(dest): 99*4882a593Smuzhiyun os.unlink(dest) 100*4882a593Smuzhiyun os.symlink(src, dest) 101*4882a593Smuzhiyun return 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun for ml in multilibs.split(): 105*4882a593Smuzhiyun tune = d.getVar('DEFAULTTUNE:virtclass-multilib-' + ml) 106*4882a593Smuzhiyun if not tune: 107*4882a593Smuzhiyun bb.warn('DEFAULTTUNE:virtclass-multilib-%s is not defined. Skipping...' % ml) 108*4882a593Smuzhiyun continue 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun tune_parameters = get_tune_parameters(tune, d) 111*4882a593Smuzhiyun tune_baselib = tune_parameters['baselib'] 112*4882a593Smuzhiyun if not tune_baselib: 113*4882a593Smuzhiyun bb.warn("Tune %s doesn't have a baselib set. Skipping..." % tune) 114*4882a593Smuzhiyun continue 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun tune_arch = tune_parameters['arch'] 117*4882a593Smuzhiyun tune_bitness = tune_baselib.replace('lib', '') 118*4882a593Smuzhiyun if not tune_bitness: 119*4882a593Smuzhiyun tune_bitness = '32' # /lib => 32bit lib 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun tune_abiextension = tune_parameters['abiextension'] 122*4882a593Smuzhiyun if tune_abiextension: 123*4882a593Smuzhiyun libcextension = '-gnu' + tune_abiextension 124*4882a593Smuzhiyun else: 125*4882a593Smuzhiyun libcextension = '' 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun src = '../../../' + tune_baselib + '/' + \ 128*4882a593Smuzhiyun tune_arch + d.getVar('TARGET_VENDOR') + 'ml' + ml + \ 129*4882a593Smuzhiyun '-' + d.getVar('TARGET_OS') + libcextension + '/' + binv + '/' 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun dest = d.getVar('D') + d.getVar('libdir') + '/' + \ 132*4882a593Smuzhiyun d.getVar('TARGET_SYS') + '/' + binv + '/' + tune_bitness 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun if os.path.lexists(dest): 135*4882a593Smuzhiyun os.unlink(dest) 136*4882a593Smuzhiyun os.symlink(src, dest) 137*4882a593Smuzhiyun} 138*4882a593Smuzhiyun 139*4882a593Smuzhiyundef get_original_os(d): 140*4882a593Smuzhiyun vendoros = d.expand('${TARGET_ARCH}${ORIG_TARGET_VENDOR}-${TARGET_OS}') 141*4882a593Smuzhiyun for suffix in [d.getVar('ABIEXTENSION'), d.getVar('LIBCEXTENSION')]: 142*4882a593Smuzhiyun if suffix and vendoros.endswith(suffix): 143*4882a593Smuzhiyun vendoros = vendoros[:-len(suffix)] 144*4882a593Smuzhiyun # Arm must use linux-gnueabi not linux as only the former is accepted by gcc 145*4882a593Smuzhiyun if vendoros.startswith("arm-") and not vendoros.endswith("-gnueabi"): 146*4882a593Smuzhiyun vendoros = vendoros + "-gnueabi" 147*4882a593Smuzhiyun return vendoros 148*4882a593Smuzhiyun 149*4882a593SmuzhiyunORIG_TARGET_VENDOR := "${TARGET_VENDOR}" 150*4882a593SmuzhiyunBASETARGET_SYS = "${@get_original_os(d)}" 151*4882a593Smuzhiyun 152*4882a593Smuzhiyunaddtask extra_symlinks after do_multilib_install before do_package do_populate_sysroot 153*4882a593Smuzhiyunfakeroot python do_extra_symlinks() { 154*4882a593Smuzhiyun if bb.data.inherits_class('nativesdk', d): 155*4882a593Smuzhiyun return 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun targetsys = d.getVar('BASETARGET_SYS') 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun if targetsys != d.getVar('TARGET_SYS'): 160*4882a593Smuzhiyun dest = d.getVar('D') + d.getVar('libdir') + '/' + targetsys 161*4882a593Smuzhiyun src = d.getVar('TARGET_SYS') 162*4882a593Smuzhiyun if not os.path.lexists(dest) and os.path.lexists(d.getVar('D') + d.getVar('libdir')): 163*4882a593Smuzhiyun os.symlink(src, dest) 164*4882a593Smuzhiyun} 165