All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] Add function to package source codes tree to source rpm and tar packages
@ 2012-01-08  7:11 Xiaofeng Yan
  2012-01-08  7:11 ` [PATCH 1/2] package_rpm.bbclass: add srpm function in spec file Xiaofeng Yan
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Xiaofeng Yan @ 2012-01-08  7:11 UTC (permalink / raw)
  To: openembedded-core, mark.hatle

From: Xiaofeng Yan <xiaofeng.yan@windriver.com>

Add file "tar_archive.bbclass" and modify file "package_rpm.bbclass" for packaging source codes tree to source rpm and tar packages.
After adding srpm function in file "package_rpm.bbclass", user can get source rpm packages beside rpm package.
User also get tar packages of source codes tree according to the requirement from bug 1655. The final result is as follow:
Take qemux86 for an example:
Get source rpm pakcages
1 Inherit tar_archive.bbclass in package_rpm.bbclass.
2 Select the type of packaging source code tree in conf/local.conf(ARCHIVE_TYPE ?= "SRPM")
3 Run the following command 
  $ bitbake core-image-sato -c copysources
4 Get source rpm packages:
  $ tree build/tmp/deploy/sources
  build/tmp/deploy/sources/
  └── qemux86
    ├── all-poky-linux
    │   ├── encodings-1.0.4-r2.1.src.rpm
        ......
    ├── i586-poky-linux
    │   ├── acl-2.2.51-r2.src.rpm
        ......
    └── qemux86-poky-linux
        ├── base-files-3.0.14-r70.src.rpm
        ......
Get tar packages:
1 Inherit tar_archive.bbclass in an suitable position (for example, package_rpm.bbclass).
2 Select the type of packaging source code tree in conf/local.conf(ARCHIVE_TYPE ?= "TARGZ")
3 Run the following command 
  $ bitbake core-image-sato -c copysources
4 Get tar packages: 
  $ tree build/tmp/deploy/sources
  buildx86/tmp/deploy/sources
  └── qemux86
    ├── all-poky-linux
    │   ├── encodings-1_1.0.4-r2.1
    │   │   ├── encodings-1_1.0.4-r2.1.tar.gz
    │   │   └── log.tar.gz
            ......
    ├── i586-poky-linux
    │   ├── acl-2.2.51-r2
    │   │   ├── acl-2.2.51-r2.tar.gz
            └── log.tar.gz
            ......
    └── qemux86-poky-linux
        ├── core-image-sato-1.0-r0
        ├── libzypp-0.0-git1+15b6c52260bbc52b3d8e585e271b67e10cc7c433-r17
        │   ├── libzypp-0.0-git1+15b6c52260bbc52b3d8e585e271b67e10cc7c433-r17.tar.gz
        │   └── log.tar.gz
            ......

if inheriting tar_archive.bbclass in one bb file, then only package source codes tree of this file.
Take zlib for an example:
Get source rpm pakcage of zlib
1 Inherit tar_archive.bbclass in zlib_1.2.5.bb.
2 Select the type of packaging source code tree in conf/local.conf(ARCHIVE_TYPE ?= "SRPM")
3 Run the following command 
  $ bitbake zlib
4 Get source rpm package:
  $ ls build/tmp/work/i586-poky-linux/zlib-1.2.5-r3/deploy-srpm/i586/
    zlib-1.2.5-r3.src.rpm


Get tar package of zlib
1 Inherit tar_archive.bbclass in zlib_1.2.5.bb.
2 Select the type of packaging source code tree in conf/local.conf(ARCHIVE_TYPE ?= "TARGZ")
3 Run the following command 
  $ bitbake zlib 
4 Get tar package:
  $ ls build/tmp/work/i586-poky-linux/zlib-1.2.5-r3/
    zlib-1.2.5-r3.tar.gz log.tar.gz ......


Pull URL: git://git.pokylinux.org/poky-contrib.git
  Branch: xiaofeng/1655
  Browse: http://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=xiaofeng/1655

Thanks,
    Xiaofeng Yan <xiaofeng.yan@windriver.com>
---


Xiaofeng Yan (2):
  package_rpm.bbclass: add srpm function in spec file
  tar_archive.bbclass: Package source codes and log files to tar
    package

 meta/classes/package_rpm.bbclass |   65 ++++++++++--
 meta/classes/tar_archive.bbclass |  216 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 271 insertions(+), 10 deletions(-)
 create mode 100644 meta/classes/tar_archive.bbclass

-- 
1.7.7




^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 1/2] package_rpm.bbclass: add srpm function in spec file
  2012-01-08  7:11 [PATCH 0/2] Add function to package source codes tree to source rpm and tar packages Xiaofeng Yan
@ 2012-01-08  7:11 ` Xiaofeng Yan
  2012-01-09 16:17   ` Mark Hatle
  2012-01-08  7:11 ` [PATCH 2/2] tar_archive.bbclass: Package source codes and log files to tar package Xiaofeng Yan
  2012-01-12 20:04 ` [PATCH 0/2] Add function to package source codes tree to source rpm and tar packages Saul Wold
  2 siblings, 1 reply; 8+ messages in thread
From: Xiaofeng Yan @ 2012-01-08  7:11 UTC (permalink / raw)
  To: openembedded-core, mark.hatle

From: Xiaofeng Yan <xiaofeng.yan@windriver.com>

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 <xiaofeng.yan@windriver.com>
---
 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




^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/2] tar_archive.bbclass: Package source codes and log files to tar package
  2012-01-08  7:11 [PATCH 0/2] Add function to package source codes tree to source rpm and tar packages Xiaofeng Yan
  2012-01-08  7:11 ` [PATCH 1/2] package_rpm.bbclass: add srpm function in spec file Xiaofeng Yan
