* [PATCH 0/7] Realize archiving functions
@ 2012-03-13 12:52 Xiaofeng Yan
2012-03-13 12:52 ` [PATCH 1/7] package_rpm: Add srpm function to this bbclass Xiaofeng Yan
` (6 more replies)
0 siblings, 7 replies; 23+ messages in thread
From: Xiaofeng Yan @ 2012-03-13 12:52 UTC (permalink / raw)
To: openembedded-core
From: Xiaofeng Yan <xiaofeng.yan@windriver.com>
archiver.bbclass is for archiving sources , patches and logs including .bb and .inc files by configuring conf/local.conf which control what a archiving package should include.
For archiving a source rpm package, I add some functions to package_rpm.bbclass.
I also merge source_pkg.bbclass src_distribute.bbclass src_distribute_local.bbclass to archiver.bbclass due to their similar functions.
Pull URL: git://git.pokylinux.org/poky-contrib.git
Branch: xiaofeng/1977
Browse: http://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=xiaofeng/1977
Thanks,
Xiaofeng Yan <xiaofeng.yan@windriver.com>
---
Xiaofeng Yan (7):
package_rpm: Add srpm function to this bbclass
archiver.bbclass: New bbclass for archiving sources, patches,logs and
scripts
archive-patched-source.bbclass: Archive patched source
archive-configured-source.bbclass: Archive configured source
archive-original-source.bbclass: Archive original source
local.conf.sample: Add set for archiving packages
sourcepkg, src_distribute, src_distribute_local: remove three bbclass
meta-yocto/conf/local.conf.sample | 25 ++
meta/classes/archive-configured-source.bbclass | 14 +
meta/classes/archive-original-source.bbclass | 14 +
meta/classes/archive-patched-source.bbclass | 14 +
meta/classes/archiver.bbclass | 421 ++++++++++++++++++++++++
meta/classes/package_rpm.bbclass | 63 ++++
meta/classes/sourcepkg.bbclass | 107 ------
meta/classes/src_distribute.bbclass | 49 ---
meta/classes/src_distribute_local.bbclass | 33 --
9 files changed, 551 insertions(+), 189 deletions(-)
create mode 100644 meta/classes/archive-configured-source.bbclass
create mode 100644 meta/classes/archive-original-source.bbclass
create mode 100644 meta/classes/archive-patched-source.bbclass
create mode 100644 meta/classes/archiver.bbclass
delete mode 100644 meta/classes/sourcepkg.bbclass
delete mode 100644 meta/classes/src_distribute.bbclass
delete mode 100644 meta/classes/src_distribute_local.bbclass
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH 1/7] package_rpm: Add srpm function to this bbclass
2012-03-13 12:52 [PATCH 0/7] Realize archiving functions Xiaofeng Yan
@ 2012-03-13 12:52 ` Xiaofeng Yan
2012-03-13 23:24 ` Saul Wold
2012-03-13 12:52 ` [PATCH 2/7] archiver.bbclass: New bbclass for archiving sources, patches, logs and scripts Xiaofeng Yan
` (5 subsequent siblings)
6 siblings, 1 reply; 23+ messages in thread
From: Xiaofeng Yan @ 2012-03-13 12:52 UTC (permalink / raw)
To: openembedded-core
From: Xiaofeng Yan <xiaofeng.yan@windriver.com>
Add a new function to archive source, patches and logs to a source rpm
package. Every source rpm package will be deployed to
${DEPLOY_DIR}/sources/deploy-srpm.
[YOCTO #1977]
Signed-off-by: Xiaofeng Yan <xiaofeng.yan@windriver.com>
---
meta/classes/package_rpm.bbclass | 63 ++++++++++++++++++++++++++++++++++++++
1 files changed, 63 insertions(+), 0 deletions(-)
diff --git a/meta/classes/package_rpm.bbclass b/meta/classes/package_rpm.bbclass
index 68313ec..b261a0e 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 = "${DEPLOY_DIR}/sources/deploy-srpm"
python package_rpm_fn () {
d.setVar('PKGFN', d.getVar('PKG'))
@@ -475,6 +476,37 @@ python write_specfile () {
import textwrap
import oe.packagedata
+ # append information for logs and patches to %prep
+ def add_prep(d,spec_files_bottom):
+ if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True) and d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() == 'SRPM':
+ spec_files_bottom.append('%%prep -n %s' % d.getVar('PN', True) )
+ spec_files_bottom.append('%s' % "echo \"include logs and patches, Please check them in SOURCES\"")
+ spec_files_bottom.append('')
+
+ # get the name of tarball for sources, patches and logs
+ def get_tarballs(d):
+ if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True) and d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() == 'SRPM':
+ sourcelist=[]
+ workdir = d.getVar('WORKDIR',True)
+ print os.listdir(workdir)
+ for source in os.listdir(workdir):
+ if 'tar.gz' in source:
+ sourcelist.append(source)
+ return sourcelist
+
+ # append the name of tarball to key word 'SOURCE' in xxx.spec.
+ def tail_source(d,source_list=[],patch_list=None):
+ if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True) and d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() == 'SRPM':
+ source_number = 0
+ patch_number = 0
+ for source in source_list:
+ spec_preamble_top.append('Source' + str(source_number) + ': %s' % source)
+ source_number += 1
+ if patch_list:
+ for patch in patch_list:
+ print_deps(patch, "Patch" + str(patch_number), spec_preamble_top, d)
+ patch_number += 1
+
# We need a simple way to remove the MLPREFIX from the package name,
# and dependency information...
def strip_multilib(name, d):
@@ -707,6 +739,8 @@ python write_specfile () {
spec_preamble_bottom.append('License: %s' % splitlicense)
spec_preamble_bottom.append('Group: %s' % splitsection)
+ source_list = get_tarballs(d)
+ tail_source(d,source_list,None)
# Replaces == Obsoletes && Provides
if splitrreplaces and splitrreplaces.strip() != "":
for dep in splitrreplaces.split(','):
@@ -786,6 +820,7 @@ python write_specfile () {
del localdata
bb.utils.unlockfile(lf)
+ add_prep(d,spec_files_bottom)
spec_preamble_top.append('Summary: %s' % srcsummary)
spec_preamble_top.append('Name: %s' % srcname)
spec_preamble_top.append('Version: %s' % srcversion)
@@ -900,6 +935,25 @@ python write_specfile () {
python do_package_rpm () {
import os
+ def creat_srpm_dir(d):
+ if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True) and d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() == 'SRPM':
+ licenses = d.getVar('LICENSE', 1).replace('&', '|')
+ licenses = licenses.replace('(', '').replace(')', '')
+ clean_licenses = ""
+ for x in licenses.split():
+ if x.strip() == '' or x == 'CLOSED':
+ continue
+ if x != "|":
+ clean_licenses += x
+ if '|' in clean_licenses:
+ clean_licenses = clean_licenses.replace('|','')
+
+ pkgwritesrpmdir = bb.data.expand('${PKGWRITEDIRSRPM}/${PACKAGE_ARCH_EXTEND}', d)
+ pkgwritesrpmdir = pkgwritesrpmdir + '/' + clean_licenses
+ bb.mkdirhier(pkgwritesrpmdir)
+ os.chmod(pkgwritesrpmdir, 0755)
+ return pkgwritesrpmdir
+
# We need a simple way to remove the MLPREFIX from the package name,
# and dependency information...
def strip_multilib(name, d):
@@ -1015,8 +1069,17 @@ python do_package_rpm () {
cmd = cmd + " --define 'debug_package %{nil}'"
cmd = cmd + " --define '_rpmfc_magic_path " + magicfile + "'"
cmd = cmd + " --define '_tmppath " + workdir + "'"
+ if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True) and d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() == 'SRPM':
+ cmdsrpm = cmd + " --define '_sourcedir " + workdir + "' --define '_srcrpmdir " + creat_srpm_dir(d) + "'"
+ cmdsrpm = 'fakeroot ' + cmdsrpm + " -bs " + outspecfile
cmd = cmd + " -bb " + outspecfile
+ # Build the source rpm package !
+ if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True) and d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() == '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.0.4
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH 2/7] archiver.bbclass: New bbclass for archiving sources, patches, logs and scripts
2012-03-13 12:52 [PATCH 0/7] Realize archiving functions Xiaofeng Yan
2012-03-13 12:52 ` [PATCH 1/7] package_rpm: Add srpm function to this bbclass Xiaofeng Yan
@ 2012-03-13 12:52 ` Xiaofeng Yan
2012-03-14 2:57 ` Saul Wold
2012-03-13 12:52 ` [PATCH 3/7] archive-patched-source.bbclass: Archive patched source Xiaofeng Yan
` (4 subsequent siblings)
6 siblings, 1 reply; 23+ messages in thread
From: Xiaofeng Yan @ 2012-03-13 12:52 UTC (permalink / raw)
To: openembedded-core
From: Xiaofeng Yan <xiaofeng.yan@windriver.com>
1 Archive sources in ${S} in the different stage (do_unpack,do_patch,do_configure).
2 Archive patches including series
3 Archive logs including scripts (.bb and .inc files)
4 dump environment resources which show all variable and
functions used to xxx.showdata.dump when running a task
5 dump all content in 's' including patches to file xxx.diff.gz
All archiving packages will be deployed to ${DEPLOY_DIR}/sources/
[#YOCTO 1977]
Signed-off-by: Xiaofeng Yan <xiaofeng.yan@windriver.com>
---
meta/classes/archiver.bbclass | 421 +++++++++++++++++++++++++++++++++++++++++
1 files changed, 421 insertions(+), 0 deletions(-)
create mode 100644 meta/classes/archiver.bbclass
diff --git a/meta/classes/archiver.bbclass b/meta/classes/archiver.bbclass
new file mode 100644
index 0000000..95e870d
--- /dev/null
+++ b/meta/classes/archiver.bbclass
@@ -0,0 +1,421 @@
+# This file is used for archiving sources ,patches,and logs to tarball.
+# It also output building environment to xxx.dump.data and create xxx.diff.gz to record
+# all content in ${S} to a diff file.
+
+EXCLUDE_FROM ?= ".pc autom4te.cache"
+ARCHIVE_TYPE ?= "TAR SRPM"
+DISTRO ?= "poky"
+
+def parse_var(d,var):
+ ''' parse variable like ${PV} in "require xxx_${PV}.inc" to a real value. for example, change "require xxx_${PV}.inc" to "require xxx_1.2.inc" '''
+ import re
+ pat = re.compile('.*\$({(.*)}).*')
+ if '$' not in var and '/' not in var:
+ return var
+ else:
+ if '/' in var:
+ return [i for i in var.split('/') if i.endswith('.inc')][0]
+ elif '$' in var:
+ m = pat.match(var)
+ patstr = '\$' + m.group(1)
+ var_str = m.group(2)
+ return re.sub(patstr,d.getVar(var_str,True),var)
+ else:
+ return var
+
+
+def get_bb_inc(d):
+ '''create a directory "script-logs" including .bb and .inc file in ${WORKDIR}'''
+ import re
+ import os
+ import shutil
+
+ bbinc = []
+ pat=re.compile('require\s*([^\s]*\.*)(.*)')
+ file_dir = d.getVar('FILE', True)
+ bbdir = os.path.dirname(file_dir)
+ work_dir = d.getVar('WORKDIR', True)
+ os.chdir(work_dir)
+ bb.mkdirhier("script-logs")
+ os.chdir(bbdir)
+ bbfile = os.path.basename(file_dir)
+ bbinc.append(bbfile)
+
+ def get_inc (file):
+ f = open(file,'r')
+ for line in f.readlines():
+ if 'require' not in line:
+ bbinc.append(file)
+ else:
+ try:
+ incfile = pat.match(line).group(1)
+ incfile = parse_var(d,incfile)
+ bbinc.append(incfile)
+ get_inc(incfile)
+ except AttributeError:
+ pass
+ get_inc(bbfile)
+ os.chdir(work_dir)
+ for root, dirs, files in os.walk(bbdir):
+ for file in bbinc:
+ if file in files:
+ shutil.copy(root + '/' + file,'script-logs')
+ oe.path.copytree('temp', 'script-logs')
+ return work_dir + '/script-logs'
+
+def get_all_patches(d):
+ '''copy patches and series file to a pointed directory which will be archived to tarball in ${WORKDIR}'''
+ import shutil
+
+ src_patches=[]
+ pf = d.getVar('PF', True)
+ work_dir = d.getVar('WORKDIR', True)
+ dest = os.path.join(work_dir, pf + '-patches')
+ shutil.rmtree(dest, ignore_errors=True)
+ bb.mkdirhier(dest)
+
+ src_uri = d.getVar('SRC_URI', 1).split()
+ fetch = bb.fetch2.Fetch(src_uri, d)
+ locals = (fetch.localpath(url) for url in fetch.urls)
+ for local in locals:
+ src_patches.append(local)
+ for patch in src_patches[1:]:
+ shutil.copy(patch,dest)
+ return dest
+
+def get_applying_patches(d):
+ """only copy applying patches to a pointed directory which will be archived to tarball"""
+ import os
+ import shutil
+
+
+ pf = d.getVar('PF', True)
+ work_dir = d.getVar('WORKDIR', True)
+ dest = os.path.join(work_dir, pf + '-patches')
+ shutil.rmtree(dest, ignore_errors=True)
+ bb.mkdirhier(dest)
+
+
+ patches = src_patches(d)
+ for patch in patches:
+ _, _, local, _, _, parm = bb.decodeurl(patch)
+ if local:
+ shutil.copy(local,dest)
+ return dest
+
+def not_tarball(d):
+ '''packages including key words 'work-shared','native', 'task-' will be passed'''
+ import os
+
+ workdir = d.getVar('WORKDIR',True)
+ s = d.getVar('S',True)
+ if 'work-shared' in s or 'task-' in workdir or 'native' in workdir:
+ return True
+ else:
+ return False
+
+def archive_sources(d,middle_name):
+ '''archive sources codes tree to tarball'''
+ import tarfile
+ import shutil
+
+ s = d.getVar('S',True)
+ workdir=d.getVar('WORKDIR', True)
+ PF = d.getVar('PF',True)
+ tarname = PF + '-' + middle_name + ".tar.gz"
+
+ 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)
+ try:
+ for file in os.listdir(s):
+ if file is not 'temp' and file is not sourcedir:
+ shutil.copy(file,sourcedir)
+ except (IOError,OSError):
+ pass
+
+
+ if (len(os.listdir(sourcedir))) != 0:
+ tar = tarfile.open( tarname, "w:gz")
+ tar.add(sourcedir)
+ tar.close()
+ if cmp(workdir,os.path.dirname(s)) and not os.path.exists(workdir + '/' + tarname):
+ shutil.move(os.path.dirname(s) + '/' + tarname,workdir)
+ else:
+ return
+ return tarname
+
+def archive_patches(d,patchdir,series):
+ '''archive patches to tarball and also include series files if 'series' is True'''
+ import tarfile
+ import shutil
+
+ s = d.getVar('S',True)
+ work_dir = d.getVar('WORKDIR', True)
+ os.chdir(work_dir)
+ patch_dir = os.path.basename(patchdir)
+ tarname = patch_dir + ".tar.gz"
+ if series == 'all' and os.path.exists(s + '/patches/series'):
+ shutil.copy(s + '/patches/series',patch_dir)
+ tar = tarfile.open(tarname, "w:gz")
+ tar.add(patch_dir)
+ tar.close()
+ shutil.rmtree(patch_dir, ignore_errors=True)
+ return tarname
+
+def select_archive_patches(d,option):
+ '''select to archive all patches including non-applying and series or applying patches '''
+ if option == "all":
+ patchdir = get_all_patches(d)
+ elif option == "applying":
+ patchdir = get_applying_patches(d)
+ try:
+ os.rmdir(patchdir)
+ except OSError:
+ tarpatch = archive_patches(d,patchdir,option)
+ return tarpatch
+ return
+
+def archive_logs(d,logdir,bbinc=False):
+ '''archive logs in temp to tarball and .bb and .inc files if bbinc is True '''
+ import tarfile
+ import shutil
+
+ log_dir = os.path.basename(logdir)
+ pf = d.getVar('PF',True)
+ tarname = pf + '-' + log_dir + ".tar.gz"
+ tar = tarfile.open(tarname, "w:gz")
+ tar.add(log_dir)
+ tar.close()
+ if bbinc:
+ shutil.rmtree(log_dir, ignore_errors=True)
+ return tarname
+
+def get_licenses(d):
+ '''get licenses for running .bb file'''
+ licenses = d.getVar('LICENSE', 1).replace('&', '|')
+ licenses = licenses.replace('(', '').replace(')', '')
+ clean_licenses = ""
+ for x in licenses.split():
+ if x.strip() == '' or x == 'CLOSED':
+ continue
+ if x != "|":
+ clean_licenses += x
+ if '|' in clean_licenses:
+ clean_licenses = clean_licenses.replace('|','')
+ return clean_licenses
+
+
+def move_tarball_deploy(d,tarball_list):
+ '''move tarball in location to ${DEPLOY_DIR}/sources'''
+ import shutil
+
+ if tarball_list is []:
+ return
+ target_sys = d.getVar('TARGET_SYS', True)
+ pf = d.getVar('PF', True)
+ licenses = get_licenses(d)
+ tar_sources = d.getVar('DEPLOY_DIR', True) + '/sources/' + target_sys + '/' + licenses + '/' + pf
+ if not os.path.exists(tar_sources):
+ bb.mkdirhier(tar_sources)
+ for source in tarball_list:
+ if source:
+ if os.path.exists(tar_sources + '/' + source):
+ os.remove(tar_sources + '/' + source)
+ shutil.move(source,tar_sources)
+
+def verify_var(d):
+ '''check the type for archiving package('tar' or 'srpm')'''
+ try:
+ if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() not in d.getVar('ARCHIVE_TYPE', True).split():
+ raise AttributeError
+ except AttributeError:
+ bb.fatal("\"SOURCE_ARCHIVE_PACKAGE_TYPE\" is \'tar\' or \'srpm\', no other types")
+
+def archive_copyleft(d):
+ '''check if a package to archive is copy-left'''
+ if bb.data.inherits_class('copyleft_compliance', d):
+ included, reason = copyleft_should_include(d)
+ if not included:
+ return False
+ return True
+def archive_sources_patches(d,middle_name):
+ '''archive sources and patches to tarball. middle_name will append strings ${middle_name} to ${PR} as middle name. for example, zlib-1.4.6-prepatch(middle_name).tar.gz '''
+ verify_var(d)
+ if not_tarball(d):
+ return
+
+ source_tar_name = archive_sources(d,middle_name)
+ if middle_name == "prepatch":
+ if d.getVar('PATCHES_ARCHIVE_WITH_SERIES',True).upper() == 'TRUE':
+ patch_tar_name = select_archive_patches(d,"all")
+ elif d.getVar('PATCHES_ARCHIVE_WITH_SERIES',True).upper() == 'FALSE':
+ patch_tar_name = select_archive_patches(d,"applying")
+ else:
+ bb.fatal("Please define 'PATCHES_ARCHIVE_WITH_SERIES' is strings 'True' or 'False' ")
+ else:
+ patch_tar_name = ''
+
+ if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() not in 'SRPM':
+ move_tarball_deploy(d,[source_tar_name,patch_tar_name])
+
+def archive_sources_patches_logs_copyleft(d,middle_name):
+ '''archive source, patches and according to the variable "COPYLEFT_COMPLIANCE", If this variable is 'True', then archive the packages for copy-left, or else archive all packages'''
+ verify_var(d)
+ if not_tarball(d):
+ return
+ copyleft_compliance = d.getVar('COPYLEFT_COMPLIANCE', True)
+ if copyleft_compliance is None:
+ archive_sources_patches(d,middle_name)
+ elif copyleft_compliance.upper() == 'TRUE' and archive_copyleft(d):
+ archive_sources_patches(d,middle_name)
+
+
+def archive_scripts_logs(d):
+ '''archive scripts and logs. scripts include .bb and .inc files and logs include stuff in "temp".'''
+
+ s = d.getVar('WORKDIR', True)
+ os.chdir(s)
+ source_archive_log_with_scripts = d.getVar('SOURCE_ARCHIVE_LOG_WITH_SCRIPTS', True)
+ if source_archive_log_with_scripts == 'logs_with_scripts':
+ logdir = get_bb_inc(d)
+ tarlog = archive_logs(d,logdir,True)
+ elif source_archive_log_with_scripts == 'logs':
+ if os.path.exists('temp'):
+ archive_logs(d,'temp',False)
+ else:
+ return
+
+ if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() not in 'SRPM':
+ move_tarball_deploy(d,[tarlog])
+
+def archive_scripts_logs_copyleft(d):
+ '''archive logs according to the variable "COPYLEFT_COMPLIANCE", If this variable is 'True', then archive the packages for copy-left, or else archive all packages'''
+ verify_var(d)
+ if not d.getVar('SOURCE_ARCHIVE_LOG_WITH_SCRIPTS', True) or not_tarball(d):
+ return
+ copyleft_compliance = d.getVar('COPYLEFT_COMPLIANCE', True)
+ if copyleft_compliance is None:
+ archive_scripts_logs(d)
+ elif copyleft_compliance.upper() == 'TRUE' and archive_copyleft(d):
+ archive_scripts_logs(d)
+
+
+def dumpdata(d):
+ '''dump environment to "${P}-${PR}.showdata.dump" including all kinds of variables and functions when running a task'''
+ workdir = bb.data.getVar('WORKDIR', d, 1)
+ distro = bb.data.getVar('DISTRO', d, 1)
+ s = d.getVar('S', True)
+ pf = d.getVar('PF', True)
+ target_sys = d.getVar('TARGET_SYS', True)
+ licenses = get_licenses(d)
+ dumpdir = d.getVar('DEPLOY_DIR', True) + '/sources/' + target_sys + '/' + licenses + '/' + pf
+ if not os.path.exists(dumpdir):
+ bb.mkdirhier(dumpdir)
+
+ dumpfile = os.path.join(dumpdir, bb.data.expand("${P}-${PR}.showdata.dump",d))
+
+ bb.note("Dumping metadata into '%s'" % dumpfile)
+ f = open(dumpfile, "w")
+ # emit variables and shell functions
+ bb.data.emit_env(f, d, True)
+ # emit the metadata which isnt valid shell
+ for e in d.keys():
+ if bb.data.getVarFlag(e, 'python', d):
+ f.write("\npython %s () {\n%s}\n" % (e, bb.data.getVar(e, d, 1)))
+ f.close()
+
+
+
+def create_diff_gz(d):
+ '''creating .diff.gz in ${DEPLOY_DIR_SRC}/${P}-${PR}.diff.g gz for mapping all content in 's' including patches to xxx.diff.gz'''
+ import shutil
+
+ work_dir = d.getVar('WORKDIR', True)
+ exclude_from = d.getVar('EXCLUDE_FROM', True).split()
+ pf = d.getVar('PF', True)
+ licenses = get_licenses(d)
+ target_sys = d.getVar('TARGET_SYS', True)
+ diff_dir = d.getVar('DEPLOY_DIR', True) + '/sources/' + target_sys + '/' + licenses + '/' + pf
+ diff_file = os.path.join(diff_dir, bb.data.expand("${P}-${PR}.diff.gz",d))
+ os.chdir(work_dir)
+ f = open('temp/exclude-from-file', 'a')
+ for i in exclude_from:
+ f.write(i)
+ f.write("\n")
+ f.close()
+
+
+ s=d.getVar('S', True)
+ distro = d.getVar('DISTRO',True)
+ dest = s + '/' + distro + '/files'
+ if not os.path.exists(dest):
+ bb.mkdirhier(dest)
+ for i in os.listdir(os.getcwd()):
+ if os.path.isfile(i):
+ shutil.copy(i, dest)
+
+ bb.note("Creating .diff.gz in ${DEPLOY_DIR_SRC}/${P}-${PR}.diff.gz")
+ cmd = "LC_ALL=C TZ=UTC0 diff --exclude-from=" + work_dir + "/temp/exclude-from-file -Naur " + s + '.org' + ' ' + s + " | gzip -c > " + diff_file
+ d.setVar('DIFF', cmd + "\n")
+ d.setVarFlag('DIFF', 'func', '1')
+ bb.build.exec_func('DIFF', d)
+ shutil.rmtree(s + '.org', ignore_errors=True)
+
+# This function will run when user want to get tarball for sources and patches after do_unpack
+python do_archive_original_sources_patches(){
+ archive_sources_patches_logs_copyleft(d,'prepatch')
+}
+
+# This function will run when user want to get tarball for patched sources after do_patch
+python do_archive_patched_sources(){
+ archive_sources_patches_logs_copyleft(d,'patched')
+}
+
+# This function will run when user want to get tarball for configured sources after do_configure
+python do_archive_configured_sources(){
+ archive_sources_patches_logs_copyleft(d,'configured')
+}
+
+# This function will run when user want to get tarball for logs or both logs and scripts(.bb and .inc files)
+python do_archive_scripts_logs_copyleft(){
+ archive_scripts_logs_copyleft(d)
+}
+
+# This function will run when user want to know what variable and functions in a running task are and also can get a diff file including
+# all content a package should include.
+python do_dumpdata_create_diff_gz(){
+ dumpdata(d)
+ create_diff_gz(d)
+}
+
+# This functions prepare for archiving "linux-yocto" because this package create directory 's' before do_patch instead of after do_unpack.
+# This is special control for archiving linux-yocto only.
+python do_archive_linux_yocto(){
+ s = d.getVar('S', True)
+ if 'linux-yocto' in s:
+ source_tar_name = archive_sources(d,'')
+ if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() not in 'SRPM':
+ move_tarball_deploy(d,[source_tar_name,''])
+}
+do_kernel_checkout[postfuncs] += "do_archive_linux_yocto "
+
+# remove tarball for sources, patches and logs after creating srpm.
+python do_remove_tarball(){
+ if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() == 'SRPM':
+ work_dir = d.getVar('WORKDIR', True)
+ os.chdir(work_dir)
+ for file in os.listdir(os.getcwd()):
+ if '.tar.gz' in file:
+ os.remove(file)
+}
+do_remove_taball[deptask] = "do_archive_scripts_logs"
+do_package_write_rpm[postfuncs] += "do_remove_tarball "
--
1.7.0.4
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH 3/7] archive-patched-source.bbclass: Archive patched source
2012-03-13 12:52 [PATCH 0/7] Realize archiving functions Xiaofeng Yan
2012-03-13 12:52 ` [PATCH 1/7] package_rpm: Add srpm function to this bbclass Xiaofeng Yan
2012-03-13 12:52 ` [PATCH 2/7] archiver.bbclass: New bbclass for archiving sources, patches, logs and scripts Xiaofeng Yan
@ 2012-03-13 12:52 ` Xiaofeng Yan
2012-03-13 12:52 ` [PATCH 4/7] archive-configured-source.bbclass: Archive configured source Xiaofeng Yan
` (3 subsequent siblings)
6 siblings, 0 replies; 23+ messages in thread
From: Xiaofeng Yan @ 2012-03-13 12:52 UTC (permalink / raw)
To: openembedded-core
From: Xiaofeng Yan <xiaofeng.yan@windriver.com>
This bbclass inherits archiver.bbclass to archive patched source
[#YOCTO 1977]
Signed-off-by: Xiaofeng Yan <xiaofeng.yan@windriver.com>
---
meta/classes/archive-patched-source.bbclass | 14 ++++++++++++++
1 files changed, 14 insertions(+), 0 deletions(-)
create mode 100644 meta/classes/archive-patched-source.bbclass
diff --git a/meta/classes/archive-patched-source.bbclass b/meta/classes/archive-patched-source.bbclass
new file mode 100644
index 0000000..b3184b5
--- /dev/null
+++ b/meta/classes/archive-patched-source.bbclass
@@ -0,0 +1,14 @@
+# This file is for getting archiving packages with patched sources(archive 's' before do_patch stage),logs(archive 'temp' after package_write_rpm),dump data and
+# creating diff file(get all environment variables and functions in building and mapping all content in 's' including patches to xxx.diff.gz.
+# All archived packages will be deployed in ${DEPLOY_DIR}/sources
+
+inherit archiver
+
+# Get archiving package with patched sources including patches
+do_patch[postfuncs] += "do_archive_patched_sources "
+
+# Get archiving package with logs(temp) and scripts(.bb and .inc files)
+do_package_write_rpm[prefuncs] += "do_archive_scripts_logs_copyleft "
+
+# Get dump date and create diff file
+do_package_write_rpm[postfuncs] += "do_dumpdata_create_diff_gz "
--
1.7.0.4
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH 4/7] archive-configured-source.bbclass: Archive configured source
2012-03-13 12:52 [PATCH 0/7] Realize archiving functions Xiaofeng Yan
` (2 preceding siblings ...)
2012-03-13 12:52 ` [PATCH 3/7] archive-patched-source.bbclass: Archive patched source Xiaofeng Yan
@ 2012-03-13 12:52 ` Xiaofeng Yan
2012-03-13 12:52 ` [PATCH 5/7] archive-original-source.bbclass: Archive original source Xiaofeng Yan
` (2 subsequent siblings)
6 siblings, 0 replies; 23+ messages in thread
From: Xiaofeng Yan @ 2012-03-13 12:52 UTC (permalink / raw)
To: openembedded-core
From: Xiaofeng Yan <xiaofeng.yan@windriver.com>
This bbclass prepares for archiving configured source.
[#YOCTO 1977]
Signed-off-by: Xiaofeng Yan <xiaofeng.yan@windriver.com>
---
meta/classes/archive-configured-source.bbclass | 14 ++++++++++++++
1 files changed, 14 insertions(+), 0 deletions(-)
create mode 100644 meta/classes/archive-configured-source.bbclass
diff --git a/meta/classes/archive-configured-source.bbclass b/meta/classes/archive-configured-source.bbclass
new file mode 100644
index 0000000..5f9d444
--- /dev/null
+++ b/meta/classes/archive-configured-source.bbclass
@@ -0,0 +1,14 @@
+# This file is for getting archiving packages with configured sources(archive 's' after configure stage),logs(archive 'temp' after package_write_rpm),dump data
+# and creating diff file(get all environment variables and functions in building and mapping all content in 's' including patches to xxx.diff.gz.
+# All archived packages will be deployed in ${DEPLOY_DIR}/sources
+
+inherit archiver
+
+# Get archiving package with configured sources including patches
+do_configure[postfuncs] += "do_archive_configured_sources "
+
+# Get archiving package with temp(logs) and scripts(.bb and inc files)
+do_package_write_rpm[prefuncs] += "do_archive_scripts_logs_copyleft "
+
+# Get dump date and create diff file
+do_package_write_rpm[postfuncs] += "do_dumpdata_create_diff_gz "
--
1.7.0.4
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH 5/7] archive-original-source.bbclass: Archive original source
2012-03-13 12:52 [PATCH 0/7] Realize archiving functions Xiaofeng Yan
` (3 preceding siblings ...)
2012-03-13 12:52 ` [PATCH 4/7] archive-configured-source.bbclass: Archive configured source Xiaofeng Yan
@ 2012-03-13 12:52 ` Xiaofeng Yan
2012-03-13 12:52 ` [PATCH 6/7] local.conf.sample: Add set for archiving packages Xiaofeng Yan
2012-03-13 12:52 ` [PATCH 7/7] sourcepkg, src_distribute, src_distribute_local: remove three bbclass Xiaofeng Yan
6 siblings, 0 replies; 23+ messages in thread
From: Xiaofeng Yan @ 2012-03-13 12:52 UTC (permalink / raw)
To: openembedded-core
From: Xiaofeng Yan <xiaofeng.yan@windriver.com>
This bbclass prepares for archiving original source.
[#YOCTO 1977]
Signed-off-by: Xiaofeng Yan <xiaofeng.yan@windriver.com>
---
meta/classes/archive-original-source.bbclass | 14 ++++++++++++++
1 files changed, 14 insertions(+), 0 deletions(-)
create mode 100644 meta/classes/archive-original-source.bbclass
diff --git a/meta/classes/archive-original-source.bbclass b/meta/classes/archive-original-source.bbclass
new file mode 100644
index 0000000..d58c15f
--- /dev/null
+++ b/meta/classes/archive-original-source.bbclass
@@ -0,0 +1,14 @@
+# This file is for getting archiving packages with original sources(archive 's' after unpack stage),patches,logs(archive 'temp' after package_write_rpm),dump data and
+# creating diff file(get all environment variables and functions in building and mapping all content in 's' including patches to xxx.diff.gz.
+# All archived packages will be deployed in ${DEPLOY_DIR}/sources
+
+inherit archiver
+
+# Get original sources archiving package with patches
+do_unpack[postfuncs] += "do_archive_original_sources_patches "
+
+# Get archiving package with temp(logs) and scripts(.bb and inc files)
+do_package_write_rpm[prefuncs] += "do_archive_scripts_logs_copyleft "
+
+# Get dump date and create diff file
+do_package_write_rpm[postfuncs] += "do_dumpdata_create_diff_gz "
--
1.7.0.4
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH 6/7] local.conf.sample: Add set for archiving packages
2012-03-13 12:52 [PATCH 0/7] Realize archiving functions Xiaofeng Yan
` (4 preceding siblings ...)
2012-03-13 12:52 ` [PATCH 5/7] archive-original-source.bbclass: Archive original source Xiaofeng Yan
@ 2012-03-13 12:52 ` Xiaofeng Yan
2012-03-14 2:57 ` Saul Wold
2012-03-13 12:52 ` [PATCH 7/7] sourcepkg, src_distribute, src_distribute_local: remove three bbclass Xiaofeng Yan
6 siblings, 1 reply; 23+ messages in thread
From: Xiaofeng Yan @ 2012-03-13 12:52 UTC (permalink / raw)
To: openembedded-core
From: Xiaofeng Yan <xiaofeng.yan@windriver.com>
User can use these variables to get atchiving packages they want.
[YOCTO #1977]
Signed-off-by: Xiaofeng Yan <xiaofeng.yan@windriver.com>
---
meta-yocto/conf/local.conf.sample | 25 +++++++++++++++++++++++++
1 files changed, 25 insertions(+), 0 deletions(-)
diff --git a/meta-yocto/conf/local.conf.sample b/meta-yocto/conf/local.conf.sample
index 38507e3..6f16c9a 100644
--- a/meta-yocto/conf/local.conf.sample
+++ b/meta-yocto/conf/local.conf.sample
@@ -121,6 +121,31 @@ DISTRO ?= "poky"
PACKAGE_CLASSES ?= "package_rpm"
#
+# Archiving packages configuration
+#
+# The following variables lists which files to archive and the package type to archive.
+# One bbclass of them (archive-original-source.bbclass,archive-patched-source.bbclass
+# and archive-configured-source.bbclass) should be inherited in a globale bbclass, for example,
+# intherit archive-original-source in packages_rpm.bbclass
+#
+# SOURCE_ARCHIVE_PACKAGE_TYPE = {'tar','srpm'}
+#SOURCE_ARCHIVE_PACKAGE_TYPE ?= 'tar'
+#
+# SOURCE_ARCHIVE_LOG_WITH_SCRIPTS = {'logs_with_scripts', 'logs'}
+# String 'logs_with_scripts' include temp directory and .bb and .inc files
+# String 'logs' only include temp
+#SOURCE_ARCHIVE_LOG_WITH_SCRIPTS ?= 'logs_with_scripts'
+#
+# PATCHES_ARCHIVE_WITH_SERIES = {'true', 'false'}
+# Strings 'true' means that patches including series files(series + non-applying)
+# String 'false' means that no series and only archive applying patches
+#PATCHES_ARCHIVE_WITH_SERIES ?= 'true'
+#
+# Archive packages for copyleft(GPL*,LGPL*)
+#COPYLEFT_COMPLIANCE ?= 'true'
+#
+
+#
# SDK/ADT target architecture
#
# This variable specified the architecture to build SDK/ADT items for and means
--
1.7.0.4
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH 7/7] sourcepkg, src_distribute, src_distribute_local: remove three bbclass
2012-03-13 12:52 [PATCH 0/7] Realize archiving functions Xiaofeng Yan
` (5 preceding siblings ...)
2012-03-13 12:52 ` [PATCH 6/7] local.conf.sample: Add set for archiving packages Xiaofeng Yan
@ 2012-03-13 12:52 ` Xiaofeng Yan
6 siblings, 0 replies; 23+ messages in thread
From: Xiaofeng Yan @ 2012-03-13 12:52 UTC (permalink / raw)
To: openembedded-core
From: Xiaofeng Yan <xiaofeng.yan@windriver.com>
These bbclasses have been merged into archiver.bbclass.
[YOCTO #1977]
Signed-off-by: Xiaofeng Yan <xiaofeng.yan@windriver.com>
---
meta/classes/sourcepkg.bbclass | 107 -----------------------------
meta/classes/src_distribute.bbclass | 49 -------------
meta/classes/src_distribute_local.bbclass | 33 ---------
3 files changed, 0 insertions(+), 189 deletions(-)
delete mode 100644 meta/classes/sourcepkg.bbclass
delete mode 100644 meta/classes/src_distribute.bbclass
delete mode 100644 meta/classes/src_distribute_local.bbclass
diff --git a/meta/classes/sourcepkg.bbclass b/meta/classes/sourcepkg.bbclass
deleted file mode 100644
index 102c109..0000000
--- a/meta/classes/sourcepkg.bbclass
+++ /dev/null
@@ -1,107 +0,0 @@
-DEPLOY_DIR_SRC ?= "${DEPLOY_DIR}/source"
-EXCLUDE_FROM ?= ".pc autom4te.cache"
-
-# used as part of a path. make sure it's set
-DISTRO ?= "openembedded"
-
-def get_src_tree(d):
-
- workdir = d.getVar('WORKDIR', True)
- if not workdir:
- bb.error("WORKDIR not defined, unable to find source tree.")
- return
-
- s = d.getVar('S', 0)
- if not s:
- bb.error("S not defined, unable to find source tree.")
- return
-
- s_tree_raw = s.split('/')[1]
- s_tree = d.expand(s_tree_raw)
-
- src_tree_path = os.path.join(workdir, s_tree)
- try:
- os.listdir(src_tree_path)
- except OSError:
- bb.fatal("Expected to find source tree in '%s' which doesn't exist." % src_tree_path)
- bb.debug("Assuming source tree is '%s'" % src_tree_path)
-
- return s_tree
-
-sourcepkg_do_create_orig_tgz(){
-
- mkdir -p ${DEPLOY_DIR_SRC}
- cd ${WORKDIR}
- for i in ${EXCLUDE_FROM}; do
- echo $i >> temp/exclude-from-file
- done
-
- src_tree=${@get_src_tree(d)}
-
- echo $src_tree
- bbnote "Creating .orig.tar.gz in ${DEPLOY_DIR_SRC}/${P}.orig.tar.gz"
- tar cvzf ${DEPLOY_DIR_SRC}/${P}.orig.tar.gz --exclude-from temp/exclude-from-file $src_tree
- tar -cf - -C $src_tree -ps . | tar -xf - -C $src_tree.orig
-}
-
-sourcepkg_do_archive_bb() {
-
- src_tree=${@get_src_tree(d)}
- dest=${WORKDIR}/$src_tree/${DISTRO}
- mkdir -p $dest
-
- cp ${FILE} $dest
-}
-
-python sourcepkg_do_dumpdata() {
-
- workdir = d.getVar('WORKDIR', True)
- distro = d.getVar('DISTRO', True)
- s_tree = get_src_tree(d)
- openembeddeddir = os.path.join(workdir, s_tree, distro)
- dumpfile = os.path.join(openembeddeddir, d.expand("${P}-${PR}.showdata.dump"))
-
- try:
- os.mkdir(openembeddeddir)
- except OSError:
- # dir exists
- pass
-
- bb.note("Dumping metadata into '%s'" % dumpfile)
- f = open(dumpfile, "w")
- # emit variables and shell functions
- bb.data.emit_env(f, d, True)
- # emit the metadata which isnt valid shell
- for e in d.keys():
- if d.getVarFlag(e, 'python'):
- f.write("\npython %s () {\n%s}\n" % (e, d.getVar(e, True)))
- f.close()
-}
-
-sourcepkg_do_create_diff_gz(){
-
- cd ${WORKDIR}
- for i in ${EXCLUDE_FROM}; do
- echo $i >> temp/exclude-from-file
- done
-
-
- src_tree=${@get_src_tree(d)}
-
- for i in `find . -maxdepth 1 -type f`; do
- mkdir -p $src_tree/${DISTRO}/files
- cp $i $src_tree/${DISTRO}/files
- done
-
- bbnote "Creating .diff.gz in ${DEPLOY_DIR_SRC}/${P}-${PR}.diff.gz"
- LC_ALL=C TZ=UTC0 diff --exclude-from=temp/exclude-from-file -Naur $src_tree.orig $src_tree | gzip -c > ${DEPLOY_DIR_SRC}/${P}-${PR}.diff.gz
- rm -rf $src_tree.orig
-}
-
-EXPORT_FUNCTIONS do_create_orig_tgz do_archive_bb do_dumpdata do_create_diff_gz
-
-addtask create_orig_tgz after do_unpack before do_patch
-addtask archive_bb after do_patch before do_dumpdata
-addtask dumpdata after archive_bb before do_create_diff_gz
-addtask create_diff_gz after do_dump_data before do_configure
-
diff --git a/meta/classes/src_distribute.bbclass b/meta/classes/src_distribute.bbclass
deleted file mode 100644
index efa2720..0000000
--- a/meta/classes/src_distribute.bbclass
+++ /dev/null
@@ -1,49 +0,0 @@
-SRC_DISTRIBUTECOMMAND[func] = "1"
-python do_distribute_sources () {
- l = bb.data.createCopy(d)
- bb.data.update_data(l)
-
- sources_dir = d.getVar('SRC_DISTRIBUTEDIR', True)
- src_uri = d.getVar('SRC_URI', True).split()
- fetcher = bb.fetch2.Fetch(src_uri, d)
- ud = fetcher.ud
-
- licenses = d.getVar('LICENSE', True).replace('&', '|')
- licenses = licenses.replace('(', '').replace(')', '')
- clean_licenses = ""
- for x in licenses.split():
- if x.strip() == '' or x == 'CLOSED':
- continue
-
- if x != "|":
- clean_licenses += x
-
- for license in clean_licenses.split('|'):
- for url in ud.values():
- cmd = d.getVar('SRC_DISTRIBUTECOMMAND', True)
- if not cmd:
- raise bb.build.FuncFailed("Unable to distribute sources, SRC_DISTRIBUTECOMMAND not defined")
- url.setup_localpath(d)
- d.setVar('SRC', url.localpath)
- if url.type == 'file':
- if url.basename == '*':
- import os.path
- dest_dir = os.path.basename(os.path.dirname(os.path.abspath(url.localpath)))
- d.setVar('DEST', "%s_%s/" % (d.getVar('PF', True), dest_dir))
- else:
- d.setVar('DEST', "%s_%s" % (d.getVar('PF', True), url.basename))
- else:
- d.setVar('DEST', '')
-
- d.setVar('SRC_DISTRIBUTEDIR', "%s/%s" % (sources_dir, license))
- bb.build.exec_func('SRC_DISTRIBUTECOMMAND', d)
-}
-
-addtask distribute_sources before do_build after do_fetch
-
-addtask distribute_sources_all after do_distribute_sources
-do_distribute_sources_all[recrdeptask] = "do_distribute_sources"
-do_distribute_sources_all[nostamp] = "1"
-do_distribute_sources_all () {
- :
-}
diff --git a/meta/classes/src_distribute_local.bbclass b/meta/classes/src_distribute_local.bbclass
deleted file mode 100644
index 17b67e3..0000000
--- a/meta/classes/src_distribute_local.bbclass
+++ /dev/null
@@ -1,33 +0,0 @@
-inherit src_distribute
-
-# SRC_DIST_LOCAL possible values:
-# copy copies the files to the distributedir
-# symlink symlinks the files to the distributedir
-# move+symlink moves the files into distributedir, and symlinks them back
-SRC_DIST_LOCAL ?= "move+symlink"
-SRC_DISTRIBUTEDIR ?= "${DEPLOY_DIR}/sources"
-SRC_DISTRIBUTECOMMAND () {
- s="${SRC}"
- d="${DEST}"
-
- mkdir -p ${SRC_DISTRIBUTEDIR}
-
- if echo $d | grep -q '/$'; then
- mkdir -p ${SRC_DISTRIBUTEDIR}/$d
- fi
-
- case "${SRC_DIST_LOCAL}" in
- copy)
- test -e $s.md5 && cp -f $s.md5 ${SRC_DISTRIBUTEDIR}/$d.md5
- cp -f $s ${SRC_DISTRIBUTEDIR}/$d
- ;;
- symlink)
- test -e $s.md5 && ln -sf $s.md5 ${SRC_DISTRIBUTEDIR}/$d.md5
- ln -sf $s ${SRC_DISTRIBUTEDIR}/$d
- ;;
- move+symlink)
- mv $s ${SRC_DISTRIBUTEDIR}/$d
- ln -sf ${SRC_DISTRIBUTEDIR}/$d $s
- ;;
- esac
-}
--
1.7.0.4
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH 1/7] package_rpm: Add srpm function to this bbclass
2012-03-13 12:52 ` [PATCH 1/7] package_rpm: Add srpm function to this bbclass Xiaofeng Yan
@ 2012-03-13 23:24 ` Saul Wold
2012-03-14 12:27 ` Xiaofeng Yan
0 siblings, 1 reply; 23+ messages in thread
From: Saul Wold @ 2012-03-13 23:24 UTC (permalink / raw)
To: Patches and discussions about the oe-core layer
On 03/13/2012 05:52 AM, Xiaofeng Yan wrote:
> From: Xiaofeng Yan<xiaofeng.yan@windriver.com>
>
> Add a new function to archive source, patches and logs to a source rpm
> package. Every source rpm package will be deployed to
> ${DEPLOY_DIR}/sources/deploy-srpm.
>
> [YOCTO #1977]
>
> Signed-off-by: Xiaofeng Yan<xiaofeng.yan@windriver.com>
> ---
> meta/classes/package_rpm.bbclass | 63 ++++++++++++++++++++++++++++++++++++++
> 1 files changed, 63 insertions(+), 0 deletions(-)
>
> diff --git a/meta/classes/package_rpm.bbclass b/meta/classes/package_rpm.bbclass
> index 68313ec..b261a0e 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 = "${DEPLOY_DIR}/sources/deploy-srpm"
>
> python package_rpm_fn () {
> d.setVar('PKGFN', d.getVar('PKG'))
> @@ -475,6 +476,37 @@ python write_specfile () {
> import textwrap
> import oe.packagedata
>
> + # append information for logs and patches to %prep
> + def add_prep(d,spec_files_bottom):
> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True) and d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() == 'SRPM':
> + spec_files_bottom.append('%%prep -n %s' % d.getVar('PN', True) )
> + spec_files_bottom.append('%s' % "echo \"include logs and patches, Please check them in SOURCES\"")
> + spec_files_bottom.append('')
> +
> + # get the name of tarball for sources, patches and logs
> + def get_tarballs(d):
> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True) and d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() == 'SRPM':
> + sourcelist=[]
> + workdir = d.getVar('WORKDIR',True)
> + print os.listdir(workdir)
> + for source in os.listdir(workdir):
> + if 'tar.gz' in source:
> + sourcelist.append(source)
> + return sourcelist
What happens here is there are some other tar.gz file in the WORKDIR?
Is there a way to ensure you just get the tarballs you are looking for?
> +
> + # append the name of tarball to key word 'SOURCE' in xxx.spec.
> + def tail_source(d,source_list=[],patch_list=None):
> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True) and d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() == 'SRPM':
> + source_number = 0
> + patch_number = 0
> + for source in source_list:
> + spec_preamble_top.append('Source' + str(source_number) + ': %s' % source)
> + source_number += 1
> + if patch_list:
> + for patch in patch_list:
> + print_deps(patch, "Patch" + str(patch_number), spec_preamble_top, d)
> + patch_number += 1
> +
> # We need a simple way to remove the MLPREFIX from the package name,
> # and dependency information...
> def strip_multilib(name, d):
> @@ -707,6 +739,8 @@ python write_specfile () {
> spec_preamble_bottom.append('License: %s' % splitlicense)
> spec_preamble_bottom.append('Group: %s' % splitsection)
>
> + source_list = get_tarballs(d)
> + tail_source(d,source_list,None)
> # Replaces == Obsoletes&& Provides
> if splitrreplaces and splitrreplaces.strip() != "":
> for dep in splitrreplaces.split(','):
> @@ -786,6 +820,7 @@ python write_specfile () {
> del localdata
> bb.utils.unlockfile(lf)
>
> + add_prep(d,spec_files_bottom)
> spec_preamble_top.append('Summary: %s' % srcsummary)
> spec_preamble_top.append('Name: %s' % srcname)
> spec_preamble_top.append('Version: %s' % srcversion)
> @@ -900,6 +935,25 @@ python write_specfile () {
> python do_package_rpm () {
> import os
>
> + def creat_srpm_dir(d):
> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True) and d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() == 'SRPM':
> + licenses = d.getVar('LICENSE', 1).replace('&', '|')
> + licenses = licenses.replace('(', '').replace(')', '')
> + clean_licenses = ""
> + for x in licenses.split():
> + if x.strip() == '' or x == 'CLOSED':
What about "Proprietary"
> + continue
> + if x != "|":
> + clean_licenses += x
> + if '|' in clean_licenses:
> + clean_licenses = clean_licenses.replace('|','')
> +
Maybe this spinet should be a function in license.bbclass? Maybe it's
there already, or is this too RPM specific?
> + pkgwritesrpmdir = bb.data.expand('${PKGWRITEDIRSRPM}/${PACKAGE_ARCH_EXTEND}', d)
> + pkgwritesrpmdir = pkgwritesrpmdir + '/' + clean_licenses
> + bb.mkdirhier(pkgwritesrpmdir)
> + os.chmod(pkgwritesrpmdir, 0755)
> + return pkgwritesrpmdir
> +
> # We need a simple way to remove the MLPREFIX from the package name,
> # and dependency information...
> def strip_multilib(name, d):
> @@ -1015,8 +1069,17 @@ python do_package_rpm () {
> cmd = cmd + " --define 'debug_package %{nil}'"
> cmd = cmd + " --define '_rpmfc_magic_path " + magicfile + "'"
> cmd = cmd + " --define '_tmppath " + workdir + "'"
> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True) and d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() == 'SRPM':
> + cmdsrpm = cmd + " --define '_sourcedir " + workdir + "' --define '_srcrpmdir " + creat_srpm_dir(d) + "'"
> + cmdsrpm = 'fakeroot ' + cmdsrpm + " -bs " + outspecfile
> cmd = cmd + " -bb " + outspecfile
>
> + # Build the source rpm package !
> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True) and d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() == '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] 23+ messages in thread
* Re: [PATCH 2/7] archiver.bbclass: New bbclass for archiving sources, patches, logs and scripts
2012-03-13 12:52 ` [PATCH 2/7] archiver.bbclass: New bbclass for archiving sources, patches, logs and scripts Xiaofeng Yan
@ 2012-03-14 2:57 ` Saul Wold
2012-03-14 12:30 ` Xiaofeng Yan
0 siblings, 1 reply; 23+ messages in thread
From: Saul Wold @ 2012-03-14 2:57 UTC (permalink / raw)
To: Patches and discussions about the oe-core layer
On 03/13/2012 05:52 AM, Xiaofeng Yan wrote:
> From: Xiaofeng Yan<xiaofeng.yan@windriver.com>
>
> 1 Archive sources in ${S} in the different stage (do_unpack,do_patch,do_configure).
> 2 Archive patches including series
> 3 Archive logs including scripts (.bb and .inc files)
> 4 dump environment resources which show all variable and
> functions used to xxx.showdata.dump when running a task
> 5 dump all content in 's' including patches to file xxx.diff.gz
>
> All archiving packages will be deployed to ${DEPLOY_DIR}/sources/
>
> [#YOCTO 1977]
>
Xiaofeng,
I am making a first pass on this, there might be more, after I use it to
create archives.
Sau!
> Signed-off-by: Xiaofeng Yan<xiaofeng.yan@windriver.com>
> ---
> meta/classes/archiver.bbclass | 421 +++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 421 insertions(+), 0 deletions(-)
> create mode 100644 meta/classes/archiver.bbclass
>
> diff --git a/meta/classes/archiver.bbclass b/meta/classes/archiver.bbclass
> new file mode 100644
> index 0000000..95e870d
> --- /dev/null
> +++ b/meta/classes/archiver.bbclass
> @@ -0,0 +1,421 @@
> +# This file is used for archiving sources ,patches,and logs to tarball.
> +# It also output building environment to xxx.dump.data and create xxx.diff.gz to record
> +# all content in ${S} to a diff file.
> +
> +EXCLUDE_FROM ?= ".pc autom4te.cache"
> +ARCHIVE_TYPE ?= "TAR SRPM"
> +DISTRO ?= "poky"
> +
> +def parse_var(d,var):
> + ''' parse variable like ${PV} in "require xxx_${PV}.inc" to a real value. for example, change "require xxx_${PV}.inc" to "require xxx_1.2.inc" '''
> + import re
> + pat = re.compile('.*\$({(.*)}).*')
> + if '$' not in var and '/' not in var:
> + return var
> + else:
> + if '/' in var:
> + return [i for i in var.split('/') if i.endswith('.inc')][0]
> + elif '$' in var:
> + m = pat.match(var)
> + patstr = '\$' + m.group(1)
> + var_str = m.group(2)
> + return re.sub(patstr,d.getVar(var_str,True),var)
> + else:
> + return var
> +
> +
> +def get_bb_inc(d):
> + '''create a directory "script-logs" including .bb and .inc file in ${WORKDIR}'''
> + import re
> + import os
> + import shutil
> +
> + bbinc = []
> + pat=re.compile('require\s*([^\s]*\.*)(.*)')
> + file_dir = d.getVar('FILE', True)
> + bbdir = os.path.dirname(file_dir)
> + work_dir = d.getVar('WORKDIR', True)
> + os.chdir(work_dir)
> + bb.mkdirhier("script-logs")
> + os.chdir(bbdir)
> + bbfile = os.path.basename(file_dir)
> + bbinc.append(bbfile)
> +
> + def get_inc (file):
> + f = open(file,'r')
> + for line in f.readlines():
> + if 'require' not in line:
> + bbinc.append(file)
> + else:
> + try:
> + incfile = pat.match(line).group(1)
> + incfile = parse_var(d,incfile)
> + bbinc.append(incfile)
> + get_inc(incfile)
> + except AttributeError:
> + pass
> + get_inc(bbfile)
> + os.chdir(work_dir)
> + for root, dirs, files in os.walk(bbdir):
> + for file in bbinc:
> + if file in files:
> + shutil.copy(root + '/' + file,'script-logs')
> + oe.path.copytree('temp', 'script-logs')
> + return work_dir + '/script-logs'
> +
> +def get_all_patches(d):
> + '''copy patches and series file to a pointed directory which will be archived to tarball in ${WORKDIR}'''
> + import shutil
> +
> + src_patches=[]
> + pf = d.getVar('PF', True)
> + work_dir = d.getVar('WORKDIR', True)
> + dest = os.path.join(work_dir, pf + '-patches')
> + shutil.rmtree(dest, ignore_errors=True)
> + bb.mkdirhier(dest)
> +
> + src_uri = d.getVar('SRC_URI', 1).split()
> + fetch = bb.fetch2.Fetch(src_uri, d)
> + locals = (fetch.localpath(url) for url in fetch.urls)
> + for local in locals:
> + src_patches.append(local)
> + for patch in src_patches[1:]:
> + shutil.copy(patch,dest)
> + return dest
> +
> +def get_applying_patches(d):
> + """only copy applying patches to a pointed directory which will be archived to tarball"""
> + import os
> + import shutil
> +
> +
> + pf = d.getVar('PF', True)
> + work_dir = d.getVar('WORKDIR', True)
> + dest = os.path.join(work_dir, pf + '-patches')
> + shutil.rmtree(dest, ignore_errors=True)
> + bb.mkdirhier(dest)
> +
> +
> + patches = src_patches(d)
> + for patch in patches:
> + _, _, local, _, _, parm = bb.decodeurl(patch)
> + if local:
> + shutil.copy(local,dest)
> + return dest
> +
> +def not_tarball(d):
> + '''packages including key words 'work-shared','native', 'task-' will be passed'''
> + import os
> +
> + workdir = d.getVar('WORKDIR',True)
> + s = d.getVar('S',True)
> + if 'work-shared' in s or 'task-' in workdir or 'native' in workdir:
> + return True
> + else:
> + return False
> +
> +def archive_sources(d,middle_name):
> + '''archive sources codes tree to tarball'''
> + import tarfile
> + import shutil
> +
> + s = d.getVar('S',True)
> + workdir=d.getVar('WORKDIR', True)
> + PF = d.getVar('PF',True)
> + tarname = PF + '-' + middle_name + ".tar.gz"
> +
> + 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)
> + try:
> + for file in os.listdir(s):
> + if file is not 'temp' and file is not sourcedir:
> + shutil.copy(file,sourcedir)
> + except (IOError,OSError):
> + pass
> +
> +
> + if (len(os.listdir(sourcedir))) != 0:
> + tar = tarfile.open( tarname, "w:gz")
> + tar.add(sourcedir)
> + tar.close()
> + if cmp(workdir,os.path.dirname(s)) and not os.path.exists(workdir + '/' + tarname):
> + shutil.move(os.path.dirname(s) + '/' + tarname,workdir)
> + else:
> + return
> + return tarname
> +
> +def archive_patches(d,patchdir,series):
> + '''archive patches to tarball and also include series files if 'series' is True'''
> + import tarfile
> + import shutil
> +
> + s = d.getVar('S',True)
> + work_dir = d.getVar('WORKDIR', True)
> + os.chdir(work_dir)
> + patch_dir = os.path.basename(patchdir)
> + tarname = patch_dir + ".tar.gz"
> + if series == 'all' and os.path.exists(s + '/patches/series'):
> + shutil.copy(s + '/patches/series',patch_dir)
> + tar = tarfile.open(tarname, "w:gz")
> + tar.add(patch_dir)
> + tar.close()
> + shutil.rmtree(patch_dir, ignore_errors=True)
> + return tarname
> +
> +def select_archive_patches(d,option):
> + '''select to archive all patches including non-applying and series or applying patches '''
> + if option == "all":
> + patchdir = get_all_patches(d)
> + elif option == "applying":
> + patchdir = get_applying_patches(d)
> + try:
> + os.rmdir(patchdir)
> + except OSError:
> + tarpatch = archive_patches(d,patchdir,option)
> + return tarpatch
> + return
> +
> +def archive_logs(d,logdir,bbinc=False):
> + '''archive logs in temp to tarball and .bb and .inc files if bbinc is True '''
> + import tarfile
> + import shutil
> +
> + log_dir = os.path.basename(logdir)
> + pf = d.getVar('PF',True)
> + tarname = pf + '-' + log_dir + ".tar.gz"
> + tar = tarfile.open(tarname, "w:gz")
> + tar.add(log_dir)
> + tar.close()
> + if bbinc:
> + shutil.rmtree(log_dir, ignore_errors=True)
> + return tarname
> +
> +def get_licenses(d):
> + '''get licenses for running .bb file'''
> + licenses = d.getVar('LICENSE', 1).replace('&', '|')
> + licenses = licenses.replace('(', '').replace(')', '')
> + clean_licenses = ""
> + for x in licenses.split():
> + if x.strip() == '' or x == 'CLOSED':
> + continue
> + if x != "|":
> + clean_licenses += x
> + if '|' in clean_licenses:
> + clean_licenses = clean_licenses.replace('|','')
> + return clean_licenses
> +
This seems to be duplicated in your RPM code also? Move to
licenses.bbclass maybe?
> +
> +def move_tarball_deploy(d,tarball_list):
> + '''move tarball in location to ${DEPLOY_DIR}/sources'''
> + import shutil
> +
> + if tarball_list is []:
> + return
> + target_sys = d.getVar('TARGET_SYS', True)
> + pf = d.getVar('PF', True)
> + licenses = get_licenses(d)
> + tar_sources = d.getVar('DEPLOY_DIR', True) + '/sources/' + target_sys + '/' + licenses + '/' + pf
> + if not os.path.exists(tar_sources):
> + bb.mkdirhier(tar_sources)
> + for source in tarball_list:
> + if source:
> + if os.path.exists(tar_sources + '/' + source):
> + os.remove(tar_sources + '/' + source)
> + shutil.move(source,tar_sources)
> +
> +def verify_var(d):
> + '''check the type for archiving package('tar' or 'srpm')'''
> + try:
> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() not in d.getVar('ARCHIVE_TYPE', True).split():
> + raise AttributeError
> + except AttributeError:
> + bb.fatal("\"SOURCE_ARCHIVE_PACKAGE_TYPE\" is \'tar\' or \'srpm\', no other types")
> +
> +def archive_copyleft(d):
> + '''check if a package to archive is copy-left'''
> + if bb.data.inherits_class('copyleft_compliance', d):
> + included, reason = copyleft_should_include(d)
> + if not included:
> + return False
> + return True
> +def archive_sources_patches(d,middle_name):
> + '''archive sources and patches to tarball. middle_name will append strings ${middle_name} to ${PR} as middle name. for example, zlib-1.4.6-prepatch(middle_name).tar.gz '''
> + verify_var(d)
> + if not_tarball(d):
> + return
> +
> + source_tar_name = archive_sources(d,middle_name)
> + if middle_name == "prepatch":
> + if d.getVar('PATCHES_ARCHIVE_WITH_SERIES',True).upper() == 'TRUE':
> + patch_tar_name = select_archive_patches(d,"all")
> + elif d.getVar('PATCHES_ARCHIVE_WITH_SERIES',True).upper() == 'FALSE':
> + patch_tar_name = select_archive_patches(d,"applying")
> + else:
> + bb.fatal("Please define 'PATCHES_ARCHIVE_WITH_SERIES' is strings 'True' or 'False' ")
> + else:
> + patch_tar_name = ''
> +
> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() not in 'SRPM':
> + move_tarball_deploy(d,[source_tar_name,patch_tar_name])
> +
> +def archive_sources_patches_logs_copyleft(d,middle_name):
> + '''archive source, patches and according to the variable "COPYLEFT_COMPLIANCE", If this variable is 'True', then archive the packages for copy-left, or else archive all packages'''
> + verify_var(d)
> + if not_tarball(d):
> + return
> + copyleft_compliance = d.getVar('COPYLEFT_COMPLIANCE', True)
> + if copyleft_compliance is None:
> + archive_sources_patches(d,middle_name)
> + elif copyleft_compliance.upper() == 'TRUE' and archive_copyleft(d):
> + archive_sources_patches(d,middle_name)
> +
> +
> +def archive_scripts_logs(d):
> + '''archive scripts and logs. scripts include .bb and .inc files and logs include stuff in "temp".'''
> +
> + s = d.getVar('WORKDIR', True)
> + os.chdir(s)
> + source_archive_log_with_scripts = d.getVar('SOURCE_ARCHIVE_LOG_WITH_SCRIPTS', True)
> + if source_archive_log_with_scripts == 'logs_with_scripts':
> + logdir = get_bb_inc(d)
> + tarlog = archive_logs(d,logdir,True)
> + elif source_archive_log_with_scripts == 'logs':
> + if os.path.exists('temp'):
> + archive_logs(d,'temp',False)
> + else:
> + return
> +
> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() not in 'SRPM':
> + move_tarball_deploy(d,[tarlog])
> +
> +def archive_scripts_logs_copyleft(d):
> + '''archive logs according to the variable "COPYLEFT_COMPLIANCE", If this variable is 'True', then archive the packages for copy-left, or else archive all packages'''
> + verify_var(d)
> + if not d.getVar('SOURCE_ARCHIVE_LOG_WITH_SCRIPTS', True) or not_tarball(d):
> + return
> + copyleft_compliance = d.getVar('COPYLEFT_COMPLIANCE', True)
> + if copyleft_compliance is None:
> + archive_scripts_logs(d)
> + elif copyleft_compliance.upper() == 'TRUE' and archive_copyleft(d):
> + archive_scripts_logs(d)
> +
> +
> +def dumpdata(d):
> + '''dump environment to "${P}-${PR}.showdata.dump" including all kinds of variables and functions when running a task'''
> + workdir = bb.data.getVar('WORKDIR', d, 1)
> + distro = bb.data.getVar('DISTRO', d, 1)
> + s = d.getVar('S', True)
> + pf = d.getVar('PF', True)
> + target_sys = d.getVar('TARGET_SYS', True)
> + licenses = get_licenses(d)
> + dumpdir = d.getVar('DEPLOY_DIR', True) + '/sources/' + target_sys + '/' + licenses + '/' + pf
> + if not os.path.exists(dumpdir):
> + bb.mkdirhier(dumpdir)
> +
> + dumpfile = os.path.join(dumpdir, bb.data.expand("${P}-${PR}.showdata.dump",d))
> +
> + bb.note("Dumping metadata into '%s'" % dumpfile)
> + f = open(dumpfile, "w")
> + # emit variables and shell functions
> + bb.data.emit_env(f, d, True)
> + # emit the metadata which isnt valid shell
> + for e in d.keys():
> + if bb.data.getVarFlag(e, 'python', d):
> + f.write("\npython %s () {\n%s}\n" % (e, bb.data.getVar(e, d, 1)))
> + f.close()
> +
> +
> +
> +def create_diff_gz(d):
> + '''creating .diff.gz in ${DEPLOY_DIR_SRC}/${P}-${PR}.diff.g gz for mapping all content in 's' including patches to xxx.diff.gz'''
> + import shutil
> +
> + work_dir = d.getVar('WORKDIR', True)
> + exclude_from = d.getVar('EXCLUDE_FROM', True).split()
> + pf = d.getVar('PF', True)
> + licenses = get_licenses(d)
> + target_sys = d.getVar('TARGET_SYS', True)
> + diff_dir = d.getVar('DEPLOY_DIR', True) + '/sources/' + target_sys + '/' + licenses + '/' + pf
> + diff_file = os.path.join(diff_dir, bb.data.expand("${P}-${PR}.diff.gz",d))
> + os.chdir(work_dir)
> + f = open('temp/exclude-from-file', 'a')
> + for i in exclude_from:
> + f.write(i)
> + f.write("\n")
> + f.close()
> +
> +
> + s=d.getVar('S', True)
> + distro = d.getVar('DISTRO',True)
> + dest = s + '/' + distro + '/files'
> + if not os.path.exists(dest):
> + bb.mkdirhier(dest)
> + for i in os.listdir(os.getcwd()):
> + if os.path.isfile(i):
> + shutil.copy(i, dest)
> +
> + bb.note("Creating .diff.gz in ${DEPLOY_DIR_SRC}/${P}-${PR}.diff.gz")
> + cmd = "LC_ALL=C TZ=UTC0 diff --exclude-from=" + work_dir + "/temp/exclude-from-file -Naur " + s + '.org' + ' ' + s + " | gzip -c> " + diff_file
> + d.setVar('DIFF', cmd + "\n")
> + d.setVarFlag('DIFF', 'func', '1')
> + bb.build.exec_func('DIFF', d)
> + shutil.rmtree(s + '.org', ignore_errors=True)
> +
> +# This function will run when user want to get tarball for sources and patches after do_unpack
> +python do_archive_original_sources_patches(){
> + archive_sources_patches_logs_copyleft(d,'prepatch')
> +}
> +
> +# This function will run when user want to get tarball for patched sources after do_patch
> +python do_archive_patched_sources(){
> + archive_sources_patches_logs_copyleft(d,'patched')
> +}
> +
> +# This function will run when user want to get tarball for configured sources after do_configure
> +python do_archive_configured_sources(){
> + archive_sources_patches_logs_copyleft(d,'configured')
> +}
> +
> +# This function will run when user want to get tarball for logs or both logs and scripts(.bb and .inc files)
> +python do_archive_scripts_logs_copyleft(){
> + archive_scripts_logs_copyleft(d)
> +}
> +
> +# This function will run when user want to know what variable and functions in a running task are and also can get a diff file including
> +# all content a package should include.
> +python do_dumpdata_create_diff_gz(){
> + dumpdata(d)
> + create_diff_gz(d)
> +}
> +
> +# This functions prepare for archiving "linux-yocto" because this package create directory 's' before do_patch instead of after do_unpack.
> +# This is special control for archiving linux-yocto only.
> +python do_archive_linux_yocto(){
> + s = d.getVar('S', True)
> + if 'linux-yocto' in s:
> + source_tar_name = archive_sources(d,'')
> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() not in 'SRPM':
> + move_tarball_deploy(d,[source_tar_name,''])
> +}
> +do_kernel_checkout[postfuncs] += "do_archive_linux_yocto "
> +
> +# remove tarball for sources, patches and logs after creating srpm.
> +python do_remove_tarball(){
> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() == 'SRPM':
> + work_dir = d.getVar('WORKDIR', True)
> + os.chdir(work_dir)
> + for file in os.listdir(os.getcwd()):
> + if '.tar.gz' in file:
> + os.remove(file)
As I mentioned in the RPM code, this might not be the best way to do
this, and it could break builds if you remove a tarball that's expected
to be there.
Maybe store the tarballs in a ${WORKDIR}/.. directory (same level as temp).
> +}
> +do_remove_taball[deptask] = "do_archive_scripts_logs"
> +do_package_write_rpm[postfuncs] += "do_remove_tarball "
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 6/7] local.conf.sample: Add set for archiving packages
2012-03-13 12:52 ` [PATCH 6/7] local.conf.sample: Add set for archiving packages Xiaofeng Yan
@ 2012-03-14 2:57 ` Saul Wold
2012-03-14 5:37 ` Xiaofeng Yan
0 siblings, 1 reply; 23+ messages in thread
From: Saul Wold @ 2012-03-14 2:57 UTC (permalink / raw)
To: Patches and discussions about the oe-core layer
On 03/13/2012 05:52 AM, Xiaofeng Yan wrote:
> From: Xiaofeng Yan<xiaofeng.yan@windriver.com>
>
> User can use these variables to get atchiving packages they want.
>
> [YOCTO #1977]
>
> Signed-off-by: Xiaofeng Yan<xiaofeng.yan@windriver.com>
> ---
> meta-yocto/conf/local.conf.sample | 25 +++++++++++++++++++++++++
> 1 files changed, 25 insertions(+), 0 deletions(-)
>
> diff --git a/meta-yocto/conf/local.conf.sample b/meta-yocto/conf/local.conf.sample
> index 38507e3..6f16c9a 100644
> --- a/meta-yocto/conf/local.conf.sample
> +++ b/meta-yocto/conf/local.conf.sample
> @@ -121,6 +121,31 @@ DISTRO ?= "poky"
> PACKAGE_CLASSES ?= "package_rpm"
>
> #
> +# Archiving packages configuration
> +#
> +# The following variables lists which files to archive and the package type to archive.
> +# One bbclass of them (archive-original-source.bbclass,archive-patched-source.bbclass
> +# and archive-configured-source.bbclass) should be inherited in a globale bbclass, for example,
> +# intherit archive-original-source in packages_rpm.bbclass
> +#
> +# SOURCE_ARCHIVE_PACKAGE_TYPE = {'tar','srpm'}
> +#SOURCE_ARCHIVE_PACKAGE_TYPE ?= 'tar'
> +#
> +# SOURCE_ARCHIVE_LOG_WITH_SCRIPTS = {'logs_with_scripts', 'logs'}
> +# String 'logs_with_scripts' include temp directory and .bb and .inc files
> +# String 'logs' only include temp
> +#SOURCE_ARCHIVE_LOG_WITH_SCRIPTS ?= 'logs_with_scripts'
> +#
> +# PATCHES_ARCHIVE_WITH_SERIES = {'true', 'false'}
> +# Strings 'true' means that patches including series files(series + non-applying)
> +# String 'false' means that no series and only archive applying patches
> +#PATCHES_ARCHIVE_WITH_SERIES ?= 'true'
> +#
Why the distinction? Also, you seem to translate this to all or
applying, so why not just use those terms here and always include the
series file?
The PATCHES_ARCHIVE_WITH_SERIES does not really make sense when
non-applying is added in.
> +# Archive packages for copyleft(GPL*,LGPL*)
> +#COPYLEFT_COMPLIANCE ?= 'true'
> +#
> +
> +#
> # SDK/ADT target architecture
> #
> # This variable specified the architecture to build SDK/ADT items for and means
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 6/7] local.conf.sample: Add set for archiving packages
2012-03-14 2:57 ` Saul Wold
@ 2012-03-14 5:37 ` Xiaofeng Yan
0 siblings, 0 replies; 23+ messages in thread
From: Xiaofeng Yan @ 2012-03-14 5:37 UTC (permalink / raw)
To: Saul Wold; +Cc: Patches and discussions about the oe-core layer
On 2012年03月14日 10:57, Saul Wold wrote:
> On 03/13/2012 05:52 AM, Xiaofeng Yan wrote:
>> From: Xiaofeng Yan<xiaofeng.yan@windriver.com>
>>
>> User can use these variables to get atchiving packages they want.
>>
>> [YOCTO #1977]
>>
>> Signed-off-by: Xiaofeng Yan<xiaofeng.yan@windriver.com>
>> ---
>> meta-yocto/conf/local.conf.sample | 25 +++++++++++++++++++++++++
>> 1 files changed, 25 insertions(+), 0 deletions(-)
>>
>> diff --git a/meta-yocto/conf/local.conf.sample
>> b/meta-yocto/conf/local.conf.sample
>> index 38507e3..6f16c9a 100644
>> --- a/meta-yocto/conf/local.conf.sample
>> +++ b/meta-yocto/conf/local.conf.sample
>> @@ -121,6 +121,31 @@ DISTRO ?= "poky"
>> PACKAGE_CLASSES ?= "package_rpm"
>>
>> #
>> +# Archiving packages configuration
>> +#
>> +# The following variables lists which files to archive and the
>> package type to archive.
>> +# One bbclass of them
>> (archive-original-source.bbclass,archive-patched-source.bbclass
>> +# and archive-configured-source.bbclass) should be inherited in a
>> globale bbclass, for example,
>> +# intherit archive-original-source in packages_rpm.bbclass
>> +#
>> +# SOURCE_ARCHIVE_PACKAGE_TYPE = {'tar','srpm'}
>> +#SOURCE_ARCHIVE_PACKAGE_TYPE ?= 'tar'
>> +#
>> +# SOURCE_ARCHIVE_LOG_WITH_SCRIPTS = {'logs_with_scripts', 'logs'}
>> +# String 'logs_with_scripts' include temp directory and .bb and .inc
>> files
>> +# String 'logs' only include temp
>> +#SOURCE_ARCHIVE_LOG_WITH_SCRIPTS ?= 'logs_with_scripts'
>> +#
>> +# PATCHES_ARCHIVE_WITH_SERIES = {'true', 'false'}
>> +# Strings 'true' means that patches including series files(series +
>> non-applying)
>> +# String 'false' means that no series and only archive applying patches
>> +#PATCHES_ARCHIVE_WITH_SERIES ?= 'true'
>> +#
> Why the distinction? Also, you seem to translate this to all or
> applying, so why not just use those terms here and always include the
> series file?
>
I will remove this set and modify archiver.bbclass to including series
as the default set.
> The PATCHES_ARCHIVE_WITH_SERIES does not really make sense when
> non-applying is added in.
>> +# Archive packages for copyleft(GPL*,LGPL*)
>> +#COPYLEFT_COMPLIANCE ?= 'true'
>> +#
>> +
>> +#
>> # SDK/ADT target architecture
>> #
>> # This variable specified the architecture to build SDK/ADT items for
>> and means
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 1/7] package_rpm: Add srpm function to this bbclass
2012-03-13 23:24 ` Saul Wold
@ 2012-03-14 12:27 ` Xiaofeng Yan
0 siblings, 0 replies; 23+ messages in thread
From: Xiaofeng Yan @ 2012-03-14 12:27 UTC (permalink / raw)
To: Saul Wold; +Cc: Patches and discussions about the oe-core layer
Hi Saul,
Thanks for your detailed comment
On 2012年03月14日 07:24, Saul Wold wrote:
> On 03/13/2012 05:52 AM, Xiaofeng Yan wrote:
>> From: Xiaofeng Yan<xiaofeng.yan@windriver.com>
>>
>> Add a new function to archive source, patches and logs to a source rpm
>> package. Every source rpm package will be deployed to
>> ${DEPLOY_DIR}/sources/deploy-srpm.
>>
>> [YOCTO #1977]
>>
>> Signed-off-by: Xiaofeng Yan<xiaofeng.yan@windriver.com>
>> ---
>> meta/classes/package_rpm.bbclass | 63
>> ++++++++++++++++++++++++++++++++++++++
>> 1 files changed, 63 insertions(+), 0 deletions(-)
>>
>> diff --git a/meta/classes/package_rpm.bbclass
>> b/meta/classes/package_rpm.bbclass
>> index 68313ec..b261a0e 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 = "${DEPLOY_DIR}/sources/deploy-srpm"
>>
>> python package_rpm_fn () {
>> d.setVar('PKGFN', d.getVar('PKG'))
>> @@ -475,6 +476,37 @@ python write_specfile () {
>> import textwrap
>> import oe.packagedata
>>
>> + # append information for logs and patches to %prep
>> + def add_prep(d,spec_files_bottom):
>> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True) and
>> d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() == 'SRPM':
>> + spec_files_bottom.append('%%prep -n %s' % d.getVar('PN', True) )
>> + spec_files_bottom.append('%s' % "echo \"include logs and patches,
>> Please check them in SOURCES\"")
>> + spec_files_bottom.append('')
>> +
>> + # get the name of tarball for sources, patches and logs
>> + def get_tarballs(d):
>> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True) and
>> d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() == 'SRPM':
>> + sourcelist=[]
>> + workdir = d.getVar('WORKDIR',True)
>> + print os.listdir(workdir)
>> + for source in os.listdir(workdir):
>> + if 'tar.gz' in source:
>> + sourcelist.append(source)
>> + return sourcelist
>
> What happens here is there are some other tar.gz file in the WORKDIR?
> Is there a way to ensure you just get the tarballs you are looking for?
It is reasonable for your query. I need add more information to select
the tarballs srpm wants instead of all.
>> +
>> + # append the name of tarball to key word 'SOURCE' in xxx.spec.
>> + def tail_source(d,source_list=[],patch_list=None):
>> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True) and
>> d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() == 'SRPM':
>> + source_number = 0
>> + patch_number = 0
>> + for source in source_list:
>> + spec_preamble_top.append('Source' + str(source_number) + ': %s' %
>> source)
>> + source_number += 1
>> + if patch_list:
>> + for patch in patch_list:
>> + print_deps(patch, "Patch" + str(patch_number), spec_preamble_top, d)
>> + patch_number += 1
>> +
>> # We need a simple way to remove the MLPREFIX from the package name,
>> # and dependency information...
>> def strip_multilib(name, d):
>> @@ -707,6 +739,8 @@ python write_specfile () {
>> spec_preamble_bottom.append('License: %s' % splitlicense)
>> spec_preamble_bottom.append('Group: %s' % splitsection)
>>
>> + source_list = get_tarballs(d)
>> + tail_source(d,source_list,None)
>> # Replaces == Obsoletes&& Provides
>> if splitrreplaces and splitrreplaces.strip() != "":
>> for dep in splitrreplaces.split(','):
>> @@ -786,6 +820,7 @@ python write_specfile () {
>> del localdata
>> bb.utils.unlockfile(lf)
>>
>> + add_prep(d,spec_files_bottom)
>> spec_preamble_top.append('Summary: %s' % srcsummary)
>> spec_preamble_top.append('Name: %s' % srcname)
>> spec_preamble_top.append('Version: %s' % srcversion)
>> @@ -900,6 +935,25 @@ python write_specfile () {
>> python do_package_rpm () {
>> import os
>>
>> + def creat_srpm_dir(d):
>> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True) and
>> d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() == 'SRPM':
>> + licenses = d.getVar('LICENSE', 1).replace('&', '|')
>> + licenses = licenses.replace('(', '').replace(')', '')
>> + clean_licenses = ""
>> + for x in licenses.split():
>> + if x.strip() == '' or x == 'CLOSED':
> What about "Proprietary"
the purpose of doing this is for using licenses as a directory. So I
think x == 'CLOSED' should be removed instead of adding this case. So
Proprietary does.
>> + continue
>> + if x != "|":
>> + clean_licenses += x
>> + if '|' in clean_licenses:
>> + clean_licenses = clean_licenses.replace('|','')
>> +
> Maybe this spinet should be a function in license.bbclass? Maybe it's
> there already, or is this too RPM specific?
>
if 'I' is a part of words from licenses, we should replace it. for
example, this case happen in LICENSE = "Artistic|GPL" from perl_5.14.2.bb
>> + pkgwritesrpmdir =
>> bb.data.expand('${PKGWRITEDIRSRPM}/${PACKAGE_ARCH_EXTEND}', d)
>> + pkgwritesrpmdir = pkgwritesrpmdir + '/' + clean_licenses
>> + bb.mkdirhier(pkgwritesrpmdir)
>> + os.chmod(pkgwritesrpmdir, 0755)
>> + return pkgwritesrpmdir
>> +
>> # We need a simple way to remove the MLPREFIX from the package name,
>> # and dependency information...
>> def strip_multilib(name, d):
>> @@ -1015,8 +1069,17 @@ python do_package_rpm () {
>> cmd = cmd + " --define 'debug_package %{nil}'"
>> cmd = cmd + " --define '_rpmfc_magic_path " + magicfile + "'"
>> cmd = cmd + " --define '_tmppath " + workdir + "'"
>> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True) and
>> d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() == 'SRPM':
>> + cmdsrpm = cmd + " --define '_sourcedir " + workdir + "' --define
>> '_srcrpmdir " + creat_srpm_dir(d) + "'"
>> + cmdsrpm = 'fakeroot ' + cmdsrpm + " -bs " + outspecfile
>> cmd = cmd + " -bb " + outspecfile
>>
>> + # Build the source rpm package !
>> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True) and
>> d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() == '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] 23+ messages in thread
* Re: [PATCH 2/7] archiver.bbclass: New bbclass for archiving sources, patches, logs and scripts
2012-03-14 2:57 ` Saul Wold
@ 2012-03-14 12:30 ` Xiaofeng Yan
0 siblings, 0 replies; 23+ messages in thread
From: Xiaofeng Yan @ 2012-03-14 12:30 UTC (permalink / raw)
To: Saul Wold; +Cc: Patches and discussions about the oe-core layer
On 2012年03月14日 10:57, Saul Wold wrote:
> On 03/13/2012 05:52 AM, Xiaofeng Yan wrote:
>> From: Xiaofeng Yan<xiaofeng.yan@windriver.com>
>>
>> 1 Archive sources in ${S} in the different stage
>> (do_unpack,do_patch,do_configure).
>> 2 Archive patches including series
>> 3 Archive logs including scripts (.bb and .inc files)
>> 4 dump environment resources which show all variable and
>> functions used to xxx.showdata.dump when running a task
>> 5 dump all content in 's' including patches to file xxx.diff.gz
>>
>> All archiving packages will be deployed to ${DEPLOY_DIR}/sources/
>>
>> [#YOCTO 1977]
>>
> Xiaofeng,
>
> I am making a first pass on this, there might be more, after I use it
> to create archives.
>
> Sau!
>
>> Signed-off-by: Xiaofeng Yan<xiaofeng.yan@windriver.com>
>> ---
>> meta/classes/archiver.bbclass | 421
>> +++++++++++++++++++++++++++++++++++++++++
>> 1 files changed, 421 insertions(+), 0 deletions(-)
>> create mode 100644 meta/classes/archiver.bbclass
>>
>> diff --git a/meta/classes/archiver.bbclass
>> b/meta/classes/archiver.bbclass
>> new file mode 100644
>> index 0000000..95e870d
>> --- /dev/null
>> +++ b/meta/classes/archiver.bbclass
>> @@ -0,0 +1,421 @@
>> +# This file is used for archiving sources ,patches,and logs to tarball.
>> +# It also output building environment to xxx.dump.data and create
>> xxx.diff.gz to record
>> +# all content in ${S} to a diff file.
>> +
>> +EXCLUDE_FROM ?= ".pc autom4te.cache"
>> +ARCHIVE_TYPE ?= "TAR SRPM"
>> +DISTRO ?= "poky"
>> +
>> +def parse_var(d,var):
>> + ''' parse variable like ${PV} in "require xxx_${PV}.inc" to a real
>> value. for example, change "require xxx_${PV}.inc" to "require
>> xxx_1.2.inc" '''
>> + import re
>> + pat = re.compile('.*\$({(.*)}).*')
>> + if '$' not in var and '/' not in var:
>> + return var
>> + else:
>> + if '/' in var:
>> + return [i for i in var.split('/') if i.endswith('.inc')][0]
>> + elif '$' in var:
>> + m = pat.match(var)
>> + patstr = '\$' + m.group(1)
>> + var_str = m.group(2)
>> + return re.sub(patstr,d.getVar(var_str,True),var)
>> + else:
>> + return var
>> +
>> +
>> +def get_bb_inc(d):
>> + '''create a directory "script-logs" including .bb and .inc file in
>> ${WORKDIR}'''
>> + import re
>> + import os
>> + import shutil
>> +
>> + bbinc = []
>> + pat=re.compile('require\s*([^\s]*\.*)(.*)')
>> + file_dir = d.getVar('FILE', True)
>> + bbdir = os.path.dirname(file_dir)
>> + work_dir = d.getVar('WORKDIR', True)
>> + os.chdir(work_dir)
>> + bb.mkdirhier("script-logs")
>> + os.chdir(bbdir)
>> + bbfile = os.path.basename(file_dir)
>> + bbinc.append(bbfile)
>> +
>> + def get_inc (file):
>> + f = open(file,'r')
>> + for line in f.readlines():
>> + if 'require' not in line:
>> + bbinc.append(file)
>> + else:
>> + try:
>> + incfile = pat.match(line).group(1)
>> + incfile = parse_var(d,incfile)
>> + bbinc.append(incfile)
>> + get_inc(incfile)
>> + except AttributeError:
>> + pass
>> + get_inc(bbfile)
>> + os.chdir(work_dir)
>> + for root, dirs, files in os.walk(bbdir):
>> + for file in bbinc:
>> + if file in files:
>> + shutil.copy(root + '/' + file,'script-logs')
>> + oe.path.copytree('temp', 'script-logs')
>> + return work_dir + '/script-logs'
>> +
>> +def get_all_patches(d):
>> + '''copy patches and series file to a pointed directory which will
>> be archived to tarball in ${WORKDIR}'''
>> + import shutil
>> +
>> + src_patches=[]
>> + pf = d.getVar('PF', True)
>> + work_dir = d.getVar('WORKDIR', True)
>> + dest = os.path.join(work_dir, pf + '-patches')
>> + shutil.rmtree(dest, ignore_errors=True)
>> + bb.mkdirhier(dest)
>> +
>> + src_uri = d.getVar('SRC_URI', 1).split()
>> + fetch = bb.fetch2.Fetch(src_uri, d)
>> + locals = (fetch.localpath(url) for url in fetch.urls)
>> + for local in locals:
>> + src_patches.append(local)
>> + for patch in src_patches[1:]:
>> + shutil.copy(patch,dest)
>> + return dest
>> +
>> +def get_applying_patches(d):
>> + """only copy applying patches to a pointed directory which will be
>> archived to tarball"""
>> + import os
>> + import shutil
>> +
>> +
>> + pf = d.getVar('PF', True)
>> + work_dir = d.getVar('WORKDIR', True)
>> + dest = os.path.join(work_dir, pf + '-patches')
>> + shutil.rmtree(dest, ignore_errors=True)
>> + bb.mkdirhier(dest)
>> +
>> +
>> + patches = src_patches(d)
>> + for patch in patches:
>> + _, _, local, _, _, parm = bb.decodeurl(patch)
>> + if local:
>> + shutil.copy(local,dest)
>> + return dest
>> +
>> +def not_tarball(d):
>> + '''packages including key words 'work-shared','native', 'task-'
>> will be passed'''
>> + import os
>> +
>> + workdir = d.getVar('WORKDIR',True)
>> + s = d.getVar('S',True)
>> + if 'work-shared' in s or 'task-' in workdir or 'native' in workdir:
>> + return True
>> + else:
>> + return False
>> +
>> +def archive_sources(d,middle_name):
>> + '''archive sources codes tree to tarball'''
>> + import tarfile
>> + import shutil
>> +
>> + s = d.getVar('S',True)
>> + workdir=d.getVar('WORKDIR', True)
>> + PF = d.getVar('PF',True)
>> + tarname = PF + '-' + middle_name + ".tar.gz"
>> +
>> + 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)
>> + try:
>> + for file in os.listdir(s):
>> + if file is not 'temp' and file is not sourcedir:
>> + shutil.copy(file,sourcedir)
>> + except (IOError,OSError):
>> + pass
>> +
>> +
>> + if (len(os.listdir(sourcedir))) != 0:
>> + tar = tarfile.open( tarname, "w:gz")
>> + tar.add(sourcedir)
>> + tar.close()
>> + if cmp(workdir,os.path.dirname(s)) and not os.path.exists(workdir +
>> '/' + tarname):
>> + shutil.move(os.path.dirname(s) + '/' + tarname,workdir)
>> + else:
>> + return
>> + return tarname
>> +
>> +def archive_patches(d,patchdir,series):
>> + '''archive patches to tarball and also include series files if
>> 'series' is True'''
>> + import tarfile
>> + import shutil
>> +
>> + s = d.getVar('S',True)
>> + work_dir = d.getVar('WORKDIR', True)
>> + os.chdir(work_dir)
>> + patch_dir = os.path.basename(patchdir)
>> + tarname = patch_dir + ".tar.gz"
>> + if series == 'all' and os.path.exists(s + '/patches/series'):
>> + shutil.copy(s + '/patches/series',patch_dir)
>> + tar = tarfile.open(tarname, "w:gz")
>> + tar.add(patch_dir)
>> + tar.close()
>> + shutil.rmtree(patch_dir, ignore_errors=True)
>> + return tarname
>> +
>> +def select_archive_patches(d,option):
>> + '''select to archive all patches including non-applying and series
>> or applying patches '''
>> + if option == "all":
>> + patchdir = get_all_patches(d)
>> + elif option == "applying":
>> + patchdir = get_applying_patches(d)
>> + try:
>> + os.rmdir(patchdir)
>> + except OSError:
>> + tarpatch = archive_patches(d,patchdir,option)
>> + return tarpatch
>> + return
>> +
>> +def archive_logs(d,logdir,bbinc=False):
>> + '''archive logs in temp to tarball and .bb and .inc files if bbinc
>> is True '''
>> + import tarfile
>> + import shutil
>> +
>> + log_dir = os.path.basename(logdir)
>> + pf = d.getVar('PF',True)
>> + tarname = pf + '-' + log_dir + ".tar.gz"
>> + tar = tarfile.open(tarname, "w:gz")
>> + tar.add(log_dir)
>> + tar.close()
>> + if bbinc:
>> + shutil.rmtree(log_dir, ignore_errors=True)
>> + return tarname
>> +
>> +def get_licenses(d):
>> + '''get licenses for running .bb file'''
>> + licenses = d.getVar('LICENSE', 1).replace('&', '|')
>> + licenses = licenses.replace('(', '').replace(')', '')
>> + clean_licenses = ""
>> + for x in licenses.split():
>> + if x.strip() == '' or x == 'CLOSED':
>> + continue
>> + if x != "|":
>> + clean_licenses += x
>> + if '|' in clean_licenses:
>> + clean_licenses = clean_licenses.replace('|','')
>> + return clean_licenses
>> +
> This seems to be duplicated in your RPM code also? Move to
> licenses.bbclass maybe?
I will export this function in archiver.bbclass and reference this here.
>
>> +
>> +def move_tarball_deploy(d,tarball_list):
>> + '''move tarball in location to ${DEPLOY_DIR}/sources'''
>> + import shutil
>> +
>> + if tarball_list is []:
>> + return
>> + target_sys = d.getVar('TARGET_SYS', True)
>> + pf = d.getVar('PF', True)
>> + licenses = get_licenses(d)
>> + tar_sources = d.getVar('DEPLOY_DIR', True) + '/sources/' +
>> target_sys + '/' + licenses + '/' + pf
>> + if not os.path.exists(tar_sources):
>> + bb.mkdirhier(tar_sources)
>> + for source in tarball_list:
>> + if source:
>> + if os.path.exists(tar_sources + '/' + source):
>> + os.remove(tar_sources + '/' + source)
>> + shutil.move(source,tar_sources)
>> +
>> +def verify_var(d):
>> + '''check the type for archiving package('tar' or 'srpm')'''
>> + try:
>> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() not in
>> d.getVar('ARCHIVE_TYPE', True).split():
>> + raise AttributeError
>> + except AttributeError:
>> + bb.fatal("\"SOURCE_ARCHIVE_PACKAGE_TYPE\" is \'tar\' or \'srpm\',
>> no other types")
>> +
>> +def archive_copyleft(d):
>> + '''check if a package to archive is copy-left'''
>> + if bb.data.inherits_class('copyleft_compliance', d):
>> + included, reason = copyleft_should_include(d)
>> + if not included:
>> + return False
>> + return True
>> +def archive_sources_patches(d,middle_name):
>> + '''archive sources and patches to tarball. middle_name will append
>> strings ${middle_name} to ${PR} as middle name. for example,
>> zlib-1.4.6-prepatch(middle_name).tar.gz '''
>> + verify_var(d)
>> + if not_tarball(d):
>> + return
>> +
>> + source_tar_name = archive_sources(d,middle_name)
>> + if middle_name == "prepatch":
>> + if d.getVar('PATCHES_ARCHIVE_WITH_SERIES',True).upper() == 'TRUE':
>> + patch_tar_name = select_archive_patches(d,"all")
>> + elif d.getVar('PATCHES_ARCHIVE_WITH_SERIES',True).upper() == 'FALSE':
>> + patch_tar_name = select_archive_patches(d,"applying")
>> + else:
>> + bb.fatal("Please define 'PATCHES_ARCHIVE_WITH_SERIES' is strings
>> 'True' or 'False' ")
>> + else:
>> + patch_tar_name = ''
>> +
>> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() not in
>> 'SRPM':
>> + move_tarball_deploy(d,[source_tar_name,patch_tar_name])
>> +
>> +def archive_sources_patches_logs_copyleft(d,middle_name):
>> + '''archive source, patches and according to the variable
>> "COPYLEFT_COMPLIANCE", If this variable is 'True', then archive the
>> packages for copy-left, or else archive all packages'''
>> + verify_var(d)
>> + if not_tarball(d):
>> + return
>> + copyleft_compliance = d.getVar('COPYLEFT_COMPLIANCE', True)
>> + if copyleft_compliance is None:
>> + archive_sources_patches(d,middle_name)
>> + elif copyleft_compliance.upper() == 'TRUE' and archive_copyleft(d):
>> + archive_sources_patches(d,middle_name)
>> +
>> +
>> +def archive_scripts_logs(d):
>> + '''archive scripts and logs. scripts include .bb and .inc files and
>> logs include stuff in "temp".'''
>> +
>> + s = d.getVar('WORKDIR', True)
>> + os.chdir(s)
>> + source_archive_log_with_scripts =
>> d.getVar('SOURCE_ARCHIVE_LOG_WITH_SCRIPTS', True)
>> + if source_archive_log_with_scripts == 'logs_with_scripts':
>> + logdir = get_bb_inc(d)
>> + tarlog = archive_logs(d,logdir,True)
>> + elif source_archive_log_with_scripts == 'logs':
>> + if os.path.exists('temp'):
>> + archive_logs(d,'temp',False)
>> + else:
>> + return
>> +
>> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() not in
>> 'SRPM':
>> + move_tarball_deploy(d,[tarlog])
>> +
>> +def archive_scripts_logs_copyleft(d):
>> + '''archive logs according to the variable "COPYLEFT_COMPLIANCE", If
>> this variable is 'True', then archive the packages for copy-left, or
>> else archive all packages'''
>> + verify_var(d)
>> + if not d.getVar('SOURCE_ARCHIVE_LOG_WITH_SCRIPTS', True) or
>> not_tarball(d):
>> + return
>> + copyleft_compliance = d.getVar('COPYLEFT_COMPLIANCE', True)
>> + if copyleft_compliance is None:
>> + archive_scripts_logs(d)
>> + elif copyleft_compliance.upper() == 'TRUE' and archive_copyleft(d):
>> + archive_scripts_logs(d)
>> +
>> +
>> +def dumpdata(d):
>> + '''dump environment to "${P}-${PR}.showdata.dump" including all
>> kinds of variables and functions when running a task'''
>> + workdir = bb.data.getVar('WORKDIR', d, 1)
>> + distro = bb.data.getVar('DISTRO', d, 1)
>> + s = d.getVar('S', True)
>> + pf = d.getVar('PF', True)
>> + target_sys = d.getVar('TARGET_SYS', True)
>> + licenses = get_licenses(d)
>> + dumpdir = d.getVar('DEPLOY_DIR', True) + '/sources/' + target_sys +
>> '/' + licenses + '/' + pf
>> + if not os.path.exists(dumpdir):
>> + bb.mkdirhier(dumpdir)
>> +
>> + dumpfile = os.path.join(dumpdir,
>> bb.data.expand("${P}-${PR}.showdata.dump",d))
>> +
>> + bb.note("Dumping metadata into '%s'" % dumpfile)
>> + f = open(dumpfile, "w")
>> + # emit variables and shell functions
>> + bb.data.emit_env(f, d, True)
>> + # emit the metadata which isnt valid shell
>> + for e in d.keys():
>> + if bb.data.getVarFlag(e, 'python', d):
>> + f.write("\npython %s () {\n%s}\n" % (e, bb.data.getVar(e, d, 1)))
>> + f.close()
>> +
>> +
>> +
>> +def create_diff_gz(d):
>> + '''creating .diff.gz in ${DEPLOY_DIR_SRC}/${P}-${PR}.diff.g gz for
>> mapping all content in 's' including patches to xxx.diff.gz'''
>> + import shutil
>> +
>> + work_dir = d.getVar('WORKDIR', True)
>> + exclude_from = d.getVar('EXCLUDE_FROM', True).split()
>> + pf = d.getVar('PF', True)
>> + licenses = get_licenses(d)
>> + target_sys = d.getVar('TARGET_SYS', True)
>> + diff_dir = d.getVar('DEPLOY_DIR', True) + '/sources/' + target_sys
>> + '/' + licenses + '/' + pf
>> + diff_file = os.path.join(diff_dir,
>> bb.data.expand("${P}-${PR}.diff.gz",d))
>> + os.chdir(work_dir)
>> + f = open('temp/exclude-from-file', 'a')
>> + for i in exclude_from:
>> + f.write(i)
>> + f.write("\n")
>> + f.close()
>> +
>> +
>> + s=d.getVar('S', True)
>> + distro = d.getVar('DISTRO',True)
>> + dest = s + '/' + distro + '/files'
>> + if not os.path.exists(dest):
>> + bb.mkdirhier(dest)
>> + for i in os.listdir(os.getcwd()):
>> + if os.path.isfile(i):
>> + shutil.copy(i, dest)
>> +
>> + bb.note("Creating .diff.gz in ${DEPLOY_DIR_SRC}/${P}-${PR}.diff.gz")
>> + cmd = "LC_ALL=C TZ=UTC0 diff --exclude-from=" + work_dir +
>> "/temp/exclude-from-file -Naur " + s + '.org' + ' ' + s + " | gzip
>> -c> " + diff_file
>> + d.setVar('DIFF', cmd + "\n")
>> + d.setVarFlag('DIFF', 'func', '1')
>> + bb.build.exec_func('DIFF', d)
>> + shutil.rmtree(s + '.org', ignore_errors=True)
>> +
>> +# This function will run when user want to get tarball for sources
>> and patches after do_unpack
>> +python do_archive_original_sources_patches(){
>> + archive_sources_patches_logs_copyleft(d,'prepatch')
>> +}
>> +
>> +# This function will run when user want to get tarball for patched
>> sources after do_patch
>> +python do_archive_patched_sources(){
>> + archive_sources_patches_logs_copyleft(d,'patched')
>> +}
>> +
>> +# This function will run when user want to get tarball for
>> configured sources after do_configure
>> +python do_archive_configured_sources(){
>> + archive_sources_patches_logs_copyleft(d,'configured')
>> +}
>> +
>> +# This function will run when user want to get tarball for logs or
>> both logs and scripts(.bb and .inc files)
>> +python do_archive_scripts_logs_copyleft(){
>> + archive_scripts_logs_copyleft(d)
>> +}
>> +
>> +# This function will run when user want to know what variable and
>> functions in a running task are and also can get a diff file including
>> +# all content a package should include.
>> +python do_dumpdata_create_diff_gz(){
>> + dumpdata(d)
>> + create_diff_gz(d)
>> +}
>> +
>> +# This functions prepare for archiving "linux-yocto" because this
>> package create directory 's' before do_patch instead of after do_unpack.
>> +# This is special control for archiving linux-yocto only.
>> +python do_archive_linux_yocto(){
>> + s = d.getVar('S', True)
>> + if 'linux-yocto' in s:
>> + source_tar_name = archive_sources(d,'')
>> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() not in
>> 'SRPM':
>> + move_tarball_deploy(d,[source_tar_name,''])
>> +}
>> +do_kernel_checkout[postfuncs] += "do_archive_linux_yocto "
>> +
>> +# remove tarball for sources, patches and logs after creating srpm.
>> +python do_remove_tarball(){
>> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() == 'SRPM':
>> + work_dir = d.getVar('WORKDIR', True)
>> + os.chdir(work_dir)
>> + for file in os.listdir(os.getcwd()):
>> + if '.tar.gz' in file:
>> + os.remove(file)
> As I mentioned in the RPM code, this might not be the best way to do
> this, and it could break builds if you remove a tarball that's
> expected to be there.
>
> Maybe store the tarballs in a ${WORKDIR}/.. directory (same level as
> temp).
>
This is a problem.
I will use other method instead of this method.
>> +}
>> +do_remove_taball[deptask] = "do_archive_scripts_logs"
>> +do_package_write_rpm[postfuncs] += "do_remove_tarball "
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH 2/7] archiver.bbclass: New bbclass for archiving sources, patches, logs and scripts
2012-03-16 6:23 [PATCH 0/7] Realize archiving functions Xiaofeng Yan
@ 2012-03-16 6:23 ` Xiaofeng Yan
2012-03-19 21:04 ` Saul Wold
0 siblings, 1 reply; 23+ messages in thread
From: Xiaofeng Yan @ 2012-03-16 6:23 UTC (permalink / raw)
To: openembedded-core
From: Xiaofeng Yan <xiaofeng.yan@windriver.com>
1 Archive sources in ${S} in the different stage (do_unpack,do_patch,do_configure).
2 Archive patches including series
3 Archive logs including scripts (.bb and .inc files)
4 dump environment resources which show all variable and
functions used to xxx.showdata.dump when running a task
5 dump all content in 's' including patches to file xxx.diff.gz
All archiving packages will be deployed to ${DEPLOY_DIR}/sources/
[#YOCTO 1977]
Signed-off-by: Xiaofeng Yan <xiaofeng.yan@windriver.com>
---
meta/classes/archiver.bbclass | 419 +++++++++++++++++++++++++++++++++++++++++
1 files changed, 419 insertions(+), 0 deletions(-)
create mode 100644 meta/classes/archiver.bbclass
diff --git a/meta/classes/archiver.bbclass b/meta/classes/archiver.bbclass
new file mode 100644
index 0000000..de90c75
--- /dev/null
+++ b/meta/classes/archiver.bbclass
@@ -0,0 +1,419 @@
+# This file is used for archiving sources ,patches,and logs to tarball.
+# It also output building environment to xxx.dump.data and create xxx.diff.gz to record
+# all content in ${S} to a diff file.
+
+EXCLUDE_FROM ?= ".pc autom4te.cache"
+ARCHIVE_TYPE ?= "TAR SRPM"
+DISTRO ?= "poky"
+PATCHES_ARCHIVE_WITH_SERIES = 'TRUE'
+
+def parse_var(d,var):
+ ''' parse variable like ${PV} in "require xxx_${PV}.inc" to a real value. for example, change "require xxx_${PV}.inc" to "require xxx_1.2.inc" '''
+ import re
+ pat = re.compile('.*\$({(.*)}).*')
+ if '$' not in var and '/' not in var:
+ return var
+ else:
+ if '/' in var:
+ return [i for i in var.split('/') if i.endswith('.inc')][0]
+ elif '$' in var:
+ m = pat.match(var)
+ patstr = '\$' + m.group(1)
+ var_str = m.group(2)
+ return re.sub(patstr,d.getVar(var_str,True),var)
+ else:
+ return var
+
+def get_bb_inc(d):
+ '''create a directory "script-logs" including .bb and .inc file in ${WORKDIR}'''
+ import re
+ import os
+ import shutil
+
+ bbinc = []
+ pat=re.compile('require\s*([^\s]*\.*)(.*)')
+ file_dir = d.getVar('FILE', True)
+ bbdir = os.path.dirname(file_dir)
+ work_dir = d.getVar('WORKDIR', True)
+ os.chdir(work_dir)
+ bb.mkdirhier("script-logs")
+ os.chdir(bbdir)
+ bbfile = os.path.basename(file_dir)
+ bbinc.append(bbfile)
+
+ def get_inc (file):
+ f = open(file,'r')
+ for line in f.readlines():
+ if 'require' not in line:
+ bbinc.append(file)
+ else:
+ try:
+ incfile = pat.match(line).group(1)
+ incfile = parse_var(d,incfile)
+ bbinc.append(incfile)
+ get_inc(incfile)
+ except (IOError,AttributeError):
+ pass
+ get_inc(bbfile)
+ os.chdir(work_dir)
+ for root, dirs, files in os.walk(bbdir):
+ for file in bbinc:
+ if file in files:
+ shutil.copy(root + '/' + file,'script-logs')
+ oe.path.copytree('temp', 'script-logs')
+ return work_dir + '/script-logs'
+
+def get_all_patches(d):
+ '''copy patches and series file to a pointed directory which will be archived to tarball in ${WORKDIR}'''
+ import shutil
+
+ src_patches=[]
+ pf = d.getVar('PF', True)
+ work_dir = d.getVar('WORKDIR', True)
+ dest = os.path.join(work_dir, pf + '-patches')
+ shutil.rmtree(dest, ignore_errors=True)
+ bb.mkdirhier(dest)
+
+ src_uri = d.getVar('SRC_URI', 1).split()
+ fetch = bb.fetch2.Fetch(src_uri, d)
+ locals = (fetch.localpath(url) for url in fetch.urls)
+ for local in locals:
+ src_patches.append(local)
+ for patch in src_patches[1:]:
+ shutil.copy(patch,dest)
+ return dest
+
+def get_applying_patches(d):
+ """only copy applying patches to a pointed directory which will be archived to tarball"""
+ import os
+ import shutil
+
+
+ pf = d.getVar('PF', True)
+ work_dir = d.getVar('WORKDIR', True)
+ dest = os.path.join(work_dir, pf + '-patches')
+ shutil.rmtree(dest, ignore_errors=True)
+ bb.mkdirhier(dest)
+
+
+ patches = src_patches(d)
+ for patch in patches:
+ _, _, local, _, _, parm = bb.decodeurl(patch)
+ if local:
+ shutil.copy(local,dest)
+ return dest
+
+def not_tarball(d):
+ '''packages including key words 'work-shared','native', 'task-' will be passed'''
+ import os
+
+ workdir = d.getVar('WORKDIR',True)
+ s = d.getVar('S',True)
+ if 'work-shared' in s or 'task-' in workdir or 'native' in workdir:
+ return True
+ else:
+ return False
+
+def archive_sources(d,middle_name):
+ '''archive sources codes tree to tarball'''
+ import tarfile
+ import shutil
+
+ s = d.getVar('S',True)
+ workdir=d.getVar('WORKDIR', True)
+ PF = d.getVar('PF',True)
+ tarname = PF + '-' + middle_name + ".tar.gz"
+
+ 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)
+ try:
+ for file in os.listdir(s):
+ if file is not 'temp' and file is not sourcedir:
+ shutil.copy(file,sourcedir)
+ except (IOError,OSError):
+ pass
+
+ if (len(os.listdir(sourcedir))) != 0:
+ tar = tarfile.open( tarname, "w:gz")
+ tar.add(sourcedir)
+ tar.close()
+ if cmp(workdir,os.path.dirname(s)) and not os.path.exists(workdir + '/' + tarname):
+ shutil.move(os.path.dirname(s) + '/' + tarname,workdir)
+ else:
+ return
+ return tarname
+
+def archive_patches(d,patchdir,series):
+ '''archive patches to tarball and also include series files if 'series' is True'''
+ import tarfile
+ import shutil
+
+ s = d.getVar('S',True)
+ work_dir = d.getVar('WORKDIR', True)
+ os.chdir(work_dir)
+ patch_dir = os.path.basename(patchdir)
+ tarname = patch_dir + ".tar.gz"
+ if series == 'all' and os.path.exists(s + '/patches/series'):
+ shutil.copy(s + '/patches/series',patch_dir)
+ tar = tarfile.open(tarname, "w:gz")
+ tar.add(patch_dir)
+ tar.close()
+ shutil.rmtree(patch_dir, ignore_errors=True)
+ return tarname
+
+def select_archive_patches(d,option):
+ '''select to archive all patches including non-applying and series or applying patches '''
+ if option == "all":
+ patchdir = get_all_patches(d)
+ elif option == "applying":
+ patchdir = get_applying_patches(d)
+ try:
+ os.rmdir(patchdir)
+ except OSError:
+ tarpatch = archive_patches(d,patchdir,option)
+ return tarpatch
+ return
+
+def archive_logs(d,logdir,bbinc=False):
+ '''archive logs in temp to tarball and .bb and .inc files if bbinc is True '''
+ import tarfile
+ import shutil
+
+ log_dir = os.path.basename(logdir)
+ pf = d.getVar('PF',True)
+ tarname = pf + '-' + log_dir + ".tar.gz"
+ tar = tarfile.open(tarname, "w:gz")
+ tar.add(log_dir)
+ tar.close()
+ if bbinc:
+ shutil.rmtree(log_dir, ignore_errors=True)
+ return tarname
+
+def get_licenses(d):
+ '''get licenses for running .bb file'''
+ licenses = d.getVar('LICENSE', 1).replace('&', '|')
+ licenses = licenses.replace('(', '').replace(')', '')
+ clean_licenses = ""
+ for x in licenses.split():
+ if x.strip() == '' or x == 'CLOSED':
+ continue
+ if x != "|":
+ clean_licenses += x
+ if '|' in clean_licenses:
+ clean_licenses = clean_licenses.replace('|','')
+ return clean_licenses
+
+
+def move_tarball_deploy(d,tarball_list):
+ '''move tarball in location to ${DEPLOY_DIR}/sources'''
+ import shutil
+
+ if tarball_list is []:
+ return
+ target_sys = d.getVar('TARGET_SYS', True)
+ pf = d.getVar('PF', True)
+ licenses = get_licenses(d)
+ tar_sources = d.getVar('DEPLOY_DIR', True) + '/sources/' + target_sys + '/' + licenses + '/' + pf
+ if not os.path.exists(tar_sources):
+ bb.mkdirhier(tar_sources)
+ for source in tarball_list:
+ if source:
+ if os.path.exists(tar_sources + '/' + source):
+ os.remove(tar_sources + '/' + source)
+ shutil.move(source,tar_sources)
+
+def verify_var(d):
+ '''check the type for archiving package('tar' or 'srpm')'''
+ try:
+ if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() not in d.getVar('ARCHIVE_TYPE', True).split():
+ raise AttributeError
+ except AttributeError:
+ bb.fatal("\"SOURCE_ARCHIVE_PACKAGE_TYPE\" is \'tar\' or \'srpm\', no other types")
+
+def store_package(d,package_name):
+ '''store tarbablls name to file "tar-package"'''
+ f = open(d.getVar('WORKDIR',True )+ '/tar-package','a')
+ f.write(package_name + ' ')
+ f.close()
+
+def get_package(d):
+ '''get tarballs name from "tar-package"'''
+ os.chdir(d.getVar('WORKDIR', True))
+ f = open('tar-package','r')
+ line = list(set(f.readline().replace('\n','').split()))
+ f.close()
+ return line
+
+
+def archive_sources_patches(d,middle_name):
+ '''archive sources and patches to tarball. middle_name will append strings ${middle_name} to ${PR} as middle name. for example, zlib-1.4.6-prepatch(middle_name).tar.gz '''
+ import shutil
+ verify_var(d)
+ if not_tarball(d):
+ return
+
+ source_tar_name = archive_sources(d,middle_name)
+ if middle_name == "prepatch":
+ if d.getVar('PATCHES_ARCHIVE_WITH_SERIES',True).upper() == 'TRUE':
+ patch_tar_name = select_archive_patches(d,"all")
+ elif d.getVar('PATCHES_ARCHIVE_WITH_SERIES',True).upper() == 'FALSE':
+ patch_tar_name = select_archive_patches(d,"applying")
+ else:
+ bb.fatal("Please define 'PATCHES_ARCHIVE_WITH_SERIES' is strings 'True' or 'False' ")
+ else:
+ patch_tar_name = ''
+
+ if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() not in 'SRPM':
+ move_tarball_deploy(d,[source_tar_name,patch_tar_name])
+ else:
+ tarpackage = d.getVar('WORKDIR', True) + '/tar-package'
+ if os.path.exists(tarpackage):
+ os.remove(tarpackage)
+ for package in source_tar_name, patch_tar_name:
+ if package:
+ store_package(d,str(package) + ' ')
+
+def archive_scripts_logs(d):
+ '''archive scripts and logs. scripts include .bb and .inc files and logs include stuff in "temp".'''
+
+ work_dir = d.getVar('WORKDIR', True)
+ os.chdir(work_dir)
+ source_archive_log_with_scripts = d.getVar('SOURCE_ARCHIVE_LOG_WITH_SCRIPTS', True)
+ if source_archive_log_with_scripts == 'logs_with_scripts':
+ logdir = get_bb_inc(d)
+ tarlog = archive_logs(d,logdir,True)
+ elif source_archive_log_with_scripts == 'logs':
+ if os.path.exists('temp'):
+ tarlog = archive_logs(d,'temp',False)
+ else:
+ return
+
+ if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() not in 'SRPM':
+ move_tarball_deploy(d,[tarlog])
+
+ else:
+ store_package(d,tarlog)
+
+def dumpdata(d):
+ '''dump environment to "${P}-${PR}.showdata.dump" including all kinds of variables and functions when running a task'''
+ workdir = bb.data.getVar('WORKDIR', d, 1)
+ distro = bb.data.getVar('DISTRO', d, 1)
+ s = d.getVar('S', True)
+ pf = d.getVar('PF', True)
+ target_sys = d.getVar('TARGET_SYS', True)
+ licenses = get_licenses(d)
+ dumpdir = d.getVar('DEPLOY_DIR', True) + '/sources/' + target_sys + '/' + licenses + '/' + pf
+ if not os.path.exists(dumpdir):
+ bb.mkdirhier(dumpdir)
+
+ dumpfile = os.path.join(dumpdir, bb.data.expand("${P}-${PR}.showdata.dump",d))
+
+ bb.note("Dumping metadata into '%s'" % dumpfile)
+ f = open(dumpfile, "w")
+ # emit variables and shell functions
+ bb.data.emit_env(f, d, True)
+ # emit the metadata which isnt valid shell
+ for e in d.keys():
+ if bb.data.getVarFlag(e, 'python', d):
+ f.write("\npython %s () {\n%s}\n" % (e, bb.data.getVar(e, d, 1)))
+ f.close()
+
+def create_diff_gz(d):
+ '''creating .diff.gz in ${DEPLOY_DIR_SRC}/${P}-${PR}.diff.g gz for mapping all content in 's' including patches to xxx.diff.gz'''
+ import shutil
+
+ work_dir = d.getVar('WORKDIR', True)
+ exclude_from = d.getVar('EXCLUDE_FROM', True).split()
+ pf = d.getVar('PF', True)
+ licenses = get_licenses(d)
+ target_sys = d.getVar('TARGET_SYS', True)
+ diff_dir = d.getVar('DEPLOY_DIR', True) + '/sources/' + target_sys + '/' + licenses + '/' + pf
+ diff_file = os.path.join(diff_dir, bb.data.expand("${P}-${PR}.diff.gz",d))
+ os.chdir(work_dir)
+ f = open('temp/exclude-from-file', 'a')
+ for i in exclude_from:
+ f.write(i)
+ f.write("\n")
+ f.close()
+
+ s=d.getVar('S', True)
+ distro = d.getVar('DISTRO',True)
+ dest = s + '/' + distro + '/files'
+ if not os.path.exists(dest):
+ bb.mkdirhier(dest)
+ for i in os.listdir(os.getcwd()):
+ if os.path.isfile(i):
+ shutil.copy(i, dest)
+
+ bb.note("Creating .diff.gz in ${DEPLOY_DIR_SRC}/${P}-${PR}.diff.gz")
+ cmd = "LC_ALL=C TZ=UTC0 diff --exclude-from=" + work_dir + "/temp/exclude-from-file -Naur " + s + '.org' + ' ' + s + " | gzip -c > " + diff_file
+ d.setVar('DIFF', cmd + "\n")
+ d.setVarFlag('DIFF', 'func', '1')
+ bb.build.exec_func('DIFF', d)
+ shutil.rmtree(s + '.org', ignore_errors=True)
+
+# This function will run when user want to get tarball for sources and patches after do_unpack
+python do_archive_original_sources_patches(){
+ archive_sources_patches(d,'prepatch')
+}
+
+# This function will run when user want to get tarball for patched sources after do_patch
+python do_archive_patched_sources(){
+ archive_sources_patches(d,'patched')
+}
+
+# This function will run when user want to get tarball for configured sources after do_configure
+python do_archive_configured_sources(){
+ archive_sources_patches(d,'configured')
+}
+
+# This function will run when user want to get tarball for logs or both logs and scripts(.bb and .inc files)
+python do_archive_scripts_logs(){
+ archive_scripts_logs(d)
+}
+
+# This function will run when user want to know what variable and functions in a running task are and also can get a diff file including
+# all content a package should include.
+python do_dumpdata_create_diff_gz(){
+ dumpdata(d)
+ create_diff_gz(d)
+}
+
+# This functions prepare for archiving "linux-yocto" because this package create directory 's' before do_patch instead of after do_unpack.
+# This is special control for archiving linux-yocto only.
+python do_archive_linux_yocto(){
+ s = d.getVar('S', True)
+ if 'linux-yocto' in s:
+ source_tar_name = archive_sources(d,'')
+ if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() not in 'SRPM':
+ move_tarball_deploy(d,[source_tar_name,''])
+}
+do_kernel_checkout[postfuncs] += "do_archive_linux_yocto "
+
+# remove tarball for sources, patches and logs after creating srpm.
+python do_remove_tarball(){
+ if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() == 'SRPM':
+ work_dir = d.getVar('WORKDIR', True)
+ os.chdir(work_dir)
+ for file in os.listdir(os.getcwd()):
+ if file in get_package(d):
+ try:
+ os.remove(file)
+ except OSError:
+ pass
+ if os.path.exists('tar-package'):
+ os.remove('tar-package')
+}
+do_remove_taball[deptask] = "do_archive_scripts_logs"
+do_package_write_rpm[postfuncs] += "do_remove_tarball "
+export get_licenses
+export get_package
--
1.7.0.4
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH 2/7] archiver.bbclass: New bbclass for archiving sources, patches, logs and scripts
2012-03-16 6:23 ` [PATCH 2/7] archiver.bbclass: New bbclass for archiving sources, patches, logs and scripts Xiaofeng Yan
@ 2012-03-19 21:04 ` Saul Wold
2012-03-20 5:50 ` Xiaofeng Yan
0 siblings, 1 reply; 23+ messages in thread
From: Saul Wold @ 2012-03-19 21:04 UTC (permalink / raw)
To: Patches and discussions about the oe-core layer
On 03/15/2012 11:23 PM, Xiaofeng Yan wrote:
> From: Xiaofeng Yan<xiaofeng.yan@windriver.com>
>
> 1 Archive sources in ${S} in the different stage (do_unpack,do_patch,do_configure).
> 2 Archive patches including series
> 3 Archive logs including scripts (.bb and .inc files)
> 4 dump environment resources which show all variable and
> functions used to xxx.showdata.dump when running a task
> 5 dump all content in 's' including patches to file xxx.diff.gz
>
> All archiving packages will be deployed to ${DEPLOY_DIR}/sources/
>
> [#YOCTO 1977]
>
> Signed-off-by: Xiaofeng Yan<xiaofeng.yan@windriver.com>
> ---
> meta/classes/archiver.bbclass | 419 +++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 419 insertions(+), 0 deletions(-)
> create mode 100644 meta/classes/archiver.bbclass
>
> diff --git a/meta/classes/archiver.bbclass b/meta/classes/archiver.bbclass
> new file mode 100644
> index 0000000..de90c75
> --- /dev/null
> +++ b/meta/classes/archiver.bbclass
> @@ -0,0 +1,419 @@
> +# This file is used for archiving sources ,patches,and logs to tarball.
> +# It also output building environment to xxx.dump.data and create xxx.diff.gz to record
> +# all content in ${S} to a diff file.
> +
> +EXCLUDE_FROM ?= ".pc autom4te.cache"
> +ARCHIVE_TYPE ?= "TAR SRPM"
> +DISTRO ?= "poky"
> +PATCHES_ARCHIVE_WITH_SERIES = 'TRUE'
> +
> +def parse_var(d,var):
> + ''' parse variable like ${PV} in "require xxx_${PV}.inc" to a real value. for example, change "require xxx_${PV}.inc" to "require xxx_1.2.inc" '''
> + import re
> + pat = re.compile('.*\$({(.*)}).*')
> + if '$' not in var and '/' not in var:
> + return var
> + else:
> + if '/' in var:
> + return [i for i in var.split('/') if i.endswith('.inc')][0]
> + elif '$' in var:
> + m = pat.match(var)
> + patstr = '\$' + m.group(1)
> + var_str = m.group(2)
> + return re.sub(patstr,d.getVar(var_str,True),var)
> + else:
> + return var
> +
> +def get_bb_inc(d):
> + '''create a directory "script-logs" including .bb and .inc file in ${WORKDIR}'''
> + import re
> + import os
> + import shutil
> +
> + bbinc = []
> + pat=re.compile('require\s*([^\s]*\.*)(.*)')
> + file_dir = d.getVar('FILE', True)
> + bbdir = os.path.dirname(file_dir)
> + work_dir = d.getVar('WORKDIR', True)
> + os.chdir(work_dir)
> + bb.mkdirhier("script-logs")
> + os.chdir(bbdir)
> + bbfile = os.path.basename(file_dir)
> + bbinc.append(bbfile)
> +
> + def get_inc (file):
> + f = open(file,'r')
> + for line in f.readlines():
> + if 'require' not in line:
> + bbinc.append(file)
> + else:
> + try:
> + incfile = pat.match(line).group(1)
> + incfile = parse_var(d,incfile)
> + bbinc.append(incfile)
> + get_inc(incfile)
> + except (IOError,AttributeError):
> + pass
> + get_inc(bbfile)
> + os.chdir(work_dir)
> + for root, dirs, files in os.walk(bbdir):
> + for file in bbinc:
> + if file in files:
> + shutil.copy(root + '/' + file,'script-logs')
> + oe.path.copytree('temp', 'script-logs')
> + return work_dir + '/script-logs'
> +
> +def get_all_patches(d):
> + '''copy patches and series file to a pointed directory which will be archived to tarball in ${WORKDIR}'''
> + import shutil
> +
> + src_patches=[]
> + pf = d.getVar('PF', True)
> + work_dir = d.getVar('WORKDIR', True)
> + dest = os.path.join(work_dir, pf + '-patches')
> + shutil.rmtree(dest, ignore_errors=True)
> + bb.mkdirhier(dest)
> +
> + src_uri = d.getVar('SRC_URI', 1).split()
> + fetch = bb.fetch2.Fetch(src_uri, d)
> + locals = (fetch.localpath(url) for url in fetch.urls)
> + for local in locals:
> + src_patches.append(local)
> + for patch in src_patches[1:]:
> + shutil.copy(patch,dest)
> + return dest
> +
> +def get_applying_patches(d):
> + """only copy applying patches to a pointed directory which will be archived to tarball"""
> + import os
> + import shutil
> +
> +
> + pf = d.getVar('PF', True)
> + work_dir = d.getVar('WORKDIR', True)
> + dest = os.path.join(work_dir, pf + '-patches')
> + shutil.rmtree(dest, ignore_errors=True)
> + bb.mkdirhier(dest)
> +
> +
> + patches = src_patches(d)
> + for patch in patches:
> + _, _, local, _, _, parm = bb.decodeurl(patch)
> + if local:
> + shutil.copy(local,dest)
> + return dest
> +
> +def not_tarball(d):
> + '''packages including key words 'work-shared','native', 'task-' will be passed'''
> + import os
> +
> + workdir = d.getVar('WORKDIR',True)
> + s = d.getVar('S',True)
> + if 'work-shared' in s or 'task-' in workdir or 'native' in workdir:
> + return True
> + else:
> + return False
> +
> +def archive_sources(d,middle_name):
> + '''archive sources codes tree to tarball'''
> + import tarfile
> + import shutil
> +
> + s = d.getVar('S',True)
> + workdir=d.getVar('WORKDIR', True)
> + PF = d.getVar('PF',True)
> + tarname = PF + '-' + middle_name + ".tar.gz"
> +
> + 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)
> + try:
> + for file in os.listdir(s):
> + if file is not 'temp' and file is not sourcedir:
> + shutil.copy(file,sourcedir)
> + except (IOError,OSError):
> + pass
> +
> + if (len(os.listdir(sourcedir))) != 0:
> + tar = tarfile.open( tarname, "w:gz")
> + tar.add(sourcedir)
> + tar.close()
> + if cmp(workdir,os.path.dirname(s)) and not os.path.exists(workdir + '/' + tarname):
> + shutil.move(os.path.dirname(s) + '/' + tarname,workdir)
> + else:
> + return
> + return tarname
> +
> +def archive_patches(d,patchdir,series):
> + '''archive patches to tarball and also include series files if 'series' is True'''
> + import tarfile
> + import shutil
> +
> + s = d.getVar('S',True)
> + work_dir = d.getVar('WORKDIR', True)
> + os.chdir(work_dir)
> + patch_dir = os.path.basename(patchdir)
> + tarname = patch_dir + ".tar.gz"
> + if series == 'all' and os.path.exists(s + '/patches/series'):
> + shutil.copy(s + '/patches/series',patch_dir)
> + tar = tarfile.open(tarname, "w:gz")
> + tar.add(patch_dir)
> + tar.close()
> + shutil.rmtree(patch_dir, ignore_errors=True)
> + return tarname
> +
> +def select_archive_patches(d,option):
> + '''select to archive all patches including non-applying and series or applying patches '''
> + if option == "all":
> + patchdir = get_all_patches(d)
> + elif option == "applying":
> + patchdir = get_applying_patches(d)
> + try:
> + os.rmdir(patchdir)
> + except OSError:
> + tarpatch = archive_patches(d,patchdir,option)
> + return tarpatch
> + return
> +
> +def archive_logs(d,logdir,bbinc=False):
> + '''archive logs in temp to tarball and .bb and .inc files if bbinc is True '''
> + import tarfile
> + import shutil
> +
> + log_dir = os.path.basename(logdir)
> + pf = d.getVar('PF',True)
> + tarname = pf + '-' + log_dir + ".tar.gz"
> + tar = tarfile.open(tarname, "w:gz")
> + tar.add(log_dir)
> + tar.close()
> + if bbinc:
> + shutil.rmtree(log_dir, ignore_errors=True)
> + return tarname
> +
> +def get_licenses(d):
> + '''get licenses for running .bb file'''
> + licenses = d.getVar('LICENSE', 1).replace('&', '|')
> + licenses = licenses.replace('(', '').replace(')', '')
> + clean_licenses = ""
> + for x in licenses.split():
> + if x.strip() == '' or x == 'CLOSED':
> + continue
> + if x != "|":
> + clean_licenses += x
> + if '|' in clean_licenses:
> + clean_licenses = clean_licenses.replace('|','')
> + return clean_licenses
> +
> +
> +def move_tarball_deploy(d,tarball_list):
> + '''move tarball in location to ${DEPLOY_DIR}/sources'''
> + import shutil
> +
> + if tarball_list is []:
> + return
> + target_sys = d.getVar('TARGET_SYS', True)
> + pf = d.getVar('PF', True)
> + licenses = get_licenses(d)
> + tar_sources = d.getVar('DEPLOY_DIR', True) + '/sources/' + target_sys + '/' + licenses + '/' + pf
> + if not os.path.exists(tar_sources):
> + bb.mkdirhier(tar_sources)
> + for source in tarball_list:
> + if source:
> + if os.path.exists(tar_sources + '/' + source):
> + os.remove(tar_sources + '/' + source)
> + shutil.move(source,tar_sources)
> +
> +def verify_var(d):
> + '''check the type for archiving package('tar' or 'srpm')'''
> + try:
> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() not in d.getVar('ARCHIVE_TYPE', True).split():
> + raise AttributeError
> + except AttributeError:
> + bb.fatal("\"SOURCE_ARCHIVE_PACKAGE_TYPE\" is \'tar\' or \'srpm\', no other types")
> +
> +def store_package(d,package_name):
> + '''store tarbablls name to file "tar-package"'''
> + f = open(d.getVar('WORKDIR',True )+ '/tar-package','a')
> + f.write(package_name + ' ')
> + f.close()
> +
> +def get_package(d):
> + '''get tarballs name from "tar-package"'''
> + os.chdir(d.getVar('WORKDIR', True))
> + f = open('tar-package','r')
> + line = list(set(f.readline().replace('\n','').split()))
> + f.close()
> + return line
> +
> +
> +def archive_sources_patches(d,middle_name):
> + '''archive sources and patches to tarball. middle_name will append strings ${middle_name} to ${PR} as middle name. for example, zlib-1.4.6-prepatch(middle_name).tar.gz '''
> + import shutil
> + verify_var(d)
> + if not_tarball(d):
> + return
> +
> + source_tar_name = archive_sources(d,middle_name)
> + if middle_name == "prepatch":
> + if d.getVar('PATCHES_ARCHIVE_WITH_SERIES',True).upper() == 'TRUE':
> + patch_tar_name = select_archive_patches(d,"all")
> + elif d.getVar('PATCHES_ARCHIVE_WITH_SERIES',True).upper() == 'FALSE':
> + patch_tar_name = select_archive_patches(d,"applying")
> + else:
> + bb.fatal("Please define 'PATCHES_ARCHIVE_WITH_SERIES' is strings 'True' or 'False' ")
> + else:
> + patch_tar_name = ''
> +
> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() not in 'SRPM':
> + move_tarball_deploy(d,[source_tar_name,patch_tar_name])
> + else:
> + tarpackage = d.getVar('WORKDIR', True) + '/tar-package'
> + if os.path.exists(tarpackage):
> + os.remove(tarpackage)
> + for package in source_tar_name, patch_tar_name:
> + if package:
> + store_package(d,str(package) + ' ')
> +
> +def archive_scripts_logs(d):
> + '''archive scripts and logs. scripts include .bb and .inc files and logs include stuff in "temp".'''
> +
> + work_dir = d.getVar('WORKDIR', True)
> + os.chdir(work_dir)
> + source_archive_log_with_scripts = d.getVar('SOURCE_ARCHIVE_LOG_WITH_SCRIPTS', True)
> + if source_archive_log_with_scripts == 'logs_with_scripts':
> + logdir = get_bb_inc(d)
> + tarlog = archive_logs(d,logdir,True)
> + elif source_archive_log_with_scripts == 'logs':
> + if os.path.exists('temp'):
> + tarlog = archive_logs(d,'temp',False)
> + else:
> + return
> +
> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() not in 'SRPM':
> + move_tarball_deploy(d,[tarlog])
> +
> + else:
> + store_package(d,tarlog)
> +
> +def dumpdata(d):
> + '''dump environment to "${P}-${PR}.showdata.dump" including all kinds of variables and functions when running a task'''
> + workdir = bb.data.getVar('WORKDIR', d, 1)
> + distro = bb.data.getVar('DISTRO', d, 1)
> + s = d.getVar('S', True)
> + pf = d.getVar('PF', True)
> + target_sys = d.getVar('TARGET_SYS', True)
> + licenses = get_licenses(d)
> + dumpdir = d.getVar('DEPLOY_DIR', True) + '/sources/' + target_sys + '/' + licenses + '/' + pf
> + if not os.path.exists(dumpdir):
> + bb.mkdirhier(dumpdir)
> +
> + dumpfile = os.path.join(dumpdir, bb.data.expand("${P}-${PR}.showdata.dump",d))
> +
> + bb.note("Dumping metadata into '%s'" % dumpfile)
> + f = open(dumpfile, "w")
> + # emit variables and shell functions
> + bb.data.emit_env(f, d, True)
> + # emit the metadata which isnt valid shell
> + for e in d.keys():
> + if bb.data.getVarFlag(e, 'python', d):
> + f.write("\npython %s () {\n%s}\n" % (e, bb.data.getVar(e, d, 1)))
> + f.close()
> +
> +def create_diff_gz(d):
> + '''creating .diff.gz in ${DEPLOY_DIR_SRC}/${P}-${PR}.diff.g gz for mapping all content in 's' including patches to xxx.diff.gz'''
> + import shutil
> +
> + work_dir = d.getVar('WORKDIR', True)
> + exclude_from = d.getVar('EXCLUDE_FROM', True).split()
> + pf = d.getVar('PF', True)
> + licenses = get_licenses(d)
> + target_sys = d.getVar('TARGET_SYS', True)
> + diff_dir = d.getVar('DEPLOY_DIR', True) + '/sources/' + target_sys + '/' + licenses + '/' + pf
> + diff_file = os.path.join(diff_dir, bb.data.expand("${P}-${PR}.diff.gz",d))
> + os.chdir(work_dir)
> + f = open('temp/exclude-from-file', 'a')
> + for i in exclude_from:
> + f.write(i)
> + f.write("\n")
> + f.close()
> +
> + s=d.getVar('S', True)
> + distro = d.getVar('DISTRO',True)
> + dest = s + '/' + distro + '/files'
> + if not os.path.exists(dest):
> + bb.mkdirhier(dest)
> + for i in os.listdir(os.getcwd()):
> + if os.path.isfile(i):
> + shutil.copy(i, dest)
> +
> + bb.note("Creating .diff.gz in ${DEPLOY_DIR_SRC}/${P}-${PR}.diff.gz")
> + cmd = "LC_ALL=C TZ=UTC0 diff --exclude-from=" + work_dir + "/temp/exclude-from-file -Naur " + s + '.org' + ' ' + s + " | gzip -c> " + diff_file
> + d.setVar('DIFF', cmd + "\n")
> + d.setVarFlag('DIFF', 'func', '1')
> + bb.build.exec_func('DIFF', d)
> + shutil.rmtree(s + '.org', ignore_errors=True)
> +
> +# This function will run when user want to get tarball for sources and patches after do_unpack
> +python do_archive_original_sources_patches(){
> + archive_sources_patches(d,'prepatch')
Why do you rebuild the tarball here are rename it instead of just
copying the original tarball?
I could understand this for SCM based packages, and even then we have
tarballs created in the DL_DIR.
I think I understand why you name it _prepatch, since it's not the exact
original tarball.
Sau!
> +}
> +
> +# This function will run when user want to get tarball for patched sources after do_patch
> +python do_archive_patched_sources(){
> + archive_sources_patches(d,'patched')
> +}
> +
> +# This function will run when user want to get tarball for configured sources after do_configure
> +python do_archive_configured_sources(){
> + archive_sources_patches(d,'configured')
> +}
> +
> +# This function will run when user want to get tarball for logs or both logs and scripts(.bb and .inc files)
> +python do_archive_scripts_logs(){
> + archive_scripts_logs(d)
> +}
> +
> +# This function will run when user want to know what variable and functions in a running task are and also can get a diff file including
> +# all content a package should include.
> +python do_dumpdata_create_diff_gz(){
> + dumpdata(d)
> + create_diff_gz(d)
> +}
> +
> +# This functions prepare for archiving "linux-yocto" because this package create directory 's' before do_patch instead of after do_unpack.
> +# This is special control for archiving linux-yocto only.
> +python do_archive_linux_yocto(){
> + s = d.getVar('S', True)
> + if 'linux-yocto' in s:
> + source_tar_name = archive_sources(d,'')
> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() not in 'SRPM':
> + move_tarball_deploy(d,[source_tar_name,''])
> +}
> +do_kernel_checkout[postfuncs] += "do_archive_linux_yocto "
> +
> +# remove tarball for sources, patches and logs after creating srpm.
> +python do_remove_tarball(){
> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() == 'SRPM':
> + work_dir = d.getVar('WORKDIR', True)
> + os.chdir(work_dir)
> + for file in os.listdir(os.getcwd()):
> + if file in get_package(d):
> + try:
> + os.remove(file)
> + except OSError:
> + pass
> + if os.path.exists('tar-package'):
> + os.remove('tar-package')
> +}
> +do_remove_taball[deptask] = "do_archive_scripts_logs"
> +do_package_write_rpm[postfuncs] += "do_remove_tarball "
> +export get_licenses
> +export get_package
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 2/7] archiver.bbclass: New bbclass for archiving sources, patches, logs and scripts
2012-03-19 21:04 ` Saul Wold
@ 2012-03-20 5:50 ` Xiaofeng Yan
2012-03-20 8:07 ` Koen Kooi
0 siblings, 1 reply; 23+ messages in thread
From: Xiaofeng Yan @ 2012-03-20 5:50 UTC (permalink / raw)
To: Saul Wold; +Cc: Patches and discussions about the oe-core layer
On 2012年03月20日 05:04, Saul Wold wrote:
> On 03/15/2012 11:23 PM, Xiaofeng Yan wrote:
>> From: Xiaofeng Yan<xiaofeng.yan@windriver.com>
>>
>> 1 Archive sources in ${S} in the different stage
>> (do_unpack,do_patch,do_configure).
>> 2 Archive patches including series
>> 3 Archive logs including scripts (.bb and .inc files)
>> 4 dump environment resources which show all variable and
>> functions used to xxx.showdata.dump when running a task
>> 5 dump all content in 's' including patches to file xxx.diff.gz
>>
>> All archiving packages will be deployed to ${DEPLOY_DIR}/sources/
>>
>> [#YOCTO 1977]
>>
>> Signed-off-by: Xiaofeng Yan<xiaofeng.yan@windriver.com>
>> ---
>> meta/classes/archiver.bbclass | 419
>> +++++++++++++++++++++++++++++++++++++++++
>> 1 files changed, 419 insertions(+), 0 deletions(-)
>> create mode 100644 meta/classes/archiver.bbclass
>>
>> diff --git a/meta/classes/archiver.bbclass
>> b/meta/classes/archiver.bbclass
>> new file mode 100644
>> index 0000000..de90c75
>> --- /dev/null
>> +++ b/meta/classes/archiver.bbclass
>> @@ -0,0 +1,419 @@
>> +# This file is used for archiving sources ,patches,and logs to tarball.
>> +# It also output building environment to xxx.dump.data and create
>> xxx.diff.gz to record
>> +# all content in ${S} to a diff file.
>> +
>> +EXCLUDE_FROM ?= ".pc autom4te.cache"
>> +ARCHIVE_TYPE ?= "TAR SRPM"
>> +DISTRO ?= "poky"
>> +PATCHES_ARCHIVE_WITH_SERIES = 'TRUE'
>> +
>> +def parse_var(d,var):
>> + ''' parse variable like ${PV} in "require xxx_${PV}.inc" to a real
>> value. for example, change "require xxx_${PV}.inc" to "require
>> xxx_1.2.inc" '''
>> + import re
>> + pat = re.compile('.*\$({(.*)}).*')
>> + if '$' not in var and '/' not in var:
>> + return var
>> + else:
>> + if '/' in var:
>> + return [i for i in var.split('/') if i.endswith('.inc')][0]
>> + elif '$' in var:
>> + m = pat.match(var)
>> + patstr = '\$' + m.group(1)
>> + var_str = m.group(2)
>> + return re.sub(patstr,d.getVar(var_str,True),var)
>> + else:
>> + return var
>> +
>> +def get_bb_inc(d):
>> + '''create a directory "script-logs" including .bb and .inc file in
>> ${WORKDIR}'''
>> + import re
>> + import os
>> + import shutil
>> +
>> + bbinc = []
>> + pat=re.compile('require\s*([^\s]*\.*)(.*)')
>> + file_dir = d.getVar('FILE', True)
>> + bbdir = os.path.dirname(file_dir)
>> + work_dir = d.getVar('WORKDIR', True)
>> + os.chdir(work_dir)
>> + bb.mkdirhier("script-logs")
>> + os.chdir(bbdir)
>> + bbfile = os.path.basename(file_dir)
>> + bbinc.append(bbfile)
>> +
>> + def get_inc (file):
>> + f = open(file,'r')
>> + for line in f.readlines():
>> + if 'require' not in line:
>> + bbinc.append(file)
>> + else:
>> + try:
>> + incfile = pat.match(line).group(1)
>> + incfile = parse_var(d,incfile)
>> + bbinc.append(incfile)
>> + get_inc(incfile)
>> + except (IOError,AttributeError):
>> + pass
>> + get_inc(bbfile)
>> + os.chdir(work_dir)
>> + for root, dirs, files in os.walk(bbdir):
>> + for file in bbinc:
>> + if file in files:
>> + shutil.copy(root + '/' + file,'script-logs')
>> + oe.path.copytree('temp', 'script-logs')
>> + return work_dir + '/script-logs'
>> +
>> +def get_all_patches(d):
>> + '''copy patches and series file to a pointed directory which will
>> be archived to tarball in ${WORKDIR}'''
>> + import shutil
>> +
>> + src_patches=[]
>> + pf = d.getVar('PF', True)
>> + work_dir = d.getVar('WORKDIR', True)
>> + dest = os.path.join(work_dir, pf + '-patches')
>> + shutil.rmtree(dest, ignore_errors=True)
>> + bb.mkdirhier(dest)
>> +
>> + src_uri = d.getVar('SRC_URI', 1).split()
>> + fetch = bb.fetch2.Fetch(src_uri, d)
>> + locals = (fetch.localpath(url) for url in fetch.urls)
>> + for local in locals:
>> + src_patches.append(local)
>> + for patch in src_patches[1:]:
>> + shutil.copy(patch,dest)
>> + return dest
>> +
>> +def get_applying_patches(d):
>> + """only copy applying patches to a pointed directory which will be
>> archived to tarball"""
>> + import os
>> + import shutil
>> +
>> +
>> + pf = d.getVar('PF', True)
>> + work_dir = d.getVar('WORKDIR', True)
>> + dest = os.path.join(work_dir, pf + '-patches')
>> + shutil.rmtree(dest, ignore_errors=True)
>> + bb.mkdirhier(dest)
>> +
>> +
>> + patches = src_patches(d)
>> + for patch in patches:
>> + _, _, local, _, _, parm = bb.decodeurl(patch)
>> + if local:
>> + shutil.copy(local,dest)
>> + return dest
>> +
>> +def not_tarball(d):
>> + '''packages including key words 'work-shared','native', 'task-'
>> will be passed'''
>> + import os
>> +
>> + workdir = d.getVar('WORKDIR',True)
>> + s = d.getVar('S',True)
>> + if 'work-shared' in s or 'task-' in workdir or 'native' in workdir:
>> + return True
>> + else:
>> + return False
>> +
>> +def archive_sources(d,middle_name):
>> + '''archive sources codes tree to tarball'''
>> + import tarfile
>> + import shutil
>> +
>> + s = d.getVar('S',True)
>> + workdir=d.getVar('WORKDIR', True)
>> + PF = d.getVar('PF',True)
>> + tarname = PF + '-' + middle_name + ".tar.gz"
>> +
>> + 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)
>> + try:
>> + for file in os.listdir(s):
>> + if file is not 'temp' and file is not sourcedir:
>> + shutil.copy(file,sourcedir)
>> + except (IOError,OSError):
>> + pass
>> +
>> + if (len(os.listdir(sourcedir))) != 0:
>> + tar = tarfile.open( tarname, "w:gz")
>> + tar.add(sourcedir)
>> + tar.close()
>> + if cmp(workdir,os.path.dirname(s)) and not os.path.exists(workdir +
>> '/' + tarname):
>> + shutil.move(os.path.dirname(s) + '/' + tarname,workdir)
>> + else:
>> + return
>> + return tarname
>> +
>> +def archive_patches(d,patchdir,series):
>> + '''archive patches to tarball and also include series files if
>> 'series' is True'''
>> + import tarfile
>> + import shutil
>> +
>> + s = d.getVar('S',True)
>> + work_dir = d.getVar('WORKDIR', True)
>> + os.chdir(work_dir)
>> + patch_dir = os.path.basename(patchdir)
>> + tarname = patch_dir + ".tar.gz"
>> + if series == 'all' and os.path.exists(s + '/patches/series'):
>> + shutil.copy(s + '/patches/series',patch_dir)
>> + tar = tarfile.open(tarname, "w:gz")
>> + tar.add(patch_dir)
>> + tar.close()
>> + shutil.rmtree(patch_dir, ignore_errors=True)
>> + return tarname
>> +
>> +def select_archive_patches(d,option):
>> + '''select to archive all patches including non-applying and series
>> or applying patches '''
>> + if option == "all":
>> + patchdir = get_all_patches(d)
>> + elif option == "applying":
>> + patchdir = get_applying_patches(d)
>> + try:
>> + os.rmdir(patchdir)
>> + except OSError:
>> + tarpatch = archive_patches(d,patchdir,option)
>> + return tarpatch
>> + return
>> +
>> +def archive_logs(d,logdir,bbinc=False):
>> + '''archive logs in temp to tarball and .bb and .inc files if bbinc
>> is True '''
>> + import tarfile
>> + import shutil
>> +
>> + log_dir = os.path.basename(logdir)
>> + pf = d.getVar('PF',True)
>> + tarname = pf + '-' + log_dir + ".tar.gz"
>> + tar = tarfile.open(tarname, "w:gz")
>> + tar.add(log_dir)
>> + tar.close()
>> + if bbinc:
>> + shutil.rmtree(log_dir, ignore_errors=True)
>> + return tarname
>> +
>> +def get_licenses(d):
>> + '''get licenses for running .bb file'''
>> + licenses = d.getVar('LICENSE', 1).replace('&', '|')
>> + licenses = licenses.replace('(', '').replace(')', '')
>> + clean_licenses = ""
>> + for x in licenses.split():
>> + if x.strip() == '' or x == 'CLOSED':
>> + continue
>> + if x != "|":
>> + clean_licenses += x
>> + if '|' in clean_licenses:
>> + clean_licenses = clean_licenses.replace('|','')
>> + return clean_licenses
>> +
>> +
>> +def move_tarball_deploy(d,tarball_list):
>> + '''move tarball in location to ${DEPLOY_DIR}/sources'''
>> + import shutil
>> +
>> + if tarball_list is []:
>> + return
>> + target_sys = d.getVar('TARGET_SYS', True)
>> + pf = d.getVar('PF', True)
>> + licenses = get_licenses(d)
>> + tar_sources = d.getVar('DEPLOY_DIR', True) + '/sources/' +
>> target_sys + '/' + licenses + '/' + pf
>> + if not os.path.exists(tar_sources):
>> + bb.mkdirhier(tar_sources)
>> + for source in tarball_list:
>> + if source:
>> + if os.path.exists(tar_sources + '/' + source):
>> + os.remove(tar_sources + '/' + source)
>> + shutil.move(source,tar_sources)
>> +
>> +def verify_var(d):
>> + '''check the type for archiving package('tar' or 'srpm')'''
>> + try:
>> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() not in
>> d.getVar('ARCHIVE_TYPE', True).split():
>> + raise AttributeError
>> + except AttributeError:
>> + bb.fatal("\"SOURCE_ARCHIVE_PACKAGE_TYPE\" is \'tar\' or \'srpm\',
>> no other types")
>> +
>> +def store_package(d,package_name):
>> + '''store tarbablls name to file "tar-package"'''
>> + f = open(d.getVar('WORKDIR',True )+ '/tar-package','a')
>> + f.write(package_name + ' ')
>> + f.close()
>> +
>> +def get_package(d):
>> + '''get tarballs name from "tar-package"'''
>> + os.chdir(d.getVar('WORKDIR', True))
>> + f = open('tar-package','r')
>> + line = list(set(f.readline().replace('\n','').split()))
>> + f.close()
>> + return line
>> +
>> +
>> +def archive_sources_patches(d,middle_name):
>> + '''archive sources and patches to tarball. middle_name will append
>> strings ${middle_name} to ${PR} as middle name. for example,
>> zlib-1.4.6-prepatch(middle_name).tar.gz '''
>> + import shutil
>> + verify_var(d)
>> + if not_tarball(d):
>> + return
>> +
>> + source_tar_name = archive_sources(d,middle_name)
>> + if middle_name == "prepatch":
>> + if d.getVar('PATCHES_ARCHIVE_WITH_SERIES',True).upper() == 'TRUE':
>> + patch_tar_name = select_archive_patches(d,"all")
>> + elif d.getVar('PATCHES_ARCHIVE_WITH_SERIES',True).upper() == 'FALSE':
>> + patch_tar_name = select_archive_patches(d,"applying")
>> + else:
>> + bb.fatal("Please define 'PATCHES_ARCHIVE_WITH_SERIES' is strings
>> 'True' or 'False' ")
>> + else:
>> + patch_tar_name = ''
>> +
>> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() not in
>> 'SRPM':
>> + move_tarball_deploy(d,[source_tar_name,patch_tar_name])
>> + else:
>> + tarpackage = d.getVar('WORKDIR', True) + '/tar-package'
>> + if os.path.exists(tarpackage):
>> + os.remove(tarpackage)
>> + for package in source_tar_name, patch_tar_name:
>> + if package:
>> + store_package(d,str(package) + ' ')
>> +
>> +def archive_scripts_logs(d):
>> + '''archive scripts and logs. scripts include .bb and .inc files and
>> logs include stuff in "temp".'''
>> +
>> + work_dir = d.getVar('WORKDIR', True)
>> + os.chdir(work_dir)
>> + source_archive_log_with_scripts =
>> d.getVar('SOURCE_ARCHIVE_LOG_WITH_SCRIPTS', True)
>> + if source_archive_log_with_scripts == 'logs_with_scripts':
>> + logdir = get_bb_inc(d)
>> + tarlog = archive_logs(d,logdir,True)
>> + elif source_archive_log_with_scripts == 'logs':
>> + if os.path.exists('temp'):
>> + tarlog = archive_logs(d,'temp',False)
>> + else:
>> + return
>> +
>> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() not in
>> 'SRPM':
>> + move_tarball_deploy(d,[tarlog])
>> +
>> + else:
>> + store_package(d,tarlog)
>> +
>> +def dumpdata(d):
>> + '''dump environment to "${P}-${PR}.showdata.dump" including all
>> kinds of variables and functions when running a task'''
>> + workdir = bb.data.getVar('WORKDIR', d, 1)
>> + distro = bb.data.getVar('DISTRO', d, 1)
>> + s = d.getVar('S', True)
>> + pf = d.getVar('PF', True)
>> + target_sys = d.getVar('TARGET_SYS', True)
>> + licenses = get_licenses(d)
>> + dumpdir = d.getVar('DEPLOY_DIR', True) + '/sources/' + target_sys +
>> '/' + licenses + '/' + pf
>> + if not os.path.exists(dumpdir):
>> + bb.mkdirhier(dumpdir)
>> +
>> + dumpfile = os.path.join(dumpdir,
>> bb.data.expand("${P}-${PR}.showdata.dump",d))
>> +
>> + bb.note("Dumping metadata into '%s'" % dumpfile)
>> + f = open(dumpfile, "w")
>> + # emit variables and shell functions
>> + bb.data.emit_env(f, d, True)
>> + # emit the metadata which isnt valid shell
>> + for e in d.keys():
>> + if bb.data.getVarFlag(e, 'python', d):
>> + f.write("\npython %s () {\n%s}\n" % (e, bb.data.getVar(e, d, 1)))
>> + f.close()
>> +
>> +def create_diff_gz(d):
>> + '''creating .diff.gz in ${DEPLOY_DIR_SRC}/${P}-${PR}.diff.g gz for
>> mapping all content in 's' including patches to xxx.diff.gz'''
>> + import shutil
>> +
>> + work_dir = d.getVar('WORKDIR', True)
>> + exclude_from = d.getVar('EXCLUDE_FROM', True).split()
>> + pf = d.getVar('PF', True)
>> + licenses = get_licenses(d)
>> + target_sys = d.getVar('TARGET_SYS', True)
>> + diff_dir = d.getVar('DEPLOY_DIR', True) + '/sources/' + target_sys
>> + '/' + licenses + '/' + pf
>> + diff_file = os.path.join(diff_dir,
>> bb.data.expand("${P}-${PR}.diff.gz",d))
>> + os.chdir(work_dir)
>> + f = open('temp/exclude-from-file', 'a')
>> + for i in exclude_from:
>> + f.write(i)
>> + f.write("\n")
>> + f.close()
>> +
>> + s=d.getVar('S', True)
>> + distro = d.getVar('DISTRO',True)
>> + dest = s + '/' + distro + '/files'
>> + if not os.path.exists(dest):
>> + bb.mkdirhier(dest)
>> + for i in os.listdir(os.getcwd()):
>> + if os.path.isfile(i):
>> + shutil.copy(i, dest)
>> +
>> + bb.note("Creating .diff.gz in ${DEPLOY_DIR_SRC}/${P}-${PR}.diff.gz")
>> + cmd = "LC_ALL=C TZ=UTC0 diff --exclude-from=" + work_dir +
>> "/temp/exclude-from-file -Naur " + s + '.org' + ' ' + s + " | gzip
>> -c> " + diff_file
>> + d.setVar('DIFF', cmd + "\n")
>> + d.setVarFlag('DIFF', 'func', '1')
>> + bb.build.exec_func('DIFF', d)
>> + shutil.rmtree(s + '.org', ignore_errors=True)
>> +
>> +# This function will run when user want to get tarball for sources
>> and patches after do_unpack
>> +python do_archive_original_sources_patches(){
>> + archive_sources_patches(d,'prepatch')
> Why do you rebuild the tarball here are rename it instead of just
> copying the original tarball?
>
because many packages come from non-tarball and they could be git
sources , So I archive these sources after do_unpack.
> I could understand this for SCM based packages, and even then we have
> tarballs created in the DL_DIR.
>
> I think I understand why you name it _prepatch, since it's not the
> exact original tarball.
>
> Sau!
>
>
>> +}
>> +
>> +# This function will run when user want to get tarball for patched
>> sources after do_patch
>> +python do_archive_patched_sources(){
>> + archive_sources_patches(d,'patched')
>> +}
>> +
>> +# This function will run when user want to get tarball for
>> configured sources after do_configure
>> +python do_archive_configured_sources(){
>> + archive_sources_patches(d,'configured')
>> +}
>> +
>> +# This function will run when user want to get tarball for logs or
>> both logs and scripts(.bb and .inc files)
>> +python do_archive_scripts_logs(){
>> + archive_scripts_logs(d)
>> +}
>> +
>> +# This function will run when user want to know what variable and
>> functions in a running task are and also can get a diff file including
>> +# all content a package should include.
>> +python do_dumpdata_create_diff_gz(){
>> + dumpdata(d)
>> + create_diff_gz(d)
>> +}
>> +
>> +# This functions prepare for archiving "linux-yocto" because this
>> package create directory 's' before do_patch instead of after do_unpack.
>> +# This is special control for archiving linux-yocto only.
>> +python do_archive_linux_yocto(){
>> + s = d.getVar('S', True)
>> + if 'linux-yocto' in s:
>> + source_tar_name = archive_sources(d,'')
>> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() not in
>> 'SRPM':
>> + move_tarball_deploy(d,[source_tar_name,''])
>> +}
>> +do_kernel_checkout[postfuncs] += "do_archive_linux_yocto "
>> +
>> +# remove tarball for sources, patches and logs after creating srpm.
>> +python do_remove_tarball(){
>> + if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() == 'SRPM':
>> + work_dir = d.getVar('WORKDIR', True)
>> + os.chdir(work_dir)
>> + for file in os.listdir(os.getcwd()):
>> + if file in get_package(d):
>> + try:
>> + os.remove(file)
>> + except OSError:
>> + pass
>> + if os.path.exists('tar-package'):
>> + os.remove('tar-package')
>> +}
>> +do_remove_taball[deptask] = "do_archive_scripts_logs"
>> +do_package_write_rpm[postfuncs] += "do_remove_tarball "
>> +export get_licenses
>> +export get_package
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 2/7] archiver.bbclass: New bbclass for archiving sources, patches, logs and scripts
2012-03-20 5:50 ` Xiaofeng Yan
@ 2012-03-20 8:07 ` Koen Kooi
2012-03-20 9:40 ` Xiaofeng Yan
0 siblings, 1 reply; 23+ messages in thread
From: Koen Kooi @ 2012-03-20 8:07 UTC (permalink / raw)
To: Patches and discussions about the oe-core layer
Op 20 mrt. 2012, om 06:50 heeft Xiaofeng Yan het volgende geschreven:
> On 2012年03月20日 05:04, Saul Wold wrote:
>> On 03/15/2012 11:23 PM, Xiaofeng Yan wrote:
>>> From: Xiaofeng Yan<xiaofeng.yan@windriver.com>
>>>
>> Why do you rebuild the tarball here are rename it instead of just copying the original tarball?
>>
> because many packages come from non-tarball and they could be git sources , So I archive these sources after do_unpack.
But if you have the original tarball and reuse it, you'll get the warm fuzzy feeling of matching checksums.
regards,
Koen
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 2/7] archiver.bbclass: New bbclass for archiving sources, patches, logs and scripts
2012-03-20 8:07 ` Koen Kooi
@ 2012-03-20 9:40 ` Xiaofeng Yan
2012-03-20 9:49 ` Xiaofeng Yan
0 siblings, 1 reply; 23+ messages in thread
From: Xiaofeng Yan @ 2012-03-20 9:40 UTC (permalink / raw)
To: openembedded-core
On 2012年03月20日 16:07, Koen Kooi wrote:
> Op 20 mrt. 2012, om 06:50 heeft Xiaofeng Yan het volgende geschreven:
>
>> On 2012年03月20日 05:04, Saul Wold wrote:
>>> On 03/15/2012 11:23 PM, Xiaofeng Yan wrote:
>>>> From: Xiaofeng Yan<xiaofeng.yan@windriver.com>
>>>>
>>> Why do you rebuild the tarball here are rename it instead of just copying the original tarball?
>>>
>> because many packages come from non-tarball and they could be git sources , So I archive these sources after do_unpack.
> But if you have the original tarball and reuse it, you'll get the warm fuzzy feeling of matching checksums.
So How about renaming archive-original-source to archive-prepatched-source?
> regards,
>
> Koen
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core@lists.openembedded.org
> http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 2/7] archiver.bbclass: New bbclass for archiving sources, patches, logs and scripts
2012-03-20 9:40 ` Xiaofeng Yan
@ 2012-03-20 9:49 ` Xiaofeng Yan
2012-03-20 10:00 ` Anders Darander
0 siblings, 1 reply; 23+ messages in thread
From: Xiaofeng Yan @ 2012-03-20 9:49 UTC (permalink / raw)
To: openembedded-core
On 2012年03月20日 17:40, Xiaofeng Yan wrote:
> On 2012年03月20日 16:07, Koen Kooi wrote:
>> Op 20 mrt. 2012, om 06:50 heeft Xiaofeng Yan het volgende geschreven:
>>
>>> On 2012年03月20日 05:04, Saul Wold wrote:
>>>> On 03/15/2012 11:23 PM, Xiaofeng Yan wrote:
>>>>> From: Xiaofeng Yan<xiaofeng.yan@windriver.com>
>>>>>
>>>> Why do you rebuild the tarball here are rename it instead of just
>>>> copying the original tarball?
>>>>
>>> because many packages come from non-tarball and they could be git
>>> sources , So I archive these sources after do_unpack.
>> But if you have the original tarball and reuse it, you'll get the
>> warm fuzzy feeling of matching checksums.
> So How about renaming archive-original-source to
> archive-prepatched-source?
Hi Saul,
Or I can add a new functions to get tarball from downloads if have
tarball and archive source codes directory if have directory without
tarball.
Do you think it is necessary for us to add this function?
Thanks
Yan
>> regards,
>>
>> Koen
>> _______________________________________________
>> Openembedded-core mailing list
>> Openembedded-core@lists.openembedded.org
>> http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core
>
>
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core@lists.openembedded.org
> http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 2/7] archiver.bbclass: New bbclass for archiving sources, patches, logs and scripts
2012-03-20 9:49 ` Xiaofeng Yan
@ 2012-03-20 10:00 ` Anders Darander
2012-03-20 14:41 ` Saul Wold
0 siblings, 1 reply; 23+ messages in thread
From: Anders Darander @ 2012-03-20 10:00 UTC (permalink / raw)
To: Patches and discussions about the oe-core layer
On Tue, Mar 20, 2012 at 10:49, Xiaofeng Yan <xiaofeng.yan@windriver.com> wrote:
> On 2012年03月20日 17:40, Xiaofeng Yan wrote:
>>
>> On 2012年03月20日 16:07, Koen Kooi wrote:
>>>
>>> Op 20 mrt. 2012, om 06:50 heeft Xiaofeng Yan het volgende geschreven:
>>>
>>>> On 2012年03月20日 05:04, Saul Wold wrote:
>>>>>
>>>>> On 03/15/2012 11:23 PM, Xiaofeng Yan wrote:
>>>>>>
>>>>>> From: Xiaofeng Yan<xiaofeng.yan@windriver.com>
>>>>>>
>>>>> Why do you rebuild the tarball here are rename it instead of just
>>>>> copying the original tarball?
>>>>>
>>>> because many packages come from non-tarball and they could be git
>>>> sources , So I archive these sources after do_unpack.
>>>
>>> But if you have the original tarball and reuse it, you'll get the warm
>>> fuzzy feeling of matching checksums.
>>
>> So How about renaming archive-original-source to
>> archive-prepatched-source?
>
> Hi Saul,
>
> Or I can add a new functions to get tarball from downloads if have tarball
> and archive source codes directory if have directory without tarball.
> Do you think it is necessary for us to add this function?
I'd say that this is a change that should be made. If nothing else,
just to get the assurance that the archived tarball's are the same as
the ones that was used to build the system. (This is beneficial both
when it comes to using the archived tarballs for rebuilding the
system, as well as for ensuring licence compliance).
/Anders
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 2/7] archiver.bbclass: New bbclass for archiving sources, patches, logs and scripts
2012-03-20 10:00 ` Anders Darander
@ 2012-03-20 14:41 ` Saul Wold
2012-03-21 6:39 ` Xiaofeng Yan
0 siblings, 1 reply; 23+ messages in thread
From: Saul Wold @ 2012-03-20 14:41 UTC (permalink / raw)
To: Patches and discussions about the oe-core layer
On 03/20/2012 03:00 AM, Anders Darander wrote:
> On Tue, Mar 20, 2012 at 10:49, Xiaofeng Yan<xiaofeng.yan@windriver.com> wrote:
>> On 2012年03月20日 17:40, Xiaofeng Yan wrote:
>>>
>>> On 2012年03月20日 16:07, Koen Kooi wrote:
>>>>
>>>> Op 20 mrt. 2012, om 06:50 heeft Xiaofeng Yan het volgende geschreven:
>>>>
>>>>> On 2012年03月20日 05:04, Saul Wold wrote:
>>>>>>
>>>>>> On 03/15/2012 11:23 PM, Xiaofeng Yan wrote:
>>>>>>>
>>>>>>> From: Xiaofeng Yan<xiaofeng.yan@windriver.com>
>>>>>>>
>>>>>> Why do you rebuild the tarball here are rename it instead of just
>>>>>> copying the original tarball?
>>>>>>
>>>>> because many packages come from non-tarball and they could be git
>>>>> sources , So I archive these sources after do_unpack.
>>>>
>>>> But if you have the original tarball and reuse it, you'll get the warm
>>>> fuzzy feeling of matching checksums.
>>>
>>> So How about renaming archive-original-source to
>>> archive-prepatched-source?
>>
>> Hi Saul,
>>
>> Or I can add a new functions to get tarball from downloads if have tarball
>> and archive source codes directory if have directory without tarball.
>> Do you think it is necessary for us to add this function?
>
> I'd say that this is a change that should be made. If nothing else,
> just to get the assurance that the archived tarball's are the same as
> the ones that was used to build the system. (This is beneficial both
> when it comes to using the archived tarballs for rebuilding the
> system, as well as for ensuring licence compliance).
>
I agree here, as Koen also pointed out, it will have matching checksums.
As to the name of the tarball, again best to keep it named the same as
the original tarball.
Sau!
> /Anders
>
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core@lists.openembedded.org
> http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 2/7] archiver.bbclass: New bbclass for archiving sources, patches, logs and scripts
2012-03-20 14:41 ` Saul Wold
@ 2012-03-21 6:39 ` Xiaofeng Yan
0 siblings, 0 replies; 23+ messages in thread
From: Xiaofeng Yan @ 2012-03-21 6:39 UTC (permalink / raw)
To: openembedded-core
On 2012年03月20日 22:41, Saul Wold wrote:
> On 03/20/2012 03:00 AM, Anders Darander wrote:
>> On Tue, Mar 20, 2012 at 10:49, Xiaofeng
>> Yan<xiaofeng.yan@windriver.com> wrote:
>>> On 2012年03月20日 17:40, Xiaofeng Yan wrote:
>>>>
>>>> On 2012年03月20日 16:07, Koen Kooi wrote:
>>>>>
>>>>> Op 20 mrt. 2012, om 06:50 heeft Xiaofeng Yan het volgende geschreven:
>>>>>
>>>>>> On 2012年03月20日 05:04, Saul Wold wrote:
>>>>>>>
>>>>>>> On 03/15/2012 11:23 PM, Xiaofeng Yan wrote:
>>>>>>>>
>>>>>>>> From: Xiaofeng Yan<xiaofeng.yan@windriver.com>
>>>>>>>>
>>>>>>> Why do you rebuild the tarball here are rename it instead of just
>>>>>>> copying the original tarball?
>>>>>>>
>>>>>> because many packages come from non-tarball and they could be git
>>>>>> sources , So I archive these sources after do_unpack.
>>>>>
>>>>> But if you have the original tarball and reuse it, you'll get the
>>>>> warm
>>>>> fuzzy feeling of matching checksums.
>>>>
>>>> So How about renaming archive-original-source to
>>>> archive-prepatched-source?
>>>
>>> Hi Saul,
>>>
>>> Or I can add a new functions to get tarball from downloads if have
>>> tarball
>>> and archive source codes directory if have directory without tarball.
>>> Do you think it is necessary for us to add this function?
>>
>> I'd say that this is a change that should be made. If nothing else,
>> just to get the assurance that the archived tarball's are the same as
>> the ones that was used to build the system. (This is beneficial both
>> when it comes to using the archived tarballs for rebuilding the
>> system, as well as for ensuring licence compliance).
>>
> I agree here, as Koen also pointed out, it will have matching checksums.
>
> As to the name of the tarball, again best to keep it named the same as
> the original tarball.
>
> Sau!
got it. I will release V4 for this feature this week.
>
>> /Anders
>>
>> _______________________________________________
>> Openembedded-core mailing list
>> Openembedded-core@lists.openembedded.org
>> http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core
>
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core@lists.openembedded.org
> http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core
^ permalink raw reply [flat|nested] 23+ messages in thread
end of thread, other threads:[~2012-03-21 6:48 UTC | newest]
Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-03-13 12:52 [PATCH 0/7] Realize archiving functions Xiaofeng Yan
2012-03-13 12:52 ` [PATCH 1/7] package_rpm: Add srpm function to this bbclass Xiaofeng Yan
2012-03-13 23:24 ` Saul Wold
2012-03-14 12:27 ` Xiaofeng Yan
2012-03-13 12:52 ` [PATCH 2/7] archiver.bbclass: New bbclass for archiving sources, patches, logs and scripts Xiaofeng Yan
2012-03-14 2:57 ` Saul Wold
2012-03-14 12:30 ` Xiaofeng Yan
2012-03-13 12:52 ` [PATCH 3/7] archive-patched-source.bbclass: Archive patched source Xiaofeng Yan
2012-03-13 12:52 ` [PATCH 4/7] archive-configured-source.bbclass: Archive configured source Xiaofeng Yan
2012-03-13 12:52 ` [PATCH 5/7] archive-original-source.bbclass: Archive original source Xiaofeng Yan
2012-03-13 12:52 ` [PATCH 6/7] local.conf.sample: Add set for archiving packages Xiaofeng Yan
2012-03-14 2:57 ` Saul Wold
2012-03-14 5:37 ` Xiaofeng Yan
2012-03-13 12:52 ` [PATCH 7/7] sourcepkg, src_distribute, src_distribute_local: remove three bbclass Xiaofeng Yan
-- strict thread matches above, loose matches on Subject: below --
2012-03-16 6:23 [PATCH 0/7] Realize archiving functions Xiaofeng Yan
2012-03-16 6:23 ` [PATCH 2/7] archiver.bbclass: New bbclass for archiving sources, patches, logs and scripts Xiaofeng Yan
2012-03-19 21:04 ` Saul Wold
2012-03-20 5:50 ` Xiaofeng Yan
2012-03-20 8:07 ` Koen Kooi
2012-03-20 9:40 ` Xiaofeng Yan
2012-03-20 9:49 ` Xiaofeng Yan
2012-03-20 10:00 ` Anders Darander
2012-03-20 14:41 ` Saul Wold
2012-03-21 6:39 ` Xiaofeng Yan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox