1*4882a593Smuzhiyun# 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-only 3*4882a593Smuzhiyun# 4*4882a593Smuzhiyun 5*4882a593Smuzhiyunfrom abc import ABCMeta, abstractmethod 6*4882a593Smuzhiyunfrom oe.utils import execute_pre_post_process 7*4882a593Smuzhiyunfrom oe.manifest import * 8*4882a593Smuzhiyunfrom oe.package_manager import * 9*4882a593Smuzhiyunimport os 10*4882a593Smuzhiyunimport traceback 11*4882a593Smuzhiyun 12*4882a593Smuzhiyunclass Sdk(object, metaclass=ABCMeta): 13*4882a593Smuzhiyun def __init__(self, d, manifest_dir): 14*4882a593Smuzhiyun self.d = d 15*4882a593Smuzhiyun self.sdk_output = self.d.getVar('SDK_OUTPUT') 16*4882a593Smuzhiyun self.sdk_native_path = self.d.getVar('SDKPATHNATIVE').strip('/') 17*4882a593Smuzhiyun self.target_path = self.d.getVar('SDKTARGETSYSROOT').strip('/') 18*4882a593Smuzhiyun self.sysconfdir = self.d.getVar('sysconfdir').strip('/') 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun self.sdk_target_sysroot = os.path.join(self.sdk_output, self.target_path) 21*4882a593Smuzhiyun self.sdk_host_sysroot = self.sdk_output 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun if manifest_dir is None: 24*4882a593Smuzhiyun self.manifest_dir = self.d.getVar("SDK_DIR") 25*4882a593Smuzhiyun else: 26*4882a593Smuzhiyun self.manifest_dir = manifest_dir 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun self.remove(self.sdk_output, True) 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun self.install_order = Manifest.INSTALL_ORDER 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun @abstractmethod 33*4882a593Smuzhiyun def _populate(self): 34*4882a593Smuzhiyun pass 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun def populate(self): 37*4882a593Smuzhiyun self.mkdirhier(self.sdk_output) 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun # call backend dependent implementation 40*4882a593Smuzhiyun self._populate() 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun # Don't ship any libGL in the SDK 43*4882a593Smuzhiyun self.remove(os.path.join(self.sdk_output, self.sdk_native_path, 44*4882a593Smuzhiyun self.d.getVar('libdir_nativesdk').strip('/'), 45*4882a593Smuzhiyun "libGL*")) 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun # Fix or remove broken .la files 48*4882a593Smuzhiyun self.remove(os.path.join(self.sdk_output, self.sdk_native_path, 49*4882a593Smuzhiyun self.d.getVar('libdir_nativesdk').strip('/'), 50*4882a593Smuzhiyun "*.la")) 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun # Link the ld.so.cache file into the hosts filesystem 53*4882a593Smuzhiyun link_name = os.path.join(self.sdk_output, self.sdk_native_path, 54*4882a593Smuzhiyun self.sysconfdir, "ld.so.cache") 55*4882a593Smuzhiyun self.mkdirhier(os.path.dirname(link_name)) 56*4882a593Smuzhiyun os.symlink("/etc/ld.so.cache", link_name) 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun execute_pre_post_process(self.d, self.d.getVar('SDK_POSTPROCESS_COMMAND')) 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun def movefile(self, sourcefile, destdir): 61*4882a593Smuzhiyun try: 62*4882a593Smuzhiyun # FIXME: this check of movefile's return code to None should be 63*4882a593Smuzhiyun # fixed within the function to use only exceptions to signal when 64*4882a593Smuzhiyun # something goes wrong 65*4882a593Smuzhiyun if (bb.utils.movefile(sourcefile, destdir) == None): 66*4882a593Smuzhiyun raise OSError("moving %s to %s failed" 67*4882a593Smuzhiyun %(sourcefile, destdir)) 68*4882a593Smuzhiyun #FIXME: using umbrella exc catching because bb.utils method raises it 69*4882a593Smuzhiyun except Exception as e: 70*4882a593Smuzhiyun bb.debug(1, "printing the stack trace\n %s" %traceback.format_exc()) 71*4882a593Smuzhiyun bb.error("unable to place %s in final SDK location" % sourcefile) 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun def mkdirhier(self, dirpath): 74*4882a593Smuzhiyun try: 75*4882a593Smuzhiyun bb.utils.mkdirhier(dirpath) 76*4882a593Smuzhiyun except OSError as e: 77*4882a593Smuzhiyun bb.debug(1, "printing the stack trace\n %s" %traceback.format_exc()) 78*4882a593Smuzhiyun bb.fatal("cannot make dir for SDK: %s" % dirpath) 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun def remove(self, path, recurse=False): 81*4882a593Smuzhiyun try: 82*4882a593Smuzhiyun bb.utils.remove(path, recurse) 83*4882a593Smuzhiyun #FIXME: using umbrella exc catching because bb.utils method raises it 84*4882a593Smuzhiyun except Exception as e: 85*4882a593Smuzhiyun bb.debug(1, "printing the stack trace\n %s" %traceback.format_exc()) 86*4882a593Smuzhiyun bb.warn("cannot remove SDK dir: %s" % path) 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun def install_locales(self, pm): 89*4882a593Smuzhiyun linguas = self.d.getVar("SDKIMAGE_LINGUAS") 90*4882a593Smuzhiyun if linguas: 91*4882a593Smuzhiyun import fnmatch 92*4882a593Smuzhiyun # Install the binary locales 93*4882a593Smuzhiyun if linguas == "all": 94*4882a593Smuzhiyun pm.install_glob("nativesdk-glibc-binary-localedata-*.utf-8", sdk=True) 95*4882a593Smuzhiyun else: 96*4882a593Smuzhiyun pm.install(["nativesdk-glibc-binary-localedata-%s.utf-8" % \ 97*4882a593Smuzhiyun lang for lang in linguas.split()]) 98*4882a593Smuzhiyun # Generate a locale archive of them 99*4882a593Smuzhiyun target_arch = self.d.getVar('SDK_ARCH') 100*4882a593Smuzhiyun rootfs = oe.path.join(self.sdk_host_sysroot, self.sdk_native_path) 101*4882a593Smuzhiyun localedir = oe.path.join(rootfs, self.d.getVar("libdir_nativesdk"), "locale") 102*4882a593Smuzhiyun generate_locale_archive(self.d, rootfs, target_arch, localedir) 103*4882a593Smuzhiyun # And now delete the binary locales 104*4882a593Smuzhiyun pkgs = fnmatch.filter(pm.list_installed(), "nativesdk-glibc-binary-localedata-*.utf-8") 105*4882a593Smuzhiyun pm.remove(pkgs) 106*4882a593Smuzhiyun else: 107*4882a593Smuzhiyun # No linguas so do nothing 108*4882a593Smuzhiyun pass 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun 111*4882a593Smuzhiyundef sdk_list_installed_packages(d, target, rootfs_dir=None): 112*4882a593Smuzhiyun if rootfs_dir is None: 113*4882a593Smuzhiyun sdk_output = d.getVar('SDK_OUTPUT') 114*4882a593Smuzhiyun target_path = d.getVar('SDKTARGETSYSROOT').strip('/') 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun rootfs_dir = [sdk_output, os.path.join(sdk_output, target_path)][target is True] 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun if target is False: 119*4882a593Smuzhiyun ipkgconf_sdk_target = d.getVar("IPKGCONF_SDK") 120*4882a593Smuzhiyun d.setVar("IPKGCONF_TARGET", ipkgconf_sdk_target) 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun img_type = d.getVar('IMAGE_PKGTYPE') 123*4882a593Smuzhiyun import importlib 124*4882a593Smuzhiyun cls = importlib.import_module('oe.package_manager.' + img_type) 125*4882a593Smuzhiyun return cls.PMPkgsList(d, rootfs_dir).list_pkgs() 126*4882a593Smuzhiyun 127*4882a593Smuzhiyundef populate_sdk(d, manifest_dir=None): 128*4882a593Smuzhiyun env_bkp = os.environ.copy() 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun img_type = d.getVar('IMAGE_PKGTYPE') 131*4882a593Smuzhiyun import importlib 132*4882a593Smuzhiyun cls = importlib.import_module('oe.package_manager.' + img_type + '.sdk') 133*4882a593Smuzhiyun cls.PkgSdk(d, manifest_dir).populate() 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun os.environ.clear() 136*4882a593Smuzhiyun os.environ.update(env_bkp) 137*4882a593Smuzhiyun 138*4882a593Smuzhiyundef get_extra_sdkinfo(sstate_dir): 139*4882a593Smuzhiyun """ 140*4882a593Smuzhiyun This function is going to be used for generating the target and host manifest files packages of eSDK. 141*4882a593Smuzhiyun """ 142*4882a593Smuzhiyun import math 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun extra_info = {} 145*4882a593Smuzhiyun extra_info['tasksizes'] = {} 146*4882a593Smuzhiyun extra_info['filesizes'] = {} 147*4882a593Smuzhiyun for root, _, files in os.walk(sstate_dir): 148*4882a593Smuzhiyun for fn in files: 149*4882a593Smuzhiyun if fn.endswith('.tgz'): 150*4882a593Smuzhiyun fsize = int(math.ceil(float(os.path.getsize(os.path.join(root, fn))) / 1024)) 151*4882a593Smuzhiyun task = fn.rsplit(':',1)[1].split('_',1)[1].split(',')[0] 152*4882a593Smuzhiyun origtotal = extra_info['tasksizes'].get(task, 0) 153*4882a593Smuzhiyun extra_info['tasksizes'][task] = origtotal + fsize 154*4882a593Smuzhiyun extra_info['filesizes'][fn] = fsize 155*4882a593Smuzhiyun return extra_info 156*4882a593Smuzhiyun 157*4882a593Smuzhiyunif __name__ == "__main__": 158*4882a593Smuzhiyun pass 159