@ 2012-01-08  7:11 ` Xiaofeng Yan
  2012-01-09 16:20   ` Mark Hatle
  2012-01-12 20:04 ` [PATCH 0/2] Add function to package source codes tree to source rpm and tar packages Saul Wold
  2 siblings, 1 reply; 8+ messages in thread
From: Xiaofeng Yan @ 2012-01-08  7:11 UTC (permalink / raw)
  To: openembedded-core, mark.hatle

From: Xiaofeng Yan <xiaofeng.yan@windriver.com>

Source rpm package needs tar package as its source codes. log files \
are required as a part of source (description in bug 1655).
So log files need be packaged as tar package too.
User can select two types of package, the first is tar package and the second is src.rpm package.
The option item is defined in conf/local.conf.(ARCHIVE_TYPE ?= "SRPM"(default) or ARCHIVE_TYPE ?= "TARGZ")
if the option is the first type, then tar_archive.bbclass should be inherited in an suitable position.
The tar packages(sources.tar.gz and log.tar.gz) will be created in workdir.
if the option is the second type, then tar_archive.bbclass shoud be inherited in package_rpm.bbclass.
The sources rpm packages will be created in workdir/deploy-srpm when building.
The following command can ship all of source packages(src.rpm or tar.gz) to build/tmp/deploy/sources
$bitbake core-image-sato -c copysources

[YOCTO #1655]

Signed-off-by: Xiaofeng Yan <xiaofeng.yan@windriver.com>
---
 meta/classes/tar_archive.bbclass |  216 ++++++++++++++++++++++++++++++++++++++
 1 files changed, 216 insertions(+), 0 deletions(-)
 create mode 100644 meta/classes/tar_archive.bbclass

diff --git a/meta/classes/tar_archive.bbclass b/meta/classes/tar_archive.bbclass
new file mode 100644
index 0000000..2651cbc
--- /dev/null
+++ b/meta/classes/tar_archive.bbclass
@@ -0,0 +1,216 @@
+# This file is used for packaging source codes tree to tar and \
+# source rpm package.
+
+# Some patches are not in WORKDIR but in its sub-directory.
+# Rpmbuild uses workdir as source directoty.
+# Copy pathes in sub-directory to workdir. these patches could exist \
+# in gentoo, debian and fedora
+python move_patches_toworkdir(){	
+	import os
+
+	patches = d.getVar('PLIST', True)
+	workdir = d.getVar('WORKDIR',True)
+	s = d.getVar('S',True)
+	
+	# The source tree of gcc is different from others, it is \
+	# in work-shard, not in work. so this needs a special treatment.
+	if 'work-shared' in s:
+		for patch in patches:
+			os.system('cp ' + os.path.dirname(s) + '/' + patch + ' ' + workdir)
+		return
+	platforms = ['debian','gentoo','fedora']
+	os.chdir(workdir)
+	for patch in patches:
+		if patch  not in os.listdir('.'):
+			for platform in platforms:
+				if os.path.exists(platform):
+					for root, dirs, files in os.walk(platform):
+						for file in files:
+							os.system('cp ' + root + '/' + file + ' ' + workdir)
+			return
+}
+
+# Spec file needs patches' name to build source packages  
+# Get patches' name and set them to 'd'
+python get_patches () {
+	import os
+	import re
+    
+	plist=[]
+	pat = re.compile('NOTE(.+)\'(.+)\'(.+)$')
+	workdir = d.getVar('WORKDIR',True)
+	s = d.getVar('S',True)
+	file_log = workdir + "/temp/log.do_patch"
+	if 'work-shared' in s:
+		file_log = os.path.dirname(s) + "/temp/log.do_patch"
+      	
+	if os.path.exists(file_log):
+		f = open(file_log,'r')
+		for line in f.readlines():
+			m = pat.match(line)
+			if m:
+				plist.append(m.group(2))
+		f.close()
+        
+	d.setVar('PLIST',plist)
+	bb.build.exec_func('move_patches_toworkdir', d)
+}
+
+ 
+# The following pkgs don't have source rpm and tar packages
+# 1 The pkg do nothing when unpack
+# 2 The pkg includes 'task-' or 'native' in the workdir 
+# 3 The ${S} is empty 
+python not_srpm() {
+	import os
+
+	workdir = d.getVar('WORKDIR',True)
+	s = d.getVar('S',True)
+	# The source tree of gcc is different from others, it is \
+	#in work-shard, not in work. So it needs a special treatment.
+	if 'work-shared' in s:
+		return
+	# Identify an empty directory, if having file after \
+	#the stage of do_unpack, this will look as invalid source codes directoty.
+	if len(os.listdir(s)) == 0:
+		open("emptyflag", 'w')
+	try:
+		if not os.path.exists(workdir + '/temp/' + 'log.do_unpack') or 'task-' in workdir or 'native' in workdir or os.path.exists(s + '/' + 'emptyflag'):
+			raise IOError
+	except IOError:
+		d.setVar('NOTSRPM', '1')
+}
+
+# Spec file needs source package's name to build a source package
+# Package source code patched to ${PF}.tar.gz
+do_tararchive[dirs] = "${WORKDIR}"
+fakeroot python do_tararchive() {
+	import tarfile
+	import os
+	if not d.getVar('ARCHIVE_TYPE', True):
+		return
+	
+	s = d.getVar('S',True)
+	workdir=d.getVar('WORKDIR', True)
+	PF = d.getVar('PF',True)
+	bb.build.exec_func('not_srpm', d)	
+	if d.getVar('NOTSRPM', True):
+		return
+	if os.path.exists(s) and s is not workdir:
+		sourcedir = os.path.basename(s)
+		tarbase = os.path.dirname(s)
+		if not sourcedir or os.path.dirname(tarbase) == workdir:
+			sourcedir = os.path.basename(os.path.dirname(s))
+			tarbase = os.path.dirname(os.path.dirname(s))
+		os.chdir(tarbase)
+	else:
+		sourcedir = os.path.basename(s)
+		if not os.path.exists(sourcedir):
+			os.mkdir(sourcedir)
+		for file in os.listdir(s):
+			if file is not 'temp' and file is not sourcedir:
+				os.system('cp ' + file + ' ' + sourcedir)
+
+	if (len(os.listdir(sourcedir))) != 0:
+		tar = tarfile.open( PF + ".tar.gz", "w:gz")
+		tar.add(sourcedir)
+		tar.close()
+		if os.path.dirname(s) is not workdir:
+			os.system('mv ' + os.path.dirname(s) + '/' + PF + '.tar.gz ' + workdir)
+}
+
+addtask do_tararchive after do_patch before do_configure
+
+# "log.tar.gz" which inculdes do_unpack and do_configure is \
+# a part of source package
+# Package log files to "log.tar.gz"
+do_logarchive[dirs] = "${WORKDIR}"
+fakeroot python do_logarchive(){
+	import tarfile
+	import os
+	
+	if not d.getVar('ARCHIVE_TYPE', True):
+		return
+	
+	bb.build.exec_func('not_srpm', d)	
+	if d.getVar('NOTSRPM', True):
+		return 
+	
+	log_list = ['log.do_patch','log.do_configure']
+	workdir=d.getVar('WORKDIR', True)
+	temp = workdir + "/" + "temp"
+	os.chdir(temp)
+	logtar = tarfile.open("log.tar.gz", "w:gz")
+	if os.path.exists(temp):
+		for link_log in log_list:
+			if os.path.islink(link_log):
+				real_log = os.path.basename(os.readlink(link_log))
+				logtar.add(real_log)
+	logtar.close()
+	os.system('mv log.tar.gz ../')
+}
+addtask do_logarchive after do_install before do_package
+
+# This is used for fixing the "Bad owner/group: ..." 
+# Set owner and group for patches, log.tar.gz and ${PF}.tar.gz to "root"
+do_setowngroup[dirs] = "${WORKDIR}"
+fakeroot python do_setowngroup(){
+	import os
+	
+	if not d.getVar('ARCHIVE_TYPE', True):
+		return
+	bb.build.exec_func('not_srpm', d)	
+	if d.getVar('NOTSRPM', True):
+		return
+	bb.build.exec_func('get_patches', d)
+        srcpatches = d.getVar('PLIST',True)
+	for patch in srcpatches:
+		os.system('chown root.root' + ' ' + patch)
+	os.system('chown root.root' + ' ' + "log.tar.gz")
+	os.system('chown root.root' + ' ' + d.getVar('PF', True) + ".tar.gz")
+}
+addtask do_setowngroup after do_logarchive before do_package
+
+# Copy source package to build/tmp/deploy/sources
+do_copysources[dirs] = "${PWD}/tmp/work"
+python do_copysources (){
+	import os
+	
+	archive_type = d.getVar('ARCHIVE_TYPE', True)
+	pwd = d.getVar('PWD', True)
+	machine = d.getVar('MACHINE', True)
+	target_sys = d.getVar('TARGET_SYS', True)
+	target_os = d.getVar('TARGET_OS', True)
+	target_vendor = d.getVar('TARGET_VENDOR', True)
+	tune_pkgarch = d.getVar('TUNE_PKGARCH', True)
+	multimach_host_sys = d.getVar('MULTIMACH_HOST_SYS', True)
+	all = 'all' + target_vendor + '-' + 'linux'
+	target = tune_pkgarch + target_vendor + '-' + target_os
+	srpmdir=pwd + '/tmp/deploy/' + 'sources' + '/' + machine
+	
+	if not os.path.exists(srpmdir):
+		os.makedirs(srpmdir)
+	global_work = pwd + '/tmp' + '/work'
+	os.chdir(global_work)
+	for dirs in multimach_host_sys, all, target:
+		localdir = srpmdir + '/' + dirs
+		if not os.path.exists(localdir):
+			os.mkdir(localdir)
+		os.chdir(dirs)
+		if archive_type == 'SRPM': 
+			os.system('cp */deploy-srpm/*/*.src.rpm ' + localdir)
+		elif archive_type == 'TARGZ':
+			for dir in os.listdir('.'):
+				if os.path.isdir(dir):
+					os.chdir(dir)
+					if not os.path.exists(dir):
+						os.mkdir(localdir + '/' + dir)
+					os.system('cp *.gz ' + localdir + '/' + dir)
+					os.chdir('../')
+		else:
+			return
+		os.chdir(global_work)
+}
+addtask do_copysources  after do_rootfs
+
+EXPORT_FUNCTIONS do_archive do_logarchive do_setowngroup do_copysources
-- 
1.7.7




^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 1/2] package_rpm.bbclass: add srpm function in spec file
  2012-01-08  7:11 ` [PATCH 1/2] package_rpm.bbclass: add srpm function in spec file Xiaofeng Yan
