diff options
| -rw-r--r-- | meta/classes/uninative.bbclass | 95 | 
1 files changed, 55 insertions, 40 deletions
diff --git a/meta/classes/uninative.bbclass b/meta/classes/uninative.bbclass index 9a5717020c..8902518a1d 100644 --- a/meta/classes/uninative.bbclass +++ b/meta/classes/uninative.bbclass  | |||
| @@ -7,19 +7,30 @@ UNINATIVE_TARBALL ?= "${BUILD_ARCH}-nativesdk-libc.tar.bz2" | |||
| 7 | #UNINATIVE_CHECKSUM[x86_64] = "dead" | 7 | #UNINATIVE_CHECKSUM[x86_64] = "dead" | 
| 8 | UNINATIVE_DLDIR ?= "${COREBASE}" | 8 | UNINATIVE_DLDIR ?= "${COREBASE}" | 
| 9 | 9 | ||
| 10 | addhandler uninative_eventhandler | 10 | addhandler uninative_event_fetchloader | 
| 11 | uninative_eventhandler[eventmask] = "bb.event.BuildStarted" | 11 | uninative_event_fetchloader[eventmask] = "bb.event.BuildStarted" | 
| 12 | 12 | ||
| 13 | python uninative_eventhandler() { | 13 | addhandler uninative_event_enable | 
| 14 | enabled = True | 14 | uninative_event_enable[eventmask] = "bb.event.ConfigParsed" | 
| 15 | |||
| 16 | python uninative_event_fetchloader() { | ||
| 17 | """ | ||
| 18 | This event fires on the parent and will try to fetch the tarball if the | ||
| 19 | loader isn't already present. | ||
| 20 | """ | ||
| 15 | 21 | ||
| 16 | loader = d.getVar("UNINATIVE_LOADER", True) | 22 | loader = d.getVar("UNINATIVE_LOADER", True) | 
| 17 | tarball = d.getVar("UNINATIVE_TARBALL", True) | 23 | if os.path.exists(loader): | 
| 18 | tarballdir = d.getVar("UNINATIVE_DLDIR", True) | 24 | return | 
| 19 | tarballpath = os.path.join(tarballdir, tarball) | 25 | |
| 26 | try: | ||
| 27 | # Save and restore cwd as Fetch.download() does a chdir() | ||
| 28 | olddir = os.getcwd() | ||
| 29 | |||
| 30 | tarball = d.getVar("UNINATIVE_TARBALL", True) | ||
| 31 | tarballdir = d.getVar("UNINATIVE_DLDIR", True) | ||
| 32 | tarballpath = os.path.join(tarballdir, tarball) | ||
| 20 | 33 | ||
| 21 | if not os.path.exists(loader): | ||
| 22 | # If the tarball doesn't exist, try to fetch it. | ||
| 23 | if not os.path.exists(tarballpath): | 34 | if not os.path.exists(tarballpath): | 
| 24 | if d.getVar("UNINATIVE_URL", True) == "unset": | 35 | if d.getVar("UNINATIVE_URL", True) == "unset": | 
| 25 | bb.fatal("Uninative selected but not configured, please set UNINATIVE_URL") | 36 | bb.fatal("Uninative selected but not configured, please set UNINATIVE_URL") | 
| @@ -28,46 +39,50 @@ python uninative_eventhandler() { | |||
| 28 | if not chksum: | 39 | if not chksum: | 
| 29 | bb.fatal("Uninative selected but not configured correctly, please set UNINATIVE_CHECKSUM[%s]" % d.getVar("BUILD_ARCH", True)) | 40 | bb.fatal("Uninative selected but not configured correctly, please set UNINATIVE_CHECKSUM[%s]" % d.getVar("BUILD_ARCH", True)) | 
| 30 | 41 | ||
| 31 | try: | ||
| 32 | # Save and restore cwd as Fetch.download() does a chdir() | ||
| 33 | olddir = os.getcwd() | ||
| 34 | 42 | ||
| 35 | localdata = bb.data.createCopy(d) | 43 | localdata = bb.data.createCopy(d) | 
| 36 | localdata.setVar('FILESPATH', "") | 44 | localdata.setVar('FILESPATH', "") | 
| 37 | localdata.setVar('DL_DIR', tarballdir) | 45 | localdata.setVar('DL_DIR', tarballdir) | 
| 38 | 46 | ||
| 39 | srcuri = d.expand("${UNINATIVE_URL}${UNINATIVE_TARBALL};md5sum=%s" % chksum) | 47 | srcuri = d.expand("${UNINATIVE_URL}${UNINATIVE_TARBALL};md5sum=%s" % chksum) | 
| 40 | bb.note("Fetching uninative binary shim from %s" % srcuri) | 48 | bb.note("Fetching uninative binary shim from %s" % srcuri) | 
| 41 | 49 | ||
| 42 | fetcher = bb.fetch2.Fetch([srcuri], localdata, cache=False) | 50 | fetcher = bb.fetch2.Fetch([srcuri], localdata, cache=False) | 
| 43 | fetcher.download() | 51 | fetcher.download() | 
| 44 | localpath = fetcher.localpath(srcuri) | 52 | localpath = fetcher.localpath(srcuri) | 
| 45 | if localpath != tarballpath and os.path.exists(localpath) and not os.path.exists(tarballpath): | 53 | if localpath != tarballpath and os.path.exists(localpath) and not os.path.exists(tarballpath): | 
| 46 | os.symlink(localpath, tarballpath) | 54 | os.symlink(localpath, tarballpath) | 
| 47 | except Exception as exc: | ||
| 48 | bb.warn("Unable to download uninative tarball: %s" % str(exc)) | ||
| 49 | enabled = False | ||
| 50 | finally: | ||
| 51 | os.chdir(olddir) | ||
| 52 | |||
| 53 | # If we're still enabled then the fetch didn't fail, so unpack the tarball | ||
| 54 | if enabled: | ||
| 55 | import subprocess | ||
| 56 | try: | ||
| 57 | cmd = d.expand("mkdir -p ${STAGING_DIR}-uninative; cd ${STAGING_DIR}-uninative; tar -xjf ${UNINATIVE_DLDIR}/${UNINATIVE_TARBALL}; ${STAGING_DIR}-uninative/relocate_sdk.py ${STAGING_DIR}-uninative/${BUILD_ARCH}-linux ${UNINATIVE_LOADER} ${UNINATIVE_LOADER} ${STAGING_DIR}-uninative/${BUILD_ARCH}-linux/${bindir_native}/patchelf-uninative") | ||
| 58 | subprocess.check_call(cmd, shell=True) | ||
| 59 | except subprocess.CalledProcessError as exc: | ||
| 60 | bb.warn("Unable to install uninative tarball: %s" % str(exc)) | ||
| 61 | enabled = False | ||
| 62 | 55 | ||
| 63 | if enabled: | 56 | import subprocess | 
| 57 | cmd = d.expand("mkdir -p ${STAGING_DIR}-uninative; cd ${STAGING_DIR}-uninative; tar -xjf ${UNINATIVE_DLDIR}/${UNINATIVE_TARBALL}; ${STAGING_DIR}-uninative/relocate_sdk.py ${STAGING_DIR}-uninative/${BUILD_ARCH}-linux ${UNINATIVE_LOADER} ${UNINATIVE_LOADER} ${STAGING_DIR}-uninative/${BUILD_ARCH}-linux/${bindir_native}/patchelf-uninative") | ||
| 58 | subprocess.check_call(cmd, shell=True) | ||
| 59 | |||
| 60 | d.setVar("NATIVELSBSTRING", "universal") | ||
| 61 | d.appendVar("SSTATEPOSTUNPACKFUNCS", " uninative_changeinterp") | ||
| 62 | d.prependVar("PATH", "${STAGING_DIR}-uninative/${BUILD_ARCH}-linux${bindir_native}:") | ||
| 63 | |||
| 64 | except bb.fetch2.BBFetchException as exc: | ||
| 65 | bb.warn("Disabling uninative as unable to fetch uninative tarball: %s" % str(exc)) | ||
| 66 | bb.warn("To build your own uninative loader, please bitbake uninative-tarball and set UNINATIVE_TARBALL appropriately.") | ||
| 67 | except subprocess.CalledProcessError as exc: | ||
| 68 | bb.warn("Disabling uninative as unable to install uninative tarball: %s" % str(exc)) | ||
| 69 | bb.warn("To build your own uninative loader, please bitbake uninative-tarball and set UNINATIVE_TARBALL appropriately.") | ||
| 70 | finally: | ||
| 71 | os.chdir(olddir) | ||
| 72 | } | ||
| 73 | |||
| 74 | python uninative_event_enable() { | ||
| 75 | """ | ||
| 76 | This event handler is called in the workers and is responsible for setting | ||
| 77 | up uninative if a loader is found. | ||
| 78 | """ | ||
| 79 | |||
| 80 | loader = d.getVar("UNINATIVE_LOADER", True) | ||
| 81 | if os.path.exists(loader): | ||
| 64 | bb.debug(2, "Enabling uninative") | 82 | bb.debug(2, "Enabling uninative") | 
| 65 | d.setVar("NATIVELSBSTRING", "universal") | 83 | d.setVar("NATIVELSBSTRING", "universal") | 
| 66 | d.appendVar("SSTATEPOSTUNPACKFUNCS", " uninative_changeinterp") | 84 | d.appendVar("SSTATEPOSTUNPACKFUNCS", " uninative_changeinterp") | 
| 67 | d.prependVar("PATH", "${STAGING_DIR}-uninative/${BUILD_ARCH}-linux${bindir_native}:") | 85 | d.prependVar("PATH", "${STAGING_DIR}-uninative/${BUILD_ARCH}-linux${bindir_native}:") | 
| 68 | else: | ||
| 69 | bb.warn("Uninative selected but the loader isn't present and can't be downloaded. Disabling uninative.\n" | ||
| 70 | "To build your own uninative loader, please bitbake uninative-tarball and set UNINATIVE_TARBALL appropriately.") | ||
| 71 | } | 86 | } | 
| 72 | 87 | ||
| 73 | python uninative_changeinterp () { | 88 | python uninative_changeinterp () { | 
