From 50ffb99417c768a9f5286bb69b37b9b7b57baa4f Mon Sep 17 00:00:00 2001 From: Joshua Lock Date: Fri, 29 Jan 2010 12:27:30 +0000 Subject: [PATCH] packaged-staging: basic support for pulling staging packages from a mirror Add simple support for trying to fetch staging packages from a http, https or ftp mirror if they do not already exist in PSTAGE_DIR. As documented in local.conf.sample "Poky can try and fetch packaged-staging packages from a http, https or ftp mirror. Set this variable to the root of a pstage directory on a server." If the PSTAGE_MIRROR variable is not set, or the package cannot be found on the mirror it will be built as usual. Signed-off-by: Joshua Lock --- build/conf/local.conf.sample | 4 ++++ meta/classes/packaged-staging.bbclass | 27 ++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/build/conf/local.conf.sample b/build/conf/local.conf.sample index 149c73d664..14af548efd 100644 --- a/build/conf/local.conf.sample +++ b/build/conf/local.conf.sample @@ -159,3 +159,7 @@ ENABLE_BINARY_LOCALE_GENERATION = "1" # on an x86_64 host. # Supported values are i586 and x86_64 #SDKMACHINE="i586" + +# Poky can try and fetch packaged-staging packages from a http, https or ftp +# mirror. Set this variable to the root of a pstage directory on a server. +#PSTAGE_MIRROR ?= "http://someserver.tld/share/pstage" diff --git a/meta/classes/packaged-staging.bbclass b/meta/classes/packaged-staging.bbclass index 74855c4ab3..4789ecc3b1 100644 --- a/meta/classes/packaged-staging.bbclass +++ b/meta/classes/packaged-staging.bbclass @@ -135,7 +135,9 @@ do_clean_prepend() { stagepkg = bb.data.expand("${PSTAGE_PKG}", d) bb.note("Removing staging package %s" % stagepkg) - os.system('rm -rf ' + stagepkg) + # Add a wildcard to the end of stagepkg to also get its md5 + # if it's a fetched package + os.system('rm -rf ' + stagepkg + '*') } staging_helper () { @@ -159,6 +161,27 @@ staging_helper () { fi } +def staging_fetch(stagepkg, d): + import bb.fetch + + # only try and fetch if the user has configured a mirror + if bb.data.getVar('PSTAGE_MIRROR', d) != "": + # Copy the data object and override DL_DIR and SRC_URI + pd = d.createCopy() + dldir = bb.data.expand("${PSTAGE_DIR}/${PSTAGE_PKGPATH}", pd) + mirror = bb.data.expand("${PSTAGE_MIRROR}/${PSTAGE_PKGPATH}/", pd) + srcuri = mirror + os.path.basename(stagepkg) + bb.data.setVar('DL_DIR', dldir, pd) + bb.data.setVar('SRC_URI', srcuri, pd) + + # Try a fetch from the pstage mirror, if it fails just return and + # we will build the package + try: + bb.fetch.init([srcuri], pd) + bb.fetch.go(pd, [srcuri]) + except: + return + PSTAGE_TASKS_COVERED = "fetch unpack munge patch configure qa_configure rig_locales compile sizecheck install deploy package populate_sysroot package_write_deb package_write_ipk package_write package_stage qa_staging" SCENEFUNCS += "packagestage_scenefunc" @@ -174,6 +197,8 @@ python packagestage_scenefunc () { pstage_cleanpackage(removepkg, d) stagepkg = bb.data.expand("${PSTAGE_PKG}", d) + if not os.path.exists(stagepkg): + staging_fetch(stagepkg, d) if os.path.exists(stagepkg): path = bb.data.getVar("PATH", d, 1)