@ 2012-01-09 16:17   ` Mark Hatle
  2012-01-10  8:02     ` Xiaofeng Yan
  0 siblings, 1 reply; 8+ messages in thread
From: Mark Hatle @ 2012-01-09 16:17 UTC (permalink / raw)
  To: Xiaofeng Yan; +Cc: openembedded-core

On 1/8/12 1:11 AM, Xiaofeng Yan wrote:
> From: Xiaofeng Yan<xiaofeng.yan@windriver.com>
>
> 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<xiaofeng.yan@windriver.com>
> ---
>   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('')

The above will simply print the output of the do_patch and do_configure steps. 
It would probably be better to simply include the steps themselves... but with 
the python based steps I'm not sure that is possible.  So returning the log 
entries is likely the next best thing.

Note, you don't need the wild cards in this, you should simply cat out the 
version log.do_patch instead of log.do_patch* -- bitbake ensures that the last 
log file is always the one with the symbolic link.

--Mark

> +
>   	# 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')




^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/2] tar_archive.bbclass: Package source codes and log files to tar package
  2012-01-08  7:11 ` [PATCH 2/2] tar_archive.bbclass: Package source codes and log files to tar package Xiaofeng Yan
@ 2012-01-09 16:20   ` Mark Hatle
  0 siblings, 0 replies; 8+ messages in thread
