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