1*4882a593SmuzhiyunPACKAGES = "" 2*4882a593Smuzhiyun 3*4882a593Smuzhiyuninherit image-postinst-intercepts image-artifact-names 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun# Wildcards specifying complementary packages to install for every package that has been explicitly 6*4882a593Smuzhiyun# installed into the rootfs 7*4882a593SmuzhiyunCOMPLEMENTARY_GLOB[dev-pkgs] = '*-dev' 8*4882a593SmuzhiyunCOMPLEMENTARY_GLOB[staticdev-pkgs] = '*-staticdev' 9*4882a593SmuzhiyunCOMPLEMENTARY_GLOB[doc-pkgs] = '*-doc' 10*4882a593SmuzhiyunCOMPLEMENTARY_GLOB[dbg-pkgs] = '*-dbg' 11*4882a593SmuzhiyunCOMPLEMENTARY_GLOB[src-pkgs] = '*-src' 12*4882a593SmuzhiyunCOMPLEMENTARY_GLOB[ptest-pkgs] = '*-ptest' 13*4882a593SmuzhiyunCOMPLEMENTARY_GLOB[bash-completion-pkgs] = '*-bash-completion' 14*4882a593Smuzhiyun 15*4882a593Smuzhiyundef complementary_globs(featurevar, d): 16*4882a593Smuzhiyun all_globs = d.getVarFlags('COMPLEMENTARY_GLOB') 17*4882a593Smuzhiyun globs = [] 18*4882a593Smuzhiyun features = set((d.getVar(featurevar) or '').split()) 19*4882a593Smuzhiyun for name, glob in all_globs.items(): 20*4882a593Smuzhiyun if name in features: 21*4882a593Smuzhiyun globs.append(glob) 22*4882a593Smuzhiyun return ' '.join(globs) 23*4882a593Smuzhiyun 24*4882a593SmuzhiyunSDKIMAGE_FEATURES ??= "dev-pkgs dbg-pkgs src-pkgs ${@bb.utils.contains('DISTRO_FEATURES', 'api-documentation', 'doc-pkgs', '', d)}" 25*4882a593SmuzhiyunSDKIMAGE_INSTALL_COMPLEMENTARY = '${@complementary_globs("SDKIMAGE_FEATURES", d)}' 26*4882a593SmuzhiyunSDKIMAGE_INSTALL_COMPLEMENTARY[vardeps] += "SDKIMAGE_FEATURES" 27*4882a593Smuzhiyun 28*4882a593SmuzhiyunPACKAGE_ARCHS:append:task-populate-sdk = " sdk-provides-dummy-target" 29*4882a593SmuzhiyunSDK_PACKAGE_ARCHS += "sdk-provides-dummy-${SDKPKGSUFFIX}" 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun# List of locales to install, or "all" for all of them, or unset for none. 32*4882a593SmuzhiyunSDKIMAGE_LINGUAS ?= "all" 33*4882a593Smuzhiyun 34*4882a593Smuzhiyuninherit rootfs_${IMAGE_PKGTYPE} 35*4882a593Smuzhiyun 36*4882a593SmuzhiyunSDK_DIR = "${WORKDIR}/sdk" 37*4882a593SmuzhiyunSDK_OUTPUT = "${SDK_DIR}/image" 38*4882a593SmuzhiyunSDK_DEPLOY = "${DEPLOY_DIR}/sdk" 39*4882a593Smuzhiyun 40*4882a593SmuzhiyunSDKDEPLOYDIR = "${WORKDIR}/${SDKMACHINE}-deploy-${PN}-populate-sdk" 41*4882a593Smuzhiyun 42*4882a593SmuzhiyunB:task-populate-sdk = "${SDK_DIR}" 43*4882a593Smuzhiyun 44*4882a593SmuzhiyunSDKTARGETSYSROOT = "${SDKPATH}/sysroots/${REAL_MULTIMACH_TARGET_SYS}" 45*4882a593Smuzhiyun 46*4882a593SmuzhiyunTOOLCHAIN_HOST_TASK ?= "nativesdk-packagegroup-sdk-host packagegroup-cross-canadian-${MACHINE}" 47*4882a593SmuzhiyunTOOLCHAIN_HOST_TASK_ATTEMPTONLY ?= "" 48*4882a593SmuzhiyunTOOLCHAIN_TARGET_TASK ?= "${@multilib_pkg_extend(d, 'packagegroup-core-standalone-sdk-target')} target-sdk-provides-dummy" 49*4882a593SmuzhiyunTOOLCHAIN_TARGET_TASK_ATTEMPTONLY ?= "" 50*4882a593SmuzhiyunTOOLCHAIN_OUTPUTNAME ?= "${SDK_NAME}-toolchain-${SDK_VERSION}" 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun# Default archived SDK's suffix 53*4882a593SmuzhiyunSDK_ARCHIVE_TYPE ?= "tar.xz" 54*4882a593SmuzhiyunSDK_XZ_COMPRESSION_LEVEL ?= "-9" 55*4882a593SmuzhiyunSDK_XZ_OPTIONS ?= "${XZ_DEFAULTS} ${SDK_XZ_COMPRESSION_LEVEL}" 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun# To support different sdk type according to SDK_ARCHIVE_TYPE, now support zip and tar.xz 58*4882a593Smuzhiyunpython () { 59*4882a593Smuzhiyun if d.getVar('SDK_ARCHIVE_TYPE') == 'zip': 60*4882a593Smuzhiyun d.setVar('SDK_ARCHIVE_DEPENDS', 'zip-native') 61*4882a593Smuzhiyun # SDK_ARCHIVE_CMD used to generate archived sdk ${TOOLCHAIN_OUTPUTNAME}.${SDK_ARCHIVE_TYPE} from input dir ${SDK_OUTPUT}/${SDKPATH} to output dir ${SDKDEPLOYDIR} 62*4882a593Smuzhiyun # recommand to cd into input dir first to avoid archive with buildpath 63*4882a593Smuzhiyun d.setVar('SDK_ARCHIVE_CMD', 'cd ${SDK_OUTPUT}/${SDKPATH}; zip -r -y ${SDKDEPLOYDIR}/${TOOLCHAIN_OUTPUTNAME}.${SDK_ARCHIVE_TYPE} .') 64*4882a593Smuzhiyun else: 65*4882a593Smuzhiyun d.setVar('SDK_ARCHIVE_DEPENDS', 'xz-native') 66*4882a593Smuzhiyun d.setVar('SDK_ARCHIVE_CMD', 'cd ${SDK_OUTPUT}/${SDKPATH}; tar ${SDKTAROPTS} -cf - . | xz ${SDK_XZ_OPTIONS} > ${SDKDEPLOYDIR}/${TOOLCHAIN_OUTPUTNAME}.${SDK_ARCHIVE_TYPE}') 67*4882a593Smuzhiyun} 68*4882a593Smuzhiyun 69*4882a593SmuzhiyunSDK_RDEPENDS = "${TOOLCHAIN_TARGET_TASK} ${TOOLCHAIN_HOST_TASK}" 70*4882a593SmuzhiyunSDK_DEPENDS = "virtual/fakeroot-native ${SDK_ARCHIVE_DEPENDS} cross-localedef-native nativesdk-qemuwrapper-cross ${@' '.join(["%s-qemuwrapper-cross" % m for m in d.getVar("MULTILIB_VARIANTS").split()])} qemuwrapper-cross" 71*4882a593SmuzhiyunPATH:prepend = "${WORKDIR}/recipe-sysroot/${SDKPATHNATIVE}${bindir}/crossscripts:${@":".join(all_multilib_tune_values(d, 'STAGING_BINDIR_CROSS').split())}:" 72*4882a593SmuzhiyunSDK_DEPENDS += "nativesdk-glibc-locale" 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun# We want the MULTIARCH_TARGET_SYS to point to the TUNE_PKGARCH, not PACKAGE_ARCH as it 75*4882a593Smuzhiyun# could be set to the MACHINE_ARCH 76*4882a593SmuzhiyunREAL_MULTIMACH_TARGET_SYS = "${TUNE_PKGARCH}${TARGET_VENDOR}-${TARGET_OS}" 77*4882a593Smuzhiyun 78*4882a593SmuzhiyunPID = "${@os.getpid()}" 79*4882a593Smuzhiyun 80*4882a593SmuzhiyunEXCLUDE_FROM_WORLD = "1" 81*4882a593Smuzhiyun 82*4882a593SmuzhiyunSDK_PACKAGING_FUNC ?= "create_shar" 83*4882a593SmuzhiyunSDK_PRE_INSTALL_COMMAND ?= "" 84*4882a593SmuzhiyunSDK_POST_INSTALL_COMMAND ?= "" 85*4882a593SmuzhiyunSDK_RELOCATE_AFTER_INSTALL ?= "1" 86*4882a593Smuzhiyun 87*4882a593SmuzhiyunSDKEXTPATH ??= "~/${@d.getVar('DISTRO')}_sdk" 88*4882a593SmuzhiyunSDK_TITLE ??= "${@d.getVar('DISTRO_NAME') or d.getVar('DISTRO')} SDK" 89*4882a593Smuzhiyun 90*4882a593SmuzhiyunSDK_TARGET_MANIFEST = "${SDKDEPLOYDIR}/${TOOLCHAIN_OUTPUTNAME}.target.manifest" 91*4882a593SmuzhiyunSDK_HOST_MANIFEST = "${SDKDEPLOYDIR}/${TOOLCHAIN_OUTPUTNAME}.host.manifest" 92*4882a593SmuzhiyunSDK_EXT_TARGET_MANIFEST = "${SDK_DEPLOY}/${TOOLCHAINEXT_OUTPUTNAME}.target.manifest" 93*4882a593SmuzhiyunSDK_EXT_HOST_MANIFEST = "${SDK_DEPLOY}/${TOOLCHAINEXT_OUTPUTNAME}.host.manifest" 94*4882a593Smuzhiyun 95*4882a593SmuzhiyunSDK_PRUNE_SYSROOT_DIRS ?= "/dev" 96*4882a593Smuzhiyun 97*4882a593Smuzhiyunpython write_target_sdk_manifest () { 98*4882a593Smuzhiyun from oe.sdk import sdk_list_installed_packages 99*4882a593Smuzhiyun from oe.utils import format_pkg_list 100*4882a593Smuzhiyun sdkmanifestdir = os.path.dirname(d.getVar("SDK_TARGET_MANIFEST")) 101*4882a593Smuzhiyun pkgs = sdk_list_installed_packages(d, True) 102*4882a593Smuzhiyun if not os.path.exists(sdkmanifestdir): 103*4882a593Smuzhiyun bb.utils.mkdirhier(sdkmanifestdir) 104*4882a593Smuzhiyun with open(d.getVar('SDK_TARGET_MANIFEST'), 'w') as output: 105*4882a593Smuzhiyun output.write(format_pkg_list(pkgs, 'ver')) 106*4882a593Smuzhiyun} 107*4882a593Smuzhiyun 108*4882a593Smuzhiyunsdk_prune_dirs () { 109*4882a593Smuzhiyun for d in ${SDK_PRUNE_SYSROOT_DIRS}; do 110*4882a593Smuzhiyun rm -rf ${SDK_OUTPUT}${SDKTARGETSYSROOT}$d 111*4882a593Smuzhiyun done 112*4882a593Smuzhiyun} 113*4882a593Smuzhiyun 114*4882a593Smuzhiyunpython write_sdk_test_data() { 115*4882a593Smuzhiyun from oe.data import export2json 116*4882a593Smuzhiyun testdata = "%s/%s.testdata.json" % (d.getVar('SDKDEPLOYDIR'), d.getVar('TOOLCHAIN_OUTPUTNAME')) 117*4882a593Smuzhiyun bb.utils.mkdirhier(os.path.dirname(testdata)) 118*4882a593Smuzhiyun export2json(d, testdata) 119*4882a593Smuzhiyun} 120*4882a593Smuzhiyun 121*4882a593Smuzhiyunpython write_host_sdk_manifest () { 122*4882a593Smuzhiyun from oe.sdk import sdk_list_installed_packages 123*4882a593Smuzhiyun from oe.utils import format_pkg_list 124*4882a593Smuzhiyun sdkmanifestdir = os.path.dirname(d.getVar("SDK_HOST_MANIFEST")) 125*4882a593Smuzhiyun pkgs = sdk_list_installed_packages(d, False) 126*4882a593Smuzhiyun if not os.path.exists(sdkmanifestdir): 127*4882a593Smuzhiyun bb.utils.mkdirhier(sdkmanifestdir) 128*4882a593Smuzhiyun with open(d.getVar('SDK_HOST_MANIFEST'), 'w') as output: 129*4882a593Smuzhiyun output.write(format_pkg_list(pkgs, 'ver')) 130*4882a593Smuzhiyun} 131*4882a593Smuzhiyun 132*4882a593SmuzhiyunPOPULATE_SDK_POST_TARGET_COMMAND:append = " write_sdk_test_data ; " 133*4882a593SmuzhiyunPOPULATE_SDK_POST_TARGET_COMMAND:append:task-populate-sdk = " write_target_sdk_manifest; sdk_prune_dirs; " 134*4882a593SmuzhiyunPOPULATE_SDK_POST_HOST_COMMAND:append:task-populate-sdk = " write_host_sdk_manifest; " 135*4882a593Smuzhiyun 136*4882a593SmuzhiyunSDK_PACKAGING_COMMAND = "${@'${SDK_PACKAGING_FUNC};' if '${SDK_PACKAGING_FUNC}' else ''}" 137*4882a593SmuzhiyunSDK_POSTPROCESS_COMMAND = " create_sdk_files; check_sdk_sysroots; archive_sdk; ${SDK_PACKAGING_COMMAND} " 138*4882a593Smuzhiyun 139*4882a593Smuzhiyundef populate_sdk_common(d): 140*4882a593Smuzhiyun from oe.sdk import populate_sdk 141*4882a593Smuzhiyun from oe.manifest import create_manifest, Manifest 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun # Handle package exclusions 144*4882a593Smuzhiyun excl_pkgs = (d.getVar("PACKAGE_EXCLUDE") or "").split() 145*4882a593Smuzhiyun inst_pkgs = (d.getVar("PACKAGE_INSTALL") or "").split() 146*4882a593Smuzhiyun inst_attempt_pkgs = (d.getVar("PACKAGE_INSTALL_ATTEMPTONLY") or "").split() 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun d.setVar('PACKAGE_INSTALL_ORIG', ' '.join(inst_pkgs)) 149*4882a593Smuzhiyun d.setVar('PACKAGE_INSTALL_ATTEMPTONLY', ' '.join(inst_attempt_pkgs)) 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun for pkg in excl_pkgs: 152*4882a593Smuzhiyun if pkg in inst_pkgs: 153*4882a593Smuzhiyun bb.warn("Package %s, set to be excluded, is in %s PACKAGE_INSTALL (%s). It will be removed from the list." % (pkg, d.getVar('PN'), inst_pkgs)) 154*4882a593Smuzhiyun inst_pkgs.remove(pkg) 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun if pkg in inst_attempt_pkgs: 157*4882a593Smuzhiyun bb.warn("Package %s, set to be excluded, is in %s PACKAGE_INSTALL_ATTEMPTONLY (%s). It will be removed from the list." % (pkg, d.getVar('PN'), inst_pkgs)) 158*4882a593Smuzhiyun inst_attempt_pkgs.remove(pkg) 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun d.setVar("PACKAGE_INSTALL", ' '.join(inst_pkgs)) 161*4882a593Smuzhiyun d.setVar("PACKAGE_INSTALL_ATTEMPTONLY", ' '.join(inst_attempt_pkgs)) 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun pn = d.getVar('PN') 164*4882a593Smuzhiyun runtime_mapping_rename("TOOLCHAIN_TARGET_TASK", pn, d) 165*4882a593Smuzhiyun runtime_mapping_rename("TOOLCHAIN_TARGET_TASK_ATTEMPTONLY", pn, d) 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun ld = bb.data.createCopy(d) 168*4882a593Smuzhiyun ld.setVar("PKGDATA_DIR", "${STAGING_DIR}/${SDK_ARCH}-${SDKPKGSUFFIX}${SDK_VENDOR}-${SDK_OS}/pkgdata") 169*4882a593Smuzhiyun runtime_mapping_rename("TOOLCHAIN_HOST_TASK", pn, ld) 170*4882a593Smuzhiyun runtime_mapping_rename("TOOLCHAIN_HOST_TASK_ATTEMPTONLY", pn, ld) 171*4882a593Smuzhiyun d.setVar("TOOLCHAIN_HOST_TASK", ld.getVar("TOOLCHAIN_HOST_TASK")) 172*4882a593Smuzhiyun d.setVar("TOOLCHAIN_HOST_TASK_ATTEMPTONLY", ld.getVar("TOOLCHAIN_HOST_TASK_ATTEMPTONLY")) 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun # create target/host SDK manifests 175*4882a593Smuzhiyun create_manifest(d, manifest_dir=d.getVar('SDK_DIR'), 176*4882a593Smuzhiyun manifest_type=Manifest.MANIFEST_TYPE_SDK_HOST) 177*4882a593Smuzhiyun create_manifest(d, manifest_dir=d.getVar('SDK_DIR'), 178*4882a593Smuzhiyun manifest_type=Manifest.MANIFEST_TYPE_SDK_TARGET) 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun populate_sdk(d) 181*4882a593Smuzhiyun 182*4882a593Smuzhiyunfakeroot python do_populate_sdk() { 183*4882a593Smuzhiyun populate_sdk_common(d) 184*4882a593Smuzhiyun} 185*4882a593SmuzhiyunSSTATETASKS += "do_populate_sdk" 186*4882a593SmuzhiyunSSTATE_SKIP_CREATION:task-populate-sdk = '1' 187*4882a593Smuzhiyundo_populate_sdk[cleandirs] = "${SDKDEPLOYDIR}" 188*4882a593Smuzhiyundo_populate_sdk[sstate-inputdirs] = "${SDKDEPLOYDIR}" 189*4882a593Smuzhiyundo_populate_sdk[sstate-outputdirs] = "${SDK_DEPLOY}" 190*4882a593Smuzhiyundo_populate_sdk[stamp-extra-info] = "${MACHINE_ARCH}${SDKMACHINE}" 191*4882a593Smuzhiyunpython do_populate_sdk_setscene () { 192*4882a593Smuzhiyun sstate_setscene(d) 193*4882a593Smuzhiyun} 194*4882a593Smuzhiyunaddtask do_populate_sdk_setscene 195*4882a593Smuzhiyun 196*4882a593SmuzhiyunPSEUDO_IGNORE_PATHS .= ",${SDKDEPLOYDIR},${WORKDIR}/oe-sdk-repo,${WORKDIR}/sstate-build-populate_sdk" 197*4882a593Smuzhiyun 198*4882a593Smuzhiyunfakeroot create_sdk_files() { 199*4882a593Smuzhiyun cp ${COREBASE}/scripts/relocate_sdk.py ${SDK_OUTPUT}/${SDKPATH}/ 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun # Replace the ##DEFAULT_INSTALL_DIR## with the correct pattern. 202*4882a593Smuzhiyun # Escape special characters like '+' and '.' in the SDKPATH 203*4882a593Smuzhiyun escaped_sdkpath=$(echo ${SDKPATH} |sed -e "s:[\+\.]:\\\\\\\\\0:g") 204*4882a593Smuzhiyun sed -i -e "s:##DEFAULT_INSTALL_DIR##:$escaped_sdkpath:" ${SDK_OUTPUT}/${SDKPATH}/relocate_sdk.py 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun mkdir -p ${SDK_OUTPUT}/${SDKPATHNATIVE}${sysconfdir}/ 207*4882a593Smuzhiyun echo '${SDKPATHNATIVE}${libdir_nativesdk} 208*4882a593Smuzhiyun${SDKPATHNATIVE}${base_libdir_nativesdk} 209*4882a593Smuzhiyuninclude /etc/ld.so.conf' > ${SDK_OUTPUT}/${SDKPATHNATIVE}${sysconfdir}/ld.so.conf 210*4882a593Smuzhiyun} 211*4882a593Smuzhiyun 212*4882a593Smuzhiyunpython check_sdk_sysroots() { 213*4882a593Smuzhiyun # Fails build if there are broken or dangling symlinks in SDK sysroots 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun if d.getVar('CHECK_SDK_SYSROOTS') != '1': 216*4882a593Smuzhiyun # disabled, bail out 217*4882a593Smuzhiyun return 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun def norm_path(path): 220*4882a593Smuzhiyun return os.path.abspath(path) 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun # Get scan root 223*4882a593Smuzhiyun SCAN_ROOT = norm_path("%s/%s/sysroots/" % (d.getVar('SDK_OUTPUT'), 224*4882a593Smuzhiyun d.getVar('SDKPATH'))) 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun bb.note('Checking SDK sysroots at ' + SCAN_ROOT) 227*4882a593Smuzhiyun 228*4882a593Smuzhiyun def check_symlink(linkPath): 229*4882a593Smuzhiyun if not os.path.islink(linkPath): 230*4882a593Smuzhiyun return 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun linkDirPath = os.path.dirname(linkPath) 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun targetPath = os.readlink(linkPath) 235*4882a593Smuzhiyun if not os.path.isabs(targetPath): 236*4882a593Smuzhiyun targetPath = os.path.join(linkDirPath, targetPath) 237*4882a593Smuzhiyun targetPath = norm_path(targetPath) 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun if SCAN_ROOT != os.path.commonprefix( [SCAN_ROOT, targetPath] ): 240*4882a593Smuzhiyun bb.error("Escaping symlink {0!s} --> {1!s}".format(linkPath, targetPath)) 241*4882a593Smuzhiyun return 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun if not os.path.exists(targetPath): 244*4882a593Smuzhiyun bb.error("Broken symlink {0!s} --> {1!s}".format(linkPath, targetPath)) 245*4882a593Smuzhiyun return 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun if os.path.isdir(targetPath): 248*4882a593Smuzhiyun dir_walk(targetPath) 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun def walk_error_handler(e): 251*4882a593Smuzhiyun bb.error(str(e)) 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun def dir_walk(rootDir): 254*4882a593Smuzhiyun for dirPath,subDirEntries,fileEntries in os.walk(rootDir, followlinks=False, onerror=walk_error_handler): 255*4882a593Smuzhiyun entries = subDirEntries + fileEntries 256*4882a593Smuzhiyun for e in entries: 257*4882a593Smuzhiyun ePath = os.path.join(dirPath, e) 258*4882a593Smuzhiyun check_symlink(ePath) 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun # start 261*4882a593Smuzhiyun dir_walk(SCAN_ROOT) 262*4882a593Smuzhiyun} 263*4882a593Smuzhiyun 264*4882a593SmuzhiyunSDKTAROPTS = "--owner=root --group=root" 265*4882a593Smuzhiyun 266*4882a593Smuzhiyunfakeroot archive_sdk() { 267*4882a593Smuzhiyun # Package it up 268*4882a593Smuzhiyun mkdir -p ${SDKDEPLOYDIR} 269*4882a593Smuzhiyun ${SDK_ARCHIVE_CMD} 270*4882a593Smuzhiyun} 271*4882a593Smuzhiyun 272*4882a593SmuzhiyunTOOLCHAIN_SHAR_EXT_TMPL ?= "${COREBASE}/meta/files/toolchain-shar-extract.sh" 273*4882a593SmuzhiyunTOOLCHAIN_SHAR_REL_TMPL ?= "${COREBASE}/meta/files/toolchain-shar-relocate.sh" 274*4882a593Smuzhiyun 275*4882a593Smuzhiyunfakeroot create_shar() { 276*4882a593Smuzhiyun # copy in the template shar extractor script 277*4882a593Smuzhiyun cp ${TOOLCHAIN_SHAR_EXT_TMPL} ${SDKDEPLOYDIR}/${TOOLCHAIN_OUTPUTNAME}.sh 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun rm -f ${T}/pre_install_command ${T}/post_install_command 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun if [ "${SDK_RELOCATE_AFTER_INSTALL}" = "1" ] ; then 282*4882a593Smuzhiyun cp ${TOOLCHAIN_SHAR_REL_TMPL} ${T}/post_install_command 283*4882a593Smuzhiyun fi 284*4882a593Smuzhiyun cat << "EOF" >> ${T}/pre_install_command 285*4882a593Smuzhiyun${SDK_PRE_INSTALL_COMMAND} 286*4882a593SmuzhiyunEOF 287*4882a593Smuzhiyun 288*4882a593Smuzhiyun cat << "EOF" >> ${T}/post_install_command 289*4882a593Smuzhiyun${SDK_POST_INSTALL_COMMAND} 290*4882a593SmuzhiyunEOF 291*4882a593Smuzhiyun sed -i -e '/@SDK_PRE_INSTALL_COMMAND@/r ${T}/pre_install_command' \ 292*4882a593Smuzhiyun -e '/@SDK_POST_INSTALL_COMMAND@/r ${T}/post_install_command' \ 293*4882a593Smuzhiyun ${SDKDEPLOYDIR}/${TOOLCHAIN_OUTPUTNAME}.sh 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun # substitute variables 296*4882a593Smuzhiyun sed -i -e 's#@SDK_ARCH@#${SDK_ARCH}#g' \ 297*4882a593Smuzhiyun -e 's#@SDKPATH@#${SDKPATH}#g' \ 298*4882a593Smuzhiyun -e 's#@SDKPATHINSTALL@#${SDKPATHINSTALL}#g' \ 299*4882a593Smuzhiyun -e 's#@SDKEXTPATH@#${SDKEXTPATH}#g' \ 300*4882a593Smuzhiyun -e 's#@OLDEST_KERNEL@#${SDK_OLDEST_KERNEL}#g' \ 301*4882a593Smuzhiyun -e 's#@REAL_MULTIMACH_TARGET_SYS@#${REAL_MULTIMACH_TARGET_SYS}#g' \ 302*4882a593Smuzhiyun -e 's#@SDK_TITLE@#${@d.getVar("SDK_TITLE").replace('&', '\\&')}#g' \ 303*4882a593Smuzhiyun -e 's#@SDK_VERSION@#${SDK_VERSION}#g' \ 304*4882a593Smuzhiyun -e '/@SDK_PRE_INSTALL_COMMAND@/d' \ 305*4882a593Smuzhiyun -e '/@SDK_POST_INSTALL_COMMAND@/d' \ 306*4882a593Smuzhiyun -e 's#@SDK_GCC_VER@#${@oe.utils.host_gcc_version(d, taskcontextonly=True)}#g' \ 307*4882a593Smuzhiyun -e 's#@SDK_ARCHIVE_TYPE@#${SDK_ARCHIVE_TYPE}#g' \ 308*4882a593Smuzhiyun ${SDKDEPLOYDIR}/${TOOLCHAIN_OUTPUTNAME}.sh 309*4882a593Smuzhiyun 310*4882a593Smuzhiyun # add execution permission 311*4882a593Smuzhiyun chmod +x ${SDKDEPLOYDIR}/${TOOLCHAIN_OUTPUTNAME}.sh 312*4882a593Smuzhiyun 313*4882a593Smuzhiyun # append the SDK tarball 314*4882a593Smuzhiyun cat ${SDKDEPLOYDIR}/${TOOLCHAIN_OUTPUTNAME}.${SDK_ARCHIVE_TYPE} >> ${SDKDEPLOYDIR}/${TOOLCHAIN_OUTPUTNAME}.sh 315*4882a593Smuzhiyun 316*4882a593Smuzhiyun # delete the old tarball, we don't need it anymore 317*4882a593Smuzhiyun rm ${SDKDEPLOYDIR}/${TOOLCHAIN_OUTPUTNAME}.${SDK_ARCHIVE_TYPE} 318*4882a593Smuzhiyun} 319*4882a593Smuzhiyun 320*4882a593Smuzhiyunpopulate_sdk_log_check() { 321*4882a593Smuzhiyun for target in $* 322*4882a593Smuzhiyun do 323*4882a593Smuzhiyun lf_path="`dirname ${BB_LOGFILE}`/log.do_$target.${PID}" 324*4882a593Smuzhiyun 325*4882a593Smuzhiyun echo "log_check: Using $lf_path as logfile" 326*4882a593Smuzhiyun 327*4882a593Smuzhiyun if [ -e "$lf_path" ]; then 328*4882a593Smuzhiyun ${IMAGE_PKGTYPE}_log_check $target $lf_path 329*4882a593Smuzhiyun else 330*4882a593Smuzhiyun echo "Cannot find logfile [$lf_path]" 331*4882a593Smuzhiyun fi 332*4882a593Smuzhiyun echo "Logfile is clean" 333*4882a593Smuzhiyun done 334*4882a593Smuzhiyun} 335*4882a593Smuzhiyun 336*4882a593Smuzhiyundef sdk_command_variables(d): 337*4882a593Smuzhiyun return ['OPKG_PREPROCESS_COMMANDS','OPKG_POSTPROCESS_COMMANDS','POPULATE_SDK_POST_HOST_COMMAND','POPULATE_SDK_PRE_TARGET_COMMAND','POPULATE_SDK_POST_TARGET_COMMAND','SDK_POSTPROCESS_COMMAND','RPM_PREPROCESS_COMMANDS','RPM_POSTPROCESS_COMMANDS'] 338*4882a593Smuzhiyun 339*4882a593Smuzhiyundef sdk_variables(d): 340*4882a593Smuzhiyun variables = ['BUILD_IMAGES_FROM_FEEDS','SDK_OS','SDK_OUTPUT','SDKPATHNATIVE','SDKTARGETSYSROOT','SDK_DIR','SDK_VENDOR','SDKIMAGE_INSTALL_COMPLEMENTARY','SDK_PACKAGE_ARCHS','SDK_OUTPUT', 341*4882a593Smuzhiyun 'SDKTARGETSYSROOT','MULTILIB_VARIANTS','MULTILIBS','ALL_MULTILIB_PACKAGE_ARCHS','MULTILIB_GLOBAL_VARIANTS','BAD_RECOMMENDATIONS','NO_RECOMMENDATIONS','PACKAGE_ARCHS', 342*4882a593Smuzhiyun 'PACKAGE_CLASSES','TARGET_VENDOR','TARGET_VENDOR','TARGET_ARCH','TARGET_OS','BBEXTENDVARIANT','FEED_DEPLOYDIR_BASE_URI', 'PACKAGE_EXCLUDE_COMPLEMENTARY', 'IMAGE_INSTALL_DEBUGFS'] 343*4882a593Smuzhiyun variables.extend(sdk_command_variables(d)) 344*4882a593Smuzhiyun return " ".join(variables) 345*4882a593Smuzhiyun 346*4882a593Smuzhiyundo_populate_sdk[vardeps] += "${@sdk_variables(d)}" 347*4882a593Smuzhiyun 348*4882a593Smuzhiyunpython () { 349*4882a593Smuzhiyun variables = sdk_command_variables(d) 350*4882a593Smuzhiyun for var in variables: 351*4882a593Smuzhiyun if d.getVar(var, False): 352*4882a593Smuzhiyun d.setVarFlag(var, 'func', '1') 353*4882a593Smuzhiyun} 354*4882a593Smuzhiyun 355*4882a593Smuzhiyundo_populate_sdk[file-checksums] += "${TOOLCHAIN_SHAR_REL_TMPL}:True \ 356*4882a593Smuzhiyun ${TOOLCHAIN_SHAR_EXT_TMPL}:True" 357*4882a593Smuzhiyun 358*4882a593Smuzhiyundo_populate_sdk[dirs] = "${PKGDATA_DIR} ${TOPDIR}" 359*4882a593Smuzhiyundo_populate_sdk[depends] += "${@' '.join([x + ':do_populate_sysroot' for x in d.getVar('SDK_DEPENDS').split()])} ${@d.getVarFlag('do_rootfs', 'depends', False)}" 360*4882a593Smuzhiyundo_populate_sdk[rdepends] = "${@' '.join([x + ':do_package_write_${IMAGE_PKGTYPE} ' + x + ':do_packagedata' for x in d.getVar('SDK_RDEPENDS').split()])}" 361*4882a593Smuzhiyundo_populate_sdk[recrdeptask] += "do_packagedata do_package_write_rpm do_package_write_ipk do_package_write_deb" 362*4882a593Smuzhiyundo_populate_sdk[file-checksums] += "${POSTINST_INTERCEPT_CHECKSUMS}" 363*4882a593Smuzhiyunaddtask populate_sdk 364