From: Mark Hatle @ 2012-01-09 16:20 UTC (permalink / raw)
  To: Xiaofeng Yan; +Cc: openembedded-core

On 1/8/12 1:11 AM, Xiaofeng Yan wrote:
> From: Xiaofeng Yan<xiaofeng.yan@windriver.com>
>
> Source rpm package needs tar package as its source codes. log files \
> are required as a part of source (description in bug 1655).
> So log files need be packaged as tar package too.
> User can select two types of package, the first is tar package and the second is src.rpm package.
> The option item is defined in conf/local.conf.(ARCHIVE_TYPE ?= "SRPM"(default) or ARCHIVE_TYPE ?= "TARGZ")
> if the option is the first type, then tar_archive.bbclass should be inherited in an suitable position.
> The tar packages(sources.tar.gz and log.tar.gz) will be created in workdir.
> if the option is the second type, then tar_archive.bbclass shoud be inherited in package_rpm.bbclass.
> The sources rpm packages will be created in workdir/deploy-srpm when building.
> The following command can ship all of source packages(src.rpm or tar.gz) to build/tmp/deploy/sources
> $bitbake core-image-sato -c copysources
>
> [YOCTO #1655]
>
> Signed-off-by: Xiaofeng Yan<xiaofeng.yan@windriver.com>
> ---
>   meta/classes/tar_archive.bbclass |  216 ++++++++++++++++++++++++++++++++++++++
>   1 files changed, 216 insertions(+), 0 deletions(-)
>   create mode 100644 meta/classes/tar_archive.bbclass
>

...

> +addtask do_logarchive after do_install before do_package
> +
> +# This is used for fixing the "Bad owner/group: ..."
> +# Set owner and group for patches, log.tar.gz and ${PF}.tar.gz to "root"
> +do_setowngroup[dirs] = "${WORKDIR}"
> +fakeroot python do_setowngroup(){
> +	import os
> +	
> +	if not d.getVar('ARCHIVE_TYPE', True):
> +		return
> +	bb.build.exec_func('not_srpm', d)	
> +	if d.getVar('NOTSRPM', True):
> +		return
> +	bb.build.exec_func('get_patches', d)
> +        srcpatches = d.getVar('PLIST',True)
> +	for patch in srcpatches:
> +		os.system('chown root.root' + ' ' + patch)
> +	os.system('chown root.root' + ' ' + "log.tar.gz")
> +	os.system('chown root.root' + ' ' + d.getVar('PF', True) + ".tar.gz")
> +}

Instead of the above during the creation of the tar archive, you should be able 
to pass in --owner=root  --group=root and tar will ignore the on-disk 
permissions and set it based on the arguments.

> +addtask do_setowngroup after do_logarchive before do_package
> +
> +# Copy source package to build/tmp/deploy/sources
> +do_copysources[dirs] = "${PWD}/tmp/work"
> +python do_copysources (){
> +	import os
> +	
> +	archive_type = d.getVar('ARCHIVE_TYPE', True)
> +	pwd = d.getVar('PWD', True)
> +	machine = d.getVar('MACHINE', True)
> +	target_sys = d.getVar('TARGET_SYS', True)
> +	target_os = d.getVar('TARGET_OS', True)
> +	target_vendor = d.getVar('TARGET_VENDOR', True)
> +	tune_pkgarch = d.getVar('TUNE_PKGARCH', True)
> +	multimach_host_sys = d.getVar('MULTIMACH_HOST_SYS', True)
> +	all = 'all' + target_vendor + '-' + 'linux'
> +	target = tune_pkgarch + target_vendor + '-' + target_os
> +	srpmdir=pwd + '/tmp/deploy/' + 'sources' + '/' + machine
> +	
> +	if not os.path.exists(srpmdir):
> +		os.makedirs(srpmdir)
> +	global_work = pwd + '/tmp' + '/work'
> +	os.chdir(global_work)
> +	for dirs in multimach_host_sys, all, target:
> +		localdir = srpmdir + '/' + dirs
> +		if not os.path.exists(localdir):
> +			os.mkdir(localdir)
> +		os.chdir(dirs)
> +		if archive_type == 'SRPM':
> +			os.system('cp */deploy-srpm/*/*.src.rpm ' + localdir)
> +		elif archive_type == 'TARGZ':
> +			for dir in os.listdir('.'):
> +				if os.path.isdir(dir):
> +					os.chdir(dir)
> +					if not os.path.exists(dir):
> +						os.mkdir(localdir + '/' + dir)
> +					os.system('cp *.gz ' + localdir + '/' + dir)
> +					os.chdir('../')
> +		else:
> +			return
> +		os.chdir(global_work)
> +}
> +addtask do_copysources  after do_rootfs
> +
> +EXPORT_FUNCTIONS do_archive do_logarchive do_setowngroup do_copysources




^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 1/2] package_rpm.bbclass: add srpm function in spec file
  2012-01-09 16:17   ` Mark Hatle
@ 2012-01-10  8:02     ` Xiaofeng Yan
  0 siblings, 0 replies; 8+ messages in thread
