1*4882a593Smuzhiyun# 2*4882a593Smuzhiyun# NOTE - When using this class the user is responsible for ensuring that 3*4882a593Smuzhiyun# TRANSLATED_TARGET_ARCH is added into PN. This ensures that if the TARGET_ARCH 4*4882a593Smuzhiyun# is changed, another nativesdk xxx-canadian-cross can be installed 5*4882a593Smuzhiyun# 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun# SDK packages are built either explicitly by the user, 9*4882a593Smuzhiyun# or indirectly via dependency. No need to be in 'world'. 10*4882a593SmuzhiyunEXCLUDE_FROM_WORLD = "1" 11*4882a593SmuzhiyunNATIVESDKLIBC ?= "libc-glibc" 12*4882a593SmuzhiyunLIBCOVERRIDE = ":${NATIVESDKLIBC}" 13*4882a593SmuzhiyunCLASSOVERRIDE = "class-cross-canadian" 14*4882a593SmuzhiyunSTAGING_BINDIR_TOOLCHAIN = "${STAGING_DIR_NATIVE}${bindir_native}/${SDK_ARCH}${SDK_VENDOR}-${SDK_OS}:${STAGING_DIR_NATIVE}${bindir_native}/${TARGET_ARCH}${TARGET_VENDOR}-${TARGET_OS}" 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun# 17*4882a593Smuzhiyun# Update BASE_PACKAGE_ARCH and PACKAGE_ARCHS 18*4882a593Smuzhiyun# 19*4882a593SmuzhiyunPACKAGE_ARCH = "${SDK_ARCH}-${SDKPKGSUFFIX}" 20*4882a593SmuzhiyunBASECANADIANEXTRAOS ?= "linux-musl" 21*4882a593SmuzhiyunCANADIANEXTRAOS = "${BASECANADIANEXTRAOS}" 22*4882a593SmuzhiyunCANADIANEXTRAVENDOR = "" 23*4882a593SmuzhiyunMODIFYTOS ??= "1" 24*4882a593Smuzhiyunpython () { 25*4882a593Smuzhiyun archs = d.getVar('PACKAGE_ARCHS').split() 26*4882a593Smuzhiyun sdkarchs = [] 27*4882a593Smuzhiyun for arch in archs: 28*4882a593Smuzhiyun sdkarchs.append(arch + '-${SDKPKGSUFFIX}') 29*4882a593Smuzhiyun d.setVar('PACKAGE_ARCHS', " ".join(sdkarchs)) 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun # Allow the following code segment to be disabled, e.g. meta-environment 32*4882a593Smuzhiyun if d.getVar("MODIFYTOS") != "1": 33*4882a593Smuzhiyun return 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun if d.getVar("TCLIBC") in [ 'baremetal', 'newlib' ]: 36*4882a593Smuzhiyun return 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun tos = d.getVar("TARGET_OS") 39*4882a593Smuzhiyun tos_known = ["mingw32"] 40*4882a593Smuzhiyun extralibcs = [""] 41*4882a593Smuzhiyun if "musl" in d.getVar("BASECANADIANEXTRAOS"): 42*4882a593Smuzhiyun extralibcs.append("musl") 43*4882a593Smuzhiyun if "android" in tos: 44*4882a593Smuzhiyun extralibcs.append("android") 45*4882a593Smuzhiyun for variant in ["", "spe", "x32", "eabi", "n32", "_ilp32"]: 46*4882a593Smuzhiyun for libc in extralibcs: 47*4882a593Smuzhiyun entry = "linux" 48*4882a593Smuzhiyun if variant and libc: 49*4882a593Smuzhiyun entry = entry + "-" + libc + variant 50*4882a593Smuzhiyun elif variant: 51*4882a593Smuzhiyun entry = entry + "-gnu" + variant 52*4882a593Smuzhiyun elif libc: 53*4882a593Smuzhiyun entry = entry + "-" + libc 54*4882a593Smuzhiyun tos_known.append(entry) 55*4882a593Smuzhiyun if tos not in tos_known: 56*4882a593Smuzhiyun bb.fatal("Building cross-candian for an unknown TARGET_SYS (%s), please update cross-canadian.bbclass" % d.getVar("TARGET_SYS")) 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun for n in ["PROVIDES", "DEPENDS"]: 59*4882a593Smuzhiyun d.setVar(n, d.getVar(n)) 60*4882a593Smuzhiyun d.setVar("STAGING_BINDIR_TOOLCHAIN", d.getVar("STAGING_BINDIR_TOOLCHAIN")) 61*4882a593Smuzhiyun for prefix in ["AR", "AS", "DLLTOOL", "CC", "CXX", "GCC", "LD", "LIPO", "NM", "OBJDUMP", "RANLIB", "STRIP", "WINDRES"]: 62*4882a593Smuzhiyun n = prefix + "_FOR_TARGET" 63*4882a593Smuzhiyun d.setVar(n, d.getVar(n)) 64*4882a593Smuzhiyun # This is a bit ugly. We need to zero LIBC/ABI extension which will change TARGET_OS 65*4882a593Smuzhiyun # however we need the old value in some variables. We expand those here first. 66*4882a593Smuzhiyun tarch = d.getVar("TARGET_ARCH") 67*4882a593Smuzhiyun if tarch == "x86_64": 68*4882a593Smuzhiyun d.setVar("LIBCEXTENSION", "") 69*4882a593Smuzhiyun d.setVar("ABIEXTENSION", "") 70*4882a593Smuzhiyun d.appendVar("CANADIANEXTRAOS", " linux-gnux32") 71*4882a593Smuzhiyun for extraos in d.getVar("BASECANADIANEXTRAOS").split(): 72*4882a593Smuzhiyun d.appendVar("CANADIANEXTRAOS", " " + extraos + "x32") 73*4882a593Smuzhiyun elif tarch == "powerpc": 74*4882a593Smuzhiyun # PowerPC can build "linux" and "linux-gnuspe" 75*4882a593Smuzhiyun d.setVar("LIBCEXTENSION", "") 76*4882a593Smuzhiyun d.setVar("ABIEXTENSION", "") 77*4882a593Smuzhiyun d.appendVar("CANADIANEXTRAOS", " linux-gnuspe") 78*4882a593Smuzhiyun for extraos in d.getVar("BASECANADIANEXTRAOS").split(): 79*4882a593Smuzhiyun d.appendVar("CANADIANEXTRAOS", " " + extraos + "spe") 80*4882a593Smuzhiyun elif tarch == "mips64": 81*4882a593Smuzhiyun d.appendVar("CANADIANEXTRAOS", " linux-gnun32") 82*4882a593Smuzhiyun for extraos in d.getVar("BASECANADIANEXTRAOS").split(): 83*4882a593Smuzhiyun d.appendVar("CANADIANEXTRAOS", " " + extraos + "n32") 84*4882a593Smuzhiyun if tarch == "arm" or tarch == "armeb": 85*4882a593Smuzhiyun d.appendVar("CANADIANEXTRAOS", " linux-gnueabi linux-musleabi") 86*4882a593Smuzhiyun d.setVar("TARGET_OS", "linux-gnueabi") 87*4882a593Smuzhiyun else: 88*4882a593Smuzhiyun d.setVar("TARGET_OS", "linux") 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun # Also need to handle multilib target vendors 91*4882a593Smuzhiyun vendors = d.getVar("CANADIANEXTRAVENDOR") 92*4882a593Smuzhiyun if not vendors: 93*4882a593Smuzhiyun vendors = all_multilib_tune_values(d, 'TARGET_VENDOR') 94*4882a593Smuzhiyun origvendor = d.getVar("TARGET_VENDOR_MULTILIB_ORIGINAL") 95*4882a593Smuzhiyun if origvendor: 96*4882a593Smuzhiyun d.setVar("TARGET_VENDOR", origvendor) 97*4882a593Smuzhiyun if origvendor not in vendors.split(): 98*4882a593Smuzhiyun vendors = origvendor + " " + vendors 99*4882a593Smuzhiyun d.setVar("CANADIANEXTRAVENDOR", vendors) 100*4882a593Smuzhiyun} 101*4882a593SmuzhiyunMULTIMACH_TARGET_SYS = "${PACKAGE_ARCH}${HOST_VENDOR}-${HOST_OS}" 102*4882a593Smuzhiyun 103*4882a593SmuzhiyunINHIBIT_DEFAULT_DEPS = "1" 104*4882a593Smuzhiyun 105*4882a593SmuzhiyunSTAGING_DIR_HOST = "${RECIPE_SYSROOT}" 106*4882a593Smuzhiyun 107*4882a593SmuzhiyunTOOLCHAIN_OPTIONS = " --sysroot=${RECIPE_SYSROOT}" 108*4882a593Smuzhiyun 109*4882a593SmuzhiyunPATH:append = ":${TMPDIR}/sysroots/${HOST_ARCH}/${bindir_cross}" 110*4882a593SmuzhiyunPKGHIST_DIR = "${TMPDIR}/pkghistory/${HOST_ARCH}-${SDKPKGSUFFIX}${HOST_VENDOR}-${HOST_OS}/" 111*4882a593Smuzhiyun 112*4882a593SmuzhiyunHOST_ARCH = "${SDK_ARCH}" 113*4882a593SmuzhiyunHOST_VENDOR = "${SDK_VENDOR}" 114*4882a593SmuzhiyunHOST_OS = "${SDK_OS}" 115*4882a593SmuzhiyunHOST_PREFIX = "${SDK_PREFIX}" 116*4882a593SmuzhiyunHOST_CC_ARCH = "${SDK_CC_ARCH}" 117*4882a593SmuzhiyunHOST_LD_ARCH = "${SDK_LD_ARCH}" 118*4882a593SmuzhiyunHOST_AS_ARCH = "${SDK_AS_ARCH}" 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun#assign DPKG_ARCH 121*4882a593SmuzhiyunDPKG_ARCH = "${@debian_arch_map(d.getVar('SDK_ARCH'), '')}" 122*4882a593Smuzhiyun 123*4882a593SmuzhiyunCPPFLAGS = "${BUILDSDK_CPPFLAGS}" 124*4882a593SmuzhiyunCFLAGS = "${BUILDSDK_CFLAGS}" 125*4882a593SmuzhiyunCXXFLAGS = "${BUILDSDK_CFLAGS}" 126*4882a593SmuzhiyunLDFLAGS = "${BUILDSDK_LDFLAGS} \ 127*4882a593Smuzhiyun -Wl,-rpath-link,${STAGING_LIBDIR}/.. \ 128*4882a593Smuzhiyun -Wl,-rpath,${libdir}/.. " 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun# 131*4882a593Smuzhiyun# We need chrpath >= 0.14 to ensure we can deal with 32 and 64 bit 132*4882a593Smuzhiyun# binaries 133*4882a593Smuzhiyun# 134*4882a593SmuzhiyunDEPENDS:append = " chrpath-replacement-native" 135*4882a593SmuzhiyunEXTRANATIVEPATH += "chrpath-native" 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun# Path mangling needed by the cross packaging 138*4882a593Smuzhiyun# Note that we use := here to ensure that libdir and includedir are 139*4882a593Smuzhiyun# target paths. 140*4882a593Smuzhiyuntarget_base_prefix := "${base_prefix}" 141*4882a593Smuzhiyuntarget_prefix := "${prefix}" 142*4882a593Smuzhiyuntarget_exec_prefix := "${exec_prefix}" 143*4882a593Smuzhiyuntarget_base_libdir = "${target_base_prefix}/${baselib}" 144*4882a593Smuzhiyuntarget_libdir = "${target_exec_prefix}/${baselib}" 145*4882a593Smuzhiyuntarget_includedir := "${includedir}" 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun# Change to place files in SDKPATH 148*4882a593Smuzhiyunbase_prefix = "${SDKPATHNATIVE}" 149*4882a593Smuzhiyunprefix = "${SDKPATHNATIVE}${prefix_nativesdk}" 150*4882a593Smuzhiyunexec_prefix = "${SDKPATHNATIVE}${prefix_nativesdk}" 151*4882a593Smuzhiyunbindir = "${exec_prefix}/bin/${TARGET_ARCH}${TARGET_VENDOR}-${TARGET_OS}" 152*4882a593Smuzhiyunsbindir = "${bindir}" 153*4882a593Smuzhiyunbase_bindir = "${bindir}" 154*4882a593Smuzhiyunbase_sbindir = "${bindir}" 155*4882a593Smuzhiyunlibdir = "${exec_prefix}/lib/${TARGET_ARCH}${TARGET_VENDOR}-${TARGET_OS}" 156*4882a593Smuzhiyunlibexecdir = "${exec_prefix}/libexec/${TARGET_ARCH}${TARGET_VENDOR}-${TARGET_OS}" 157*4882a593Smuzhiyun 158*4882a593SmuzhiyunFILES:${PN} = "${prefix}" 159*4882a593Smuzhiyun 160*4882a593Smuzhiyunexport PKG_CONFIG_DIR = "${STAGING_DIR_HOST}${exec_prefix}/lib/pkgconfig" 161*4882a593Smuzhiyunexport PKG_CONFIG_SYSROOT_DIR = "${STAGING_DIR_HOST}" 162*4882a593Smuzhiyun 163*4882a593Smuzhiyundo_populate_sysroot[stamp-extra-info] = "" 164*4882a593Smuzhiyundo_packagedata[stamp-extra-info] = "" 165*4882a593Smuzhiyun 166*4882a593SmuzhiyunUSE_NLS = "${SDKUSE_NLS}" 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun# We have to us TARGET_ARCH but we care about the absolute value 169*4882a593Smuzhiyun# and not any particular tune that is enabled. 170*4882a593SmuzhiyunTARGET_ARCH[vardepsexclude] = "TUNE_ARCH" 171*4882a593Smuzhiyun 172*4882a593SmuzhiyunPKGDATA_DIR = "${PKGDATA_DIR_SDK}" 173*4882a593Smuzhiyun# If MLPREFIX is set by multilib code, shlibs 174*4882a593Smuzhiyun# points to the wrong place so force it 175*4882a593SmuzhiyunSHLIBSDIRS = "${PKGDATA_DIR}/nativesdk-shlibs2" 176*4882a593SmuzhiyunSHLIBSWORKDIR = "${PKGDATA_DIR}/nativesdk-shlibs2" 177*4882a593Smuzhiyun 178*4882a593Smuzhiyuncross_canadian_bindirlinks () { 179*4882a593Smuzhiyun for i in linux ${CANADIANEXTRAOS} 180*4882a593Smuzhiyun do 181*4882a593Smuzhiyun for v in ${CANADIANEXTRAVENDOR} 182*4882a593Smuzhiyun do 183*4882a593Smuzhiyun d=${D}${bindir}/../${TARGET_ARCH}$v-$i 184*4882a593Smuzhiyun if [ -d $d ]; 185*4882a593Smuzhiyun then 186*4882a593Smuzhiyun continue 187*4882a593Smuzhiyun fi 188*4882a593Smuzhiyun install -d $d 189*4882a593Smuzhiyun for j in `ls ${D}${bindir}` 190*4882a593Smuzhiyun do 191*4882a593Smuzhiyun p=${TARGET_ARCH}$v-$i-`echo $j | sed -e s,${TARGET_PREFIX},,` 192*4882a593Smuzhiyun ln -s ../${TARGET_SYS}/$j $d/$p 193*4882a593Smuzhiyun done 194*4882a593Smuzhiyun done 195*4882a593Smuzhiyun done 196*4882a593Smuzhiyun} 197