From: Xiaofeng Yan <[email protected]>

For packaging source codes to source rpm package, adding Sources,\
 Patches and prep stage in spec file.
"Sources" include source codes (type of tar.gz) and \
log files including log.do_patch and log.do_configure (type of tar.gz)
"Patches" include all patches called in bb file.
"prep" is for user viewing the result in the stage of doing patch and 
configuration
for example:
User can use the following command to run the stage of prep.
$rpmbuild -bp package.spec
<show the result of log.do_patch and log.configure>

[YOCTO #1655]

Signed-off-by: Xiaofeng Yan <[email protected]>
---
 meta/classes/package_rpm.bbclass |   65 ++++++++++++++++++++++++++++++++------
 1 files changed, 55 insertions(+), 10 deletions(-)

diff --git a/meta/classes/package_rpm.bbclass b/meta/classes/package_rpm.bbclass
index d03dc3f..3e0ca15 100644
--- a/meta/classes/package_rpm.bbclass
+++ b/meta/classes/package_rpm.bbclass
@@ -6,6 +6,7 @@ RPM="rpm"
 RPMBUILD="rpmbuild"
 
 PKGWRITEDIRRPM = "${WORKDIR}/deploy-rpms"
+PKGWRITEDIRSRPM = "${WORKDIR}/deploy-srpm"
 
 python package_rpm_fn () {
        d.setVar('PKGFN', d.getVar('PKG'))
@@ -422,6 +423,19 @@ python write_specfile () {
        import textwrap
        import oe.packagedata
 
+       def add_prep(spec_files_bottom):
+               bb.build.exec_func('not_srpm', d)
+               if not d.getVar('NOTSRPM', True) and d.getVar('ARCHIVE_TYPE', 
True) == 'SRPM':
+                       spec_files_bottom.append('%%prep -n %s' % 
d.getVar('PN', True) )
+                       spec_files_bottom.append('%s' % "set +x")
+                       spec_files_bottom.append('%s' % "cd $RPM_SOURCE_BUILD")
+                       spec_files_bottom.append('%s' % "tar zxvf 
$RPM_SOURCE_DIR/log.tar.gz")
+                       spec_files_bottom.append('%s' % "echo \"============ do 
patch ==============\"")
+                       spec_files_bottom.append('%s' % "cat log.do_patch*")
+                       spec_files_bottom.append('%s' % "echo \"============ do 
configure ==========\"")
+                       spec_files_bottom.append('%s' % "cat log.do_configure*")
+                       spec_files_bottom.append('')
+
        # We need a simple way to remove the MLPREFIX from the package name,
        # and dependency information...
        def strip_multilib(name, d):
@@ -533,6 +547,13 @@ python write_specfile () {
        srcmaintainer  = d.getVar('MAINTAINER', True)
        srchomepage    = d.getVar('HOMEPAGE', True)
        srcdescription = d.getVar('DESCRIPTION', True) or "."
+       
+       bb.build.exec_func('not_srpm', d)
+       if not d.getVar('NOTSRPM', True) and d.getVar('ARCHIVE_TYPE', True) == 
'SRPM':
+               tpkg_name = d.getVar('PF',True)
+               srctargz  = tpkg_name + ".tar.gz"
+               logtargz = "log.tar.gz"
+
 
        srcdepends     = strip_multilib(d.getVar('DEPENDS', True), d)
        srcrdepends    = []
@@ -557,6 +578,11 @@ python write_specfile () {
        spec_files_top = []
        spec_files_bottom = []
 
+       if not d.getVar('NOTSRPM', True) and d.getVar('ARCHIVE_TYPE', True) == 
'SRPM':
+               srcpatches = [] 
+               bb.build.exec_func('get_patches', d)
+               srcpatches = d.getVar('PLIST',True)
+       
        for pkg in packages.split():
                localdata = bb.data.createCopy(d)
 
@@ -637,7 +663,7 @@ python write_specfile () {
                                else:
                                        bb.note("Creating EMPTY RPM Package for 
%s" % splitname)
                                spec_files_top.append('')
-
+                               
                        bb.utils.unlockfile(lf)
                        continue
 
@@ -714,7 +740,7 @@ python write_specfile () {
                        spec_scriptlets_bottom.append('# %s - %s' % (splitname, 
script))
                        spec_scriptlets_bottom.append(scriptvar)
                        spec_scriptlets_bottom.append('')
-
+               
                # Now process files
                file_list = []
                walk_files(root, file_list, conffiles)
@@ -732,7 +758,8 @@ python write_specfile () {
 
                del localdata
                bb.utils.unlockfile(lf)
-
+       
+       add_prep(spec_files_bottom)
        spec_preamble_top.append('Summary: %s' % srcsummary)
        spec_preamble_top.append('Name: %s' % srcname)
        spec_preamble_top.append('Version: %s' % srcversion)
@@ -743,6 +770,11 @@ python write_specfile () {
        spec_preamble_top.append('Group: %s' % srcsection)
        spec_preamble_top.append('Packager: %s' % srcmaintainer)
        spec_preamble_top.append('URL: %s' % srchomepage)
+       
+       if not d.getVar('NOTSRPM', True) and d.getVar('ARCHIVE_TYPE', True) == 
'SRPM':
+               spec_preamble_top.append('Source: %s' % srctargz)
+               spec_preamble_top.append('Source1: %s' % logtargz)
+
 
        # Replaces == Obsoletes && Provides
        if srcrreplaces and srcrreplaces.strip() != "":
@@ -764,6 +796,11 @@ python write_specfile () {
        print_deps(srcrsuggests,        "Recommends", spec_preamble_top, d)
        print_deps(srcrprovides,        "Provides", spec_preamble_top, d)
        print_deps(srcrobsoletes,       "Obsoletes", spec_preamble_top, d)
+       if not d.getVar('NOTSRPM', True) and d.getVar('ARCHIVE_TYPE', True) == 
'SRPM':
+               numid = 1
+               for patch in srcpatches:
+                       print_deps(patch, "Patch" + str(numid), 
spec_preamble_top, d)
+                       numid += 1
 
        # conflicts can not be in a provide!  We will need to filter it.
        if srcrconflicts:
@@ -817,12 +854,6 @@ python write_specfile () {
        except OSError:
                raise bb.build.FuncFailed("unable to open spec file for 
writing.")
 
-       # RPMSPEC_PREAMBLE is a way to add arbitrary text to the top
-       # of the generated spec file
-       external_preamble = d.getVar("RPMSPEC_PREAMBLE", True)
-       if external_preamble:
-               specfile.write(external_preamble + "\n")
-
        for line in spec_preamble_top:
                specfile.write(line + "\n")
 
@@ -947,9 +978,14 @@ python do_package_rpm () {
                d.setVar('PACKAGE_ARCH_EXTEND', package_arch)
        pkgwritedir = 
bb.data.expand('${PKGWRITEDIRRPM}/${PACKAGE_ARCH_EXTEND}', d)
        pkgarch = 
bb.data.expand('${PACKAGE_ARCH_EXTEND}${TARGET_VENDOR}-${TARGET_OS}', d)
-       magicfile = 
bb.data.expand('${STAGING_DIR_NATIVE}${datadir_native}/misc/magic.mgc', d)
+       magicfile = 
bb.data.expand('${STAGING_DIR_NATIVE}/usr/share/misc/magic.mgc', d)
        bb.mkdirhier(pkgwritedir)
        os.chmod(pkgwritedir, 0755)
+       if not d.getVar('NOTSRPM', True) and d.getVar('ARCHIVE_TYPE', True):
+               pkgwritesrpmdir = 
bb.data.expand('${PKGWRITEDIRSRPM}/${PACKAGE_ARCH_EXTEND}', d)
+               bb.mkdirhier(pkgwritesrpmdir)
+               os.chmod(pkgwritesrpmdir, 0755)
+       
 
        cmd = rpmbuild
        cmd = cmd + " --nodeps --short-circuit --target " + pkgarch + " 
--buildroot " + pkgd
@@ -962,8 +998,17 @@ python do_package_rpm () {
        cmd = cmd + " --define 'debug_package %{nil}'"
        cmd = cmd + " --define '_rpmfc_magic_path " + magicfile + "'"
        cmd = cmd + " --define '_tmppath " + workdir + "'"
+       if not d.getVar('NOTSRPM', True) and d.getVar('ARCHIVE_TYPE', True) == 
'SRPM':
+               cmdsrpm = cmd + " --define '_sourcedir " + workdir + "' 
--define '_srcrpmdir " + pkgwritesrpmdir + "'"
+               cmdsrpm = cmdsrpm + " -bs " + outspecfile
        cmd = cmd + " -bb " + outspecfile
 
+       # Build the source rpm package !
+       if not d.getVar('NOTSRPM', True) and d.getVar('ARCHIVE_TYPE', True) == 
'SRPM':
+               d.setVar('SBUILDSPEC', cmdsrpm + "\n")
+               d.setVarFlag('SBUILDSPEC', 'func', '1')
+               bb.build.exec_func('SBUILDSPEC', d)
+
        # Build the rpm package!
        d.setVar('BUILDSPEC', cmd + "\n")
        d.setVarFlag('BUILDSPEC', 'func', '1')
-- 
1.7.7


_______________________________________________
Openembedded-core mailing list
[email protected]
http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core

Reply via email to