From: Xiaofeng Yan @ 2012-01-10  8:02 UTC (permalink / raw)
  To: Mark Hatle; +Cc: openembedded-core

On 2012年01月10日 00:17, Mark Hatle wrote:
> On 1/8/12 1:11 AM, Xiaofeng Yan wrote:
>> From: Xiaofeng Yan<xiaofeng.yan@windriver.com>
>>
>> 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<xiaofeng.yan@windriver.com>
>> ---
>> 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('')
>
> The above will simply print the output of the do_patch and 
> do_configure steps. It would probably be better to simply include the 
> steps themselves... but with the python based steps I'm not sure that 
> is possible. 
The stage of prep can work with command "rpmbuild -bp xxx.spec" on 
target platform. I have also a query. if I plus "%prep" between 
"%package" and "%file", then "prep" can't work but if plussing "%prep 
after "%file"", then "%prep" can work. I don't know why about that.

> So returning the log entries is likely the next best thing.
>
I should modify codes like the following.

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' % "echo \"include log.do_unpack and 
log.do_patch, Please check them in log.tar.gz from SOURCES\"")
spec_files_bottom.append('')

only tell user to find log files in detailed place. right?

> Note, you don't need the wild cards in this, you should simply cat out 
> the version log.do_patch instead of log.do_patch* -- bitbake ensures 
> that the last log file is always the one with the symbolic link.
>
> --Mark
>
>> +
>> # 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')
>
>




