Patchworkβ [oe] interest in binary packaging?

login
register
about
Submitter Chris Conroy
Date 2009-09-17 22:20:07
Message ID <1253226007.1495.264.camel@conroy-linux>
Download mbox | patch
Permalink /patch/1067/
State New
Headers show

Comments

Chris Conroy - 2009-09-17 22:20:07
I've developed a rather simplistic method for managing "binary" packages
within OE in order to satisfy certain licensing requirements. I am not
sure whether other users would have an interest in such a system, but
I'll go ahead and pitch what I have working so far to see if there is
any interest in improving it further or merging upstream.

Problem: Some packages we maintain internally are proprietary, and we
need mechanisms for dealing with different licensing schemes.

Approach: Allow third parties to build images using the packages but
without seeing source.

Solution: binary_ipk.bbclass defines a type of package which simply
installs a prebuilt .ipk for use in an image. 

Also, for ease of deployment, I've added a flag to the standard
package_ipk.bbclass which will copy relevant packages into the WORKDIR
for a 'binreleasable' package.

The result is a developer with access to the code builds package FOO out
of the overlay and deploys the WORKDIR/binrelease .ipks onto a mirror.

Another developer without access to the code uses the FOO-bin recipe
which inherits the binary_ipk.bbclass. It pulls the ipk from the mirror
and tells OE about any runtime dependencies of the package.

A simple binary recipe looks like this (I'll just put it inline since
it's so short)

####################EXAMPLE FOO BINARY RECIPE
inherit binary_ipk

DESCRIPTION = "FOO"
HOMEPAGE = ""
LICENSE = "FOO License"
RPROVIDES += "foo"
RDEPENDS += "bar"
BIN_PR = "r21"

SRC_URI = "${FOO_MIRROR}/foo-bin/foo_${PV}-${BIN_PR}_
${PACKAGE_ARCH}.ipk"
############END EXAMPLE


Perhaps there is a smarter way to do this with ipkg feeds, but I saw no
clear route to get here using them.

Thoughts, comments, questions, patches, etc... are all welcomed.



--Chris Conroy
Tom Rini - 2009-09-24 19:52:03
On Thu, Sep 17, 2009 at 06:20:07PM -0400, Chris Conroy wrote:

> I've developed a rather simplistic method for managing "binary" packages
> within OE in order to satisfy certain licensing requirements. I am not
> sure whether other users would have an interest in such a system, but
> I'll go ahead and pitch what I have working so far to see if there is
> any interest in improving it further or merging upstream.

Yes, there is interest.  The only issue I see off the top of my head is
that this doesn't work for deb / rpm / tar, when it could.  The way I've
solved this before is to have the binary version just be a tarball of
the do_install() from the source version,  Then -dbg/-dev/whatever gets
split up normally and other output formats work fine too.

Patch

diff --git a/classes/binary_ipk.bbclass b/classes/binary_ipk.bbclass

new file mode 100644
index 0000000..8cb1eb3

--- /dev/null

+++ b/classes/binary_ipk.bbclass

@@ -0,0 +1,56 @@ 

+### A class for installing prebuilt packages

+

+inherit package_ipk

+

+PACKAGES="${PN}"

+

+do_configure() {

+    :

+}

+do_compile() {

+    :

+}

+do_stage() {

+    :

+}

+do_install() {

+    :

+}

+do_populate_staging() {

+    :

+}

+do_install() {

+    :

+}

+

+python do_package_ipk() {

+    import sys, bb, os, re, glob

+

+    outdir = bb.data.getVar('DEPLOY_DIR_IPK', d, 1)

+    if not outdir:

+        bb.error("DEPLOY_DIR_IPK not defined, unable to package")

+        return

+

+    tmpdir = bb.data.getVar('TMPDIR', d, 1)

+    if os.access(os.path.join(tmpdir, "stamps", "IPK_PACKAGE_INDEX_CLEAN"), os.R_OK):

+        os.unlink(os.path.join(tmpdir, "stamps", "IPK_PACKAGE_INDEX_CLEAN"))

+

+

+    path = bb.data.getVar('PATH', d, 1)

+    workdir = bb.data.getVar('WORKDIR', d, 1)

+    packages = glob.glob("%s/*.ipk" % (workdir))

+

+    for pkg in packages:

+        ipkgPipe = os.popen("PATH=%s ipkg-list-fields %s | grep \"Architecture\" | cut -d \' \' -sf2" % (path, pkg))

+        arch = ipkgPipe.readline()

+        bb.debug(1, "PKG %s, ARCH %s" % (pkg, arch))

+        ipkgPipe.close()

+        if arch == '' or arch == None:

+            bb.fatal("Unable to read architecture from %s" % (pkg))

+

+        pkgoutdir = "%s/%s" % (outdir, arch)

+

+        bb.note("Installing %s into %s" % (pkg, pkgoutdir))

+        os.system("cp %s %s" % (pkg, pkgoutdir))

+}

+

diff --git a/classes/package_ipk.bbclass b/classes/package_ipk.bbclass

index e556108..853da21 100644

--- a/classes/package_ipk.bbclass

+++ b/classes/package_ipk.bbclass

@@ -302,6 +302,21 @@  python do_package_ipk () {

 			bb.utils.unlockfile(lf)
 			raise bb.build.FuncFailed("ipkg-build execution failed")
 
+		#for binary packaging, a release package will also install into its WORKDIR

+		binrelease = bb.data.getVar("BINRELEASE", d, 1)

+		if binrelease == '1':

+			bindir = "%s/binrelease" % (workdir)

+			bb.mkdirhier(bindir)

+			ret = os.system("PATH=\"%s\" %s %s %s" % (bb.data.getVar("PATH", localdata, 1), bb.data.getVar("IPKGBUILDCMD",d,1), pkg, bindir))

+

+			#Don't binrelease dbg/dev/doc packages

+			todelPkgs = glob("%s/*-dbg*.ipk" % (bindir))

+			todelPkgs.extend(glob("%s/*-dev*.ipk" % (bindir)))

+			todelPkgs.extend(glob("%s/*-doc*.ipk" % (bindir)))

+			for todel in todelPkgs:

+				bb.debug(1, "Uninstalling %s for binrelease" % (todel))

+				os.system("rm -f %s" % (todel))

+

 		bb.utils.prunedir(controldir)
 		bb.utils.unlockfile(lf)
 }