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