Comments
Patch
new file mode 100644
@@ -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))
+}
+
@@ -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)
}
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