^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 0/2] Add function to package source codes tree to source rpm and tar packages
  2012-01-08  7:11 [PATCH 0/2] Add function to package source codes tree to source rpm and tar packages Xiaofeng Yan
  2012-01-08  7:11 ` [PATCH 1/2] package_rpm.bbclass: add srpm function in spec file Xiaofeng Yan
  2012-01-08  7:11 ` [PATCH 2/2] tar_archive.bbclass: Package source codes and log files to tar package Xiaofeng Yan
@ 2012-01-12 20:04 ` Saul Wold
  2012-01-13 10:01   ` Xiaofeng Yan
  2 siblings, 1 reply; 8+ messages in thread
From: Saul Wold @ 2012-01-12 20:04 UTC (permalink / raw)
  To: Patches and discussions about the oe-core layer

On 01/07/2012 11:11 PM, Xiaofeng Yan wrote:
> From: Xiaofeng Yan<xiaofeng.yan@windriver.com>
>
> Add file "tar_archive.bbclass" and modify file "package_rpm.bbclass" for packaging source codes tree to source rpm and tar packages.
> After adding srpm function in file "package_rpm.bbclass", user can get source rpm packages beside rpm package.
> User also get tar packages of source codes tree according to the requirement from bug 1655. The final result is as follow:
> Take qemux86 for an example:
> Get source rpm pakcages
> 1 Inherit tar_archive.bbclass in package_rpm.bbclass.
> 2 Select the type of packaging source code tree in conf/local.conf(ARCHIVE_TYPE ?= "SRPM")
> 3 Run the following command
>    $ bitbake core-image-sato -c copysources
> 4 Get source rpm packages:
>    $ tree build/tmp/deploy/sources
>    build/tmp/deploy/sources/
>    └── qemux86
>      ├── all-poky-linux
>      │   ├── encodings-1.0.4-r2.1.src.rpm
>          ......
>      ├── i586-poky-linux
>      │   ├── acl-2.2.51-r2.src.rpm
>          ......
>      └── qemux86-poky-linux
>          ├── base-files-3.0.14-r70.src.rpm
>          ......
> Get tar packages:
> 1 Inherit tar_archive.bbclass in an suitable position (for example, package_rpm.bbclass).
> 2 Select the type of packaging source code tree in conf/local.conf(ARCHIVE_TYPE ?= "TARGZ")
> 3 Run the following command
>    $ bitbake core-image-sato -c copysources
> 4 Get tar packages:
>    $ tree build/tmp/deploy/sources
>    buildx86/tmp/deploy/sources
>    └── qemux86
>      ├── all-poky-linux
>      │   ├── encodings-1_1.0.4-r2.1
>      │   │   ├── encodings-1_1.0.4-r2.1.tar.gz
>      │   │   └── log.tar.gz
>              ......
>      ├── i586-poky-linux
>      │   ├── acl-2.2.51-r2
>      │   │   ├── acl-2.2.51-r2.tar.gz
>              └── log.tar.gz
>              ......
>      └── qemux86-poky-linux
>          ├── core-image-sato-1.0-r0
>          ├── libzypp-0.0-git1+15b6c52260bbc52b3d8e585e271b67e10cc7c433-r17
>          │   ├── libzypp-0.0-git1+15b6c52260bbc52b3d8e585e271b67e10cc7c433-r17.tar.gz
>          │   └── log.tar.gz
>              ......
>
> if inheriting tar_archive.bbclass in one bb file, then only package source codes tree of this file.
> Take zlib for an example:
> Get source rpm pakcage of zlib
> 1 Inherit tar_archive.bbclass in zlib_1.2.5.bb.
> 2 Select the type of packaging source code tree in conf/local.conf(ARCHIVE_TYPE ?= "SRPM")
> 3 Run the following command
>    $ bitbake zlib
> 4 Get source rpm package:
>    $ ls build/tmp/work/i586-poky-linux/zlib-1.2.5-r3/deploy-srpm/i586/
>      zlib-1.2.5-r3.src.rpm
>
>
> Get tar package of zlib
> 1 Inherit tar_archive.bbclass in zlib_1.2.5.bb.
> 2 Select the type of packaging source code tree in conf/local.conf(ARCHIVE_TYPE ?= "TARGZ")
> 3 Run the following command
>    $ bitbake zlib
> 4 Get tar package:
>    $ ls build/tmp/work/i586-poky-linux/zlib-1.2.5-r3/
>      zlib-1.2.5-r3.tar.gz log.tar.gz ......
>
>
> Pull URL: git://git.pokylinux.org/poky-contrib.git
>    Branch: xiaofeng/1655
>    Browse: http://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=xiaofeng/1655
>
> Thanks,
>      Xiaofeng Yan<xiaofeng.yan@windriver.com>
> ---
>
>
> Xiaofeng Yan (2):
>    package_rpm.bbclass: add srpm function in spec file
>    tar_archive.bbclass: Package source codes and log files to tar
>      package
>
>   meta/classes/package_rpm.bbclass |   65 ++++++++++--
>   meta/classes/tar_archive.bbclass |  216 ++++++++++++++++++++++++++++++++++++++
>   2 files changed, 271 insertions(+), 10 deletions(-)
>   create mode 100644 meta/classes/tar_archive.bbclass
>
>
Xiaofeng, Wenzong:

