diff options
author | Chase Maupin <chase.maupin@ti.com> | 2010-06-28 08:06:49 -0500 |
---|---|---|
committer | Koen Kooi <koen@openembedded.org> | 2010-07-07 17:15:42 +0200 |
commit | 536d98010a084ece302efdfafcbc1de4ac85a2f6 (patch) | |
tree | 5f048631f974d6f82c9f370fa1644b982697b32f /classes | |
parent | 3c4955f19ab66503bb321f959ec6756fa2bdbe28 (diff) |
sourceipk: add class to create source ipks
* Created the sourceipk.bbclass class that can be used to
package the patched sources and recipe for an application
into an ipk for installation.
* Allows specification of the installation directory for the
sources using the SRCIPK_INSTALL_DIR variable.
* Can be enabled per package and controlled through the
CREATE_SRCIPK variable.
* Creates a README file in the sources directory that
explains the contents of the package.
* User can specify the package architecture for the source ipk
using the SRCIPK_PACKAGE_ARCH variable. The default value is
"all".
* Using the -L flag to the cp command to copy files pointed to by
symlinks and not the symlinks themselves.
* Adds source package to list of dynamic packages.
Signed-off-by: Chase Maupin <chase.maupin@ti.com>
Signed-off-by: Koen Kooi <k-kooi@ti.com>
Diffstat (limited to 'classes')
-rw-r--r-- | classes/sourceipk.bbclass | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/classes/sourceipk.bbclass b/classes/sourceipk.bbclass new file mode 100644 index 0000000000..5318a2ce8c --- /dev/null +++ b/classes/sourceipk.bbclass @@ -0,0 +1,130 @@ +# sourceipk.bbclass enables the creation of an ipk file that contains the +# sources used during the build. The sources contained in the ipk are the +# patched sources before configuration has been done. +# +# This class is used to provide an easy method to ship the corresponding +# sources for a package to end users so that they can install them on their +# host or target systems. +# +# This package uses the following variables to control its operations: +# - CREATE_SRCIPK = When set to 1 this variable indicates that +# a source ipk should be generated for the package. +# - SRCIPK_INSTALL_DIR = This variable indicates the directory to install +# the sources into. +# - SRCIPK_PACKAGE_ARCH = This variable allows specific recipies to +# specify an architecture for the sourcetree +# package is "all" is not appropriate +# +# The default installation directory for the sources is: +# /usr/src/${PN}-src +# +# By setting the SRCIPK_INSTALL_DIR this default can be changed to any +# location desired. When combined with the opkg -o option this allows for the +# system building to specify a relative package install location to the +# install root given to opkg. Each source ipk can have a different directory. +# +# Creation of the source ipk can be controlled per package by setting +# CREATE_SRCIPK = "1" in the package recipe or by setting +# CREATE_SRCIPK_pn-<package name> = "1" in your local.conf +# +#TODO: +# Need to figure out how to use ipkg-build in this class. +# I tried adding it as a dependency for the do_create_srcipk +# task using: +# do_create_srcipk[depends] += "ipkg-utils-native:do_populate_sysroot" +# But then there is a circular dependency between sourcipk.bbclass and +# ipkg-utils-native. Until I can figure out how to resolve this +# circular dependency I am extracting the needed pieces from ipkg-build +# into this class and building the source ipk myself. + + +# Default is to not create the source ipk +CREATE_SRCIPK ?= "0" + +# Default installation prefix +SRCIPK_INSTALL_DIR ?= "/usr/src/${PN}-src" + +# Default PACKAGE_ARCH for sources is "all" +SRCIPK_PACKAGE_ARCH ?= "all" + +# Create a README file that describes the contents of the source ipk +sourceipk_create_readme() { + readme="$1/README.${PN}-src" + touch $readme + echo 'This package contains the patched sources for ${PN} that' >> $readme + echo 'were used to generate the ${PN} binary ipk package(s).' >> $readme + echo 'This package does not build or generate the binaries' >> $readme + echo 'directly. To build the binaries you must either' >> $readme + echo 'configure and build the sources yourself or use:' >> $readme + echo ' bitbake ${PN}' >> $readme + echo '' >> $readme + echo 'NOTE: The patches applied to the sources can be found in' >> $readme + echo " the \"patches\" directory" >> $readme +} + +# Create the source ipk file. The ipk is manually created here instead +# of using the normal ipk system because some recipes will over write +# the PACKAGES variable. Thus if this class added a -src package +# to the list of packages to be created that package would be lost. +# See the linux kernel recipe for an example of this issue. +sourceipk_do_create_srcipk() { + if [ ${CREATE_SRCIPK} != "0" ] + then + tmp_dir="${WORKDIR}/sourceipk-tmp" + srcipk_dir="${WORKDIR}/sourceipk-data" + mkdir -p $tmp_dir/CONTROL + mkdir -p $srcipk_dir + control_file="$tmp_dir/CONTROL/control" + + # Write the control file + echo "Package: ${PN}-src" > $control_file + echo "Version: ${PV}-${PR}" >> $control_file + echo "Description: Patched sources for ${PN}" >> $control_file + echo "Section: ${SECTION}" >> $control_file + echo "Priority: Optional" >> $control_file + echo "Maintainer: ${MAINTAINER}" >> $control_file + echo "Architecture: ${SRCIPK_PACKAGE_ARCH}" >> $control_file + srcuri="${SRC_URI}" + if [ "$srcuri" == "" ] + then + srcuri="OpenEmbedded" + fi + echo "Source: $srcuri" >> $control_file + + #Write the control tarball + tar -C $tmp_dir/CONTROL --owner=0 --group=0 -czf $srcipk_dir/control.tar.gz . + + # Get rid of temporary control file + rm -rf $tmp_dir/CONTROL + + # Copy sources for packaging + mkdir -p $tmp_dir/${SRCIPK_INSTALL_DIR} + cp -rLf ${S}/* $tmp_dir/${SRCIPK_INSTALL_DIR}/ + sourceipk_create_readme $tmp_dir/${SRCIPK_INSTALL_DIR}/ + cp ${FILE} $tmp_dir/${SRCIPK_INSTALL_DIR}/ + + #Write the data tarball + tar -C $tmp_dir --owner=0 --group=0 -czf $srcipk_dir/data.tar.gz . + + # Create the debian-binary file + echo "2.0" > $srcipk_dir/debian-binary + + #Write the ipk file + mkdir -p ${DEPLOY_DIR_IPK}/${SRCIPK_PACKAGE_ARCH} + pkg_file=${DEPLOY_DIR_IPK}/${SRCIPK_PACKAGE_ARCH}/${PN}-src_${PV}-${PR}_${SRCIPK_PACKAGE_ARCH}.ipk + rm -f $pkg_file + tar -C $srcipk_dir -czf $pkg_file . + + # Remove the temporary directory + rm -rf $tmp_dir + fi +} + +EXPORT_FUNCTIONS do_create_srcipk + +do_create_srcipk[deptask] = "do_patch" + +addtask create_srcipk after do_patch before do_configure + +#Add source packages to list of packages OE knows about +PACKAGES_DYNAMIC += "${PN}-src" |