安装了2个event handler
-
uninative_event_fetchloader
uninative_event_fetchloader[eventmask] = "bb.event.BuildStarted" -
uninative_event_enable
uninative_event_enable[eventmask] = "bb.event.ConfigParsed"
eventmask的解释:
bb.event.BuildStarted(): Fired when a new build starts. BitBake fires multiple “BuildStarted” events (one per configuration) when multiple configuration (multiconfig) is enabled.
bb.event.ConfigParsed(): Fired when the base configuration; which consists of `bitbake.conf`, `base.bbclass` and any global [INHERIT](https://docs.yoctoproject.org/bitbake/2.0/bitbake-user-manual/bitbake-user-manual-ref-variables.html#term-INHERIT) statements; has been parsed. You can see multiple such events when each of the workers parse the base configuration or if the server changes configuration and reparses. Any given datastore only has one such event executed against it, however. If [BB_INVALIDCONF](https://docs.yoctoproject.org/bitbake/2.0/bitbake-user-manual/bitbake-user-manual-ref-variables.html#term-BB_INVALIDCONF) is set in the datastore by the event handler, the configuration is reparsed and a new event triggered, allowing the metadata to update configuration.
uninative_event_fetchloader
- 检查
${UNINATIVE_LOADER}
是否已经有了
31 loader = d.getVar("UNINATIVE_LOADER")
32 loaderchksum = loader + ".chksum"
33 if os.path.exists(loader) and os.path.exists(loaderchksum):
34 ¦ with open(loaderchksum, "r") as f:
35 ¦ ¦ readchksum = f.read().strip()
36 ¦ if readchksum == chksum:
37 ¦ ¦ return
- 检查
${UNINATIVE_TARBALL}
是否下载;若没下载则下载。
40 try:
41 ¦ # Save and restore cwd as Fetch.download() does a chdir()
42 ¦ olddir = os.getcwd()
43
44 ¦ tarball = d.getVar("UNINATIVE_TARBALL")
45 ¦ tarballdir = os.path.join(d.getVar("UNINATIVE_DLDIR"), chksum)
46 ¦ tarballpath = os.path.join(tarballdir, tarball)
47
48 ¦ if not os.path.exists(tarballpath + ".done"):
49 ¦ ¦ bb.utils.mkdirhier(tarballdir)
53 ¦ ¦ localdata = bb.data.createCopy(d)
54 ¦ ¦ localdata.setVar('FILESPATH', "")
55 ¦ ¦ localdata.setVar('DL_DIR', tarballdir)
>> 59 ¦ ¦ premirrors = bb.fetch2.mirror_from_string(localdata.getVar("PREMIRRORS"))
60 ¦ ¦ for line in premirrors:
61 ¦ ¦ ¦ try:
62 ¦ ¦ ¦ ¦ (find, replace) = line
67
>> 68 ¦ ¦ srcuri = d.expand("${UNINATIVE_URL}${UNINATIVE_TARBALL};sha256sum=%s" % chksum)
>> 69 ¦ ¦ bb.note("Fetching uninative binary shim %s (will check PREMIRRORS first)" % srcuri)
70
71 ¦ ¦ fetcher = bb.fetch2.Fetch([srcuri], localdata, cache=False)
72 ¦ ¦ fetcher.download()
73 ¦ ¦ localpath = fetcher.localpath(srcuri)
>> 74 ¦ ¦ if localpath != tarballpath and os.path.exists(localpath) and not os.path.exists(tarballpath):
79 ¦ ¦ ¦ if os.path.islink(tarballpath):
80 ¦ ¦ ¦ ¦ # Broken symbolic link
81 ¦ ¦ ¦ ¦ os.unlink(tarballpath)
82
83 ¦ ¦ ¦ # Deal with two processes trying to make symlink at once
84 ¦ ¦ ¦ try:
85 ¦ ¦ ¦ ¦ os.symlink(localpath, tarballpath)
- 检查gcc版本是否符合要求
>> 90 ¦ glibcver = subprocess.check_output(["ldd", "--version"]).decode('utf-8').split('\n')[0].split()[-1]
>> 91 ¦ if bb.utils.vercmp_string(d.getVar("UNINATIVE_MAXGLIBCVERSION"), glibcver) < 0:
>> 92 ¦ ¦ raise RuntimeError("Your host glibc version (%s) is newer than that in uninative (%s). Disabling uninative so that sstate is not corrupted." % (glibcver, d.getVar("UNINATIVE_MAXGLIBCVERSION")))
93
- 创建目录,解压并且执行
${UNINATIVE_STAGING_DIR}-uninative/relocate_sdk.py
relocate_sdk.py
最后说。
94 ¦ cmd = d.expand("\
95 mkdir -p ${UNINATIVE_STAGING_DIR}-uninative; \
96 cd ${UNINATIVE_STAGING_DIR}-uninative; \
97 tar -xJf ${UNINATIVE_DLDIR}/%s/${UNINATIVE_TARBALL}; \
98 ${UNINATIVE_STAGING_DIR}-uninative/relocate_sdk.py \
99 ${UNINATIVE_STAGING_DIR}-uninative/${BUILD_ARCH}-linux \
100 ${UNINATIVE_LOADER} \
101 ${UNINATIVE_LOADER} \
>>102 ${UNINATIVE_STAGING_DIR}-uninative/${BUILD_ARCH}-linux/${bindir_native}/patchelf-uninative \
>>103 ${UNINATIVE_STAGING_DIR}-uninative/${BUILD_ARCH}-linux${base_libdir_native}/libc*.so*" % chksum)
104 ¦ subprocess.check_output(cmd, shell=True)
- 调用
enable_uninative
uninative_event_enable
- 调用
enable_uninative
enable_uninative
>>131 def enable_uninative(d):
132 loader = d.getVar("UNINATIVE_LOADER")
133 if os.path.exists(loader):
134 ¦ bb.debug(2, "Enabling uninative")
>>135 ¦ d.setVar("NATIVELSBSTRING", "universal%s" % oe.utils.host_gcc_version(d))
136 ¦ d.appendVar("SSTATEPOSTUNPACKFUNCS", " uninative_changeinterp")
>>137 ¦ d.appendVarFlag("SSTATEPOSTUNPACKFUNCS", "vardepvalueexclude", "| uninative_changeinterp")
>>138 ¦ d.appendVar("BUILD_LDFLAGS", " -Wl,--allow-shlib-undefined -Wl,--dynamic-linker=${UNINATIVE_LOADER}")
>>139 ¦ d.appendVarFlag("BUILD_LDFLAGS", "vardepvalueexclude", "| -Wl,--allow-shlib-undefined -Wl,--dynamic-linker=${UNINATIVE_LOADER}")
140 ¦ d.appendVarFlag("BUILD_LDFLAGS", "vardepsexclude", "UNINATIVE_LOADER")
>>141 ¦ d.prependVar("PATH", "${STAGING_DIR}-uninative/${BUILD_ARCH}-linux${bindir_native}:")
- 设置
SSTATEPOSTUNPACKFUNCS = uninative_changeinterp
- 设置
BUILD_LDFLAGS = -Wl,--allow-shlib-undefined -Wl,--dynamic-linker=${UNINATIVE_LOADER}
- 添加$PATH
${STAGING_DIR}-uninative/${BUILD_ARCH}-linux${bindir_native}:
relocate_sdk.py
这个不细看了,大致意思就是将传入的目标 ——${UNINATIVE_STAGING_DIR}-uninative/${BUILD_ARCH}-linux/${bindir_native}/patchelf-uninative \ 和 ${UNINATIVE_STAGING_DIR}-uninative/${BUILD_ARCH}-linux${base_libdir_native}/libc*.so*
的interpreter 和 change ld.so.cache path and default libs path for dynamic loader
。
uninative_changeinterp
${SSTATE_INSTDIR}
目录下的所有文件(除了so、链接或者权限不对),修改其interpreter
。
python uninative_changeinterp () {
144 import subprocess
145 import stat
146 import oe.qa
147
>>148 if not (bb.data.inherits_class('native', d) or bb.data.inherits_class('crosssdk', d) or bb.data.inherits_class('cross', d)):
149 ¦ return
150
151 sstateinst = d.getVar('SSTATE_INSTDIR')
152 for walkroot, dirs, files in os.walk(sstateinst):
153 ¦ for file in files:
154 ¦ ¦ if file.endswith(".so") or ".so." in file:
155 ¦ ¦ ¦ continue
156 ¦ ¦ f = os.path.join(walkroot, file)
157 ¦ ¦ if os.path.islink(f):
158 ¦ ¦ ¦ continue
159 ¦ ¦ s = os.stat(f)
>>160 ¦ ¦ if not ((s[stat.ST_MODE] & stat.S_IXUSR) or (s[stat.ST_MODE] & stat.S_IXGRP) or (s[stat.ST_MODE] & stat.S_IXOTH)):
161 ¦ ¦ ¦ continue
162 ¦ ¦ elf = oe.qa.ELFFile(f)
163 ¦ ¦ try:
164 ¦ ¦ ¦ elf.open()
165 ¦ ¦ except oe.qa.NotELFFileError:
166 ¦ ¦ ¦ continue
167 ¦ ¦ if not elf.isDynamic():
168 ¦ ¦ ¦ continue
169
>>170 ¦ ¦ subprocess.check_output(("patchelf-uninative", "--set-interpreter", d.getVar("UNINATIVE_LOADER"), f), stderr=subprocess.STDOUT)
171 }
总结
目前跟外界发生关系的,只有 SSTATEPOSTUNPACKFUNCS
,沿着这个线索去看。