We are going to put a hold on both this patchset and Wenzong's patch 
set, due to the similarity of what is trying to be done. Both of these 
patches are creating tar archives of source and temp directories. While 
it is being done differently, we need to consolidate these changes.

The SRPM work can use the consolidated version.  As I mentioned in a 
prior email to Wenzong, there are also other classes such as 
copyleft_complaince.bbclass and src_distrbute.bbclass that we should 
look at and determine if they can be modified or extended.

Wenzong pointed out that copyleft does license checking, it can work for 
all sources depending on the settings of the INCLUDE/EXCLUDE variables, 
so it can be reused, it creates a source + patchset directory.

The sourcepgk.bbclass seems to be doing something different in creating 
a diff file (among other) of a given package between the unpack and 
post-patch, including the python functions and environmnet variables.

I (with Mark's help) will craft and updated document to address what we 
are want to accomplish, which is simplifing what we currently have with 
the goal to meet the commercial vendor's needs of supplying the source 
either patched or with a patchset that can be applied along with the 
configuration and build scripts for various license compliance.

Thanks for your initial work in this area, but we need to find a better 
overall approach without duplicating code/effort.

Sau!


>
>
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core@lists.openembedded.org
> http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 0/2] Add function to package source codes tree to source rpm and tar packages
  2012-01-12 20:04 ` [PATCH 0/2] Add function to package source codes tree to source rpm and tar packages Saul Wold
@ 2012-01-13 10:01   ` Xiaofeng Yan
  0 siblings, 0 replies; 8+ messages in thread
From: Xiaofeng Yan @ 2012-01-13 10:01 UTC (permalink / raw)
  To: Saul Wold; +Cc: Patches and discussions about the oe-core layer

On 2012年01月13日 04:04, Saul Wold wrote:
> On 01/07/2012 11:11 PM, Xiaofeng Yan wrote:
>> From: Xiaofeng Yan<xiaofeng.yan@windriver.com>
>>
>> Add file "tar_archive.bbclass" and modify file "package_rpm.bbclass" 
>> for packaging source codes tree to source rpm and tar packages.
>> After adding srpm function in file "package_rpm.bbclass", user can 
>> get source rpm packages beside rpm package.
>> User also get tar packages of source codes tree according to the 
>> requirement from bug 1655. The final result is as follow:
>> Take qemux86 for an example:
>> Get source rpm pakcages
>> 1 Inherit tar_archive.bbclass in package_rpm.bbclass.
>> 2 Select the type of packaging source code tree in 
>> conf/local.conf(ARCHIVE_TYPE ?= "SRPM")
>> 3 Run the following command
>> $ bitbake core-image-sato -c copysources
>> 4 Get source rpm packages:
>> $ tree build/tmp/deploy/sources
>> build/tmp/deploy/sources/
>> └── qemux86
>> ├── all-poky-linux
>> │  ├── encodings-1.0.4-r2.1.src.rpm
>> ......
>> ├── i586-poky-linux
>> │  ├── acl-2.2.51-r2.src.rpm
>> ......
>> └── qemux86-poky-linux
>> ├── base-files-3.0.14-r70.src.rpm
>> ......
>> Get tar packages:
>> 1 Inherit tar_archive.bbclass in an suitable position (for example, 
>> package_rpm.bbclass).
>> 2 Select the type of packaging source code tree in 
>> conf/local.conf(ARCHIVE_TYPE ?= "TARGZ")
>> 3 Run the following command
>> $ bitbake core-image-sato -c copysources
>> 4 Get tar packages:
>> $ tree build/tmp/deploy/sources
>> buildx86/tmp/deploy/sources
>> └── qemux86
>> ├── all-poky-linux
>> │  ├── encodings-1_1.0.4-r2.1
>> │  │  ├── encodings-1_1.0.4-r2.1.tar.gz
>> │  │  └── log.tar.gz
>> ......
>> ├── i586-poky-linux
>> │  ├── acl-2.2.51-r2
>> │  │  ├── acl-2.2.51-r2.tar.gz
>> └── log.tar.gz
>> ......
>> └── qemux86-poky-linux
>> ├── core-image-sato-1.0-r0
>> ├── libzypp-0.0-git1+15b6c52260bbc52b3d8e585e271b67e10cc7c433-r17
>> │  ├── 
>> libzypp-0.0-git1+15b6c52260bbc52b3d8e585e271b67e10cc7c433-r17.tar.gz
>> │  └── log.tar.gz
>> ......
>>
>> if inheriting tar_archive.bbclass in one bb file, then only package 
>> source codes tree of this file.
>> Take zlib for an example:
>> Get source rpm pakcage of zlib
>> 1 Inherit tar_archive.bbclass in zlib_1.2.5.bb.
>> 2 Select the type of packaging source code tree in 
>> conf/local.conf(ARCHIVE_TYPE ?= "SRPM")
>> 3 Run the following command
>> $ bitbake zlib
>> 4 Get source rpm package:
>> $ ls build/tmp/work/i586-poky-linux/zlib-1.2.5-r3/deploy-srpm/i586/
>> zlib-1.2.5-r3.src.rpm
>>
>>
>> Get tar package of zlib
>> 1 Inherit tar_archive.bbclass in zlib_1.2.5.bb.
>> 2 Select the type of packaging source code tree in 
>> conf/local.conf(ARCHIVE_TYPE ?= "TARGZ")
>> 3 Run the following command
>> $ bitbake zlib
>> 4 Get tar package:
>> $ ls build/tmp/work/i586-poky-linux/zlib-1.2.5-r3/
>> zlib-1.2.5-r3.tar.gz log.tar.gz ......
>>
>>
>> Pull URL: git://git.pokylinux.org/poky-contrib.git
>> Branch: xiaofeng/1655
>> Browse: 
>> http://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=xiaofeng/1655
>>
>> Thanks,
>> Xiaofeng Yan<xiaofeng.yan@windriver.com>
>> ---
>>
>>
>> Xiaofeng Yan (2):
>> package_rpm.bbclass: add srpm function in spec file
>> tar_archive.bbclass: Package source codes and log files to tar
>> package
>>
>> meta/classes/package_rpm.bbclass | 65 ++++++++++--
>> meta/classes/tar_archive.bbclass | 216 
>> ++++++++++++++++++++++++++++++++++++++
>> 2 files changed, 271 insertions(+), 10 deletions(-)
>> create mode 100644 meta/classes/tar_archive.bbclass
>>
>>
> Xiaofeng, Wenzong:
>
> We are going to put a hold on both this patchset and Wenzong's patch 
> set, due to the similarity of what is trying to be done. Both of these 
> patches are creating tar archives of source and temp directories. 
> While it is being done differently, we need to consolidate these changes.
>
> The SRPM work can use the consolidated version. As I mentioned in a 
> prior email to Wenzong, there are also other classes such as 
> copyleft_complaince.bbclass and src_distrbute.bbclass that we should 
> look at and determine if they can be modified or extended.
>
> Wenzong pointed out that copyleft does license checking, it can work 
> for all sources depending on the settings of the INCLUDE/EXCLUDE 
> variables, so it can be reused, it creates a source + patchset directory.
>
> The sourcepgk.bbclass seems to be doing something different in 
> creating a diff file (among other) of a given package between the 
> unpack and post-patch, including the python functions and environmnet 
> variables.
>
> I (with Mark's help) will craft and updated document to address what 
> we are want to accomplish, which is simplifing what we currently have 
> with the goal to meet the commercial vendor's needs of supplying the 
> source either patched or with a patchset that can be applied along 
> with the configuration and build scripts for various license compliance.
>
> Thanks for your initial work in this area, but we need to find a 
> better overall approach without duplicating code/effort.
>
> Sau!
>
>
I reviewed sourcepkg.bbclass(some cases can't be considered and we need 
modify this file according to requirement). It is similar with 
tar_archive.bbclass in some functions. I agree with Saul's suggestion 
about combining two or more files into one file.

Yan
Thanks
>>
>>
>> _______________________________________________
>> Openembedded-core mailing list
>> Openembedded-core@lists.openembedded.org
>> http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core
>




^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2012-01-13 10:08 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-01-08  7:11 [PATCH 0/2] Add function to package source codes tree to source rpm and tar packages Xiaofeng Yan
2012-01-08  7:11 ` [PATCH 1/2] package_rpm.bbclass: add srpm function in spec file Xiaofeng Yan
2012-01-09 16:17   ` Mark Hatle
2012-01-10  8:02     ` Xiaofeng Yan
2012-01-08  7:11 ` [PATCH 2/2] tar_archive.bbclass: Package source codes and log files to tar package Xiaofeng Yan
2012-01-09 16:20   ` Mark Hatle
2012-01-12 20:04 ` [PATCH 0/2] Add function to package source codes tree to source rpm and tar packages Saul Wold
2012-01-13 10:01   ` Xiaofeng Yan

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.