diff options
Diffstat (limited to 'meta/classes/archiver.bbclass')
-rw-r--r-- | meta/classes/archiver.bbclass | 288 |
1 files changed, 172 insertions, 116 deletions
diff --git a/meta/classes/archiver.bbclass b/meta/classes/archiver.bbclass index 117ad02..b01b078 100644 --- a/meta/classes/archiver.bbclass +++ b/meta/classes/archiver.bbclass @@ -1,9 +1,9 @@ # ex:ts=4:sw=4:sts=4:et # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- # -# 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. +# This file is used for archiving sources, patches, and logs to a +# 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. # ARCHIVE_EXCLUDE_FROM ?= ".pc autom4te.cache" @@ -11,11 +11,11 @@ ARCHIVE_TYPE ?= "TAR SRPM" DISTRO ?= "poky" PATCHES_ARCHIVE_WITH_SERIES = 'TRUE' SOURCE_ARCHIVE_LOG_WITH_SCRIPTS ?= '${@d.getVarFlag('ARCHIVER_MODE', 'log_type') \ - if d.getVarFlag('ARCHIVER_MODE', 'log_type') != 'none' else 'logs_with_scripts'}' -SOURCE_ARCHIVE_PACKAGE_TYPE ?= '${@d.getVarFlag('ARCHIVER_MODE','type') \ - if d.getVarFlag('ARCHIVER_MODE', 'log_type')!= 'none' else 'tar'}' -FILTER ?= '${@d.getVarFlag('ARCHIVER_MODE','filter') \ - if d.getVarFlag('ARCHIVER_MODE', 'filter')!= 'none' else 'no'}' + if d.getVarFlag('ARCHIVER_MODE', 'log_type') != 'none' else 'logs_with_scripts'}' +SOURCE_ARCHIVE_PACKAGE_TYPE ?= '${@d.getVarFlag('ARCHIVER_MODE', 'type') \ + if d.getVarFlag('ARCHIVER_MODE', 'log_type') != 'none' else 'tar'}' +FILTER ?= '${@d.getVarFlag('ARCHIVER_MODE', 'filter') \ + if d.getVarFlag('ARCHIVER_MODE', 'filter')!= 'none' else 'no'}' COPYLEFT_LICENSE_INCLUDE ?= 'GPL* LGPL*' @@ -44,7 +44,9 @@ def copyleft_recipe_type(d): return 'target' def copyleft_should_include(d): - """Determine if this recipe's sources should be deployed for compliance""" + """ + Determine if this recipe's sources should be deployed for compliance + """ import ast import oe.license from fnmatch import fnmatchcase as fnmatch @@ -67,7 +69,11 @@ def copyleft_should_include(d): return False, 'recipe has excluded licenses: %s' % ', '.join(reason) def tar_filter(d): - """Only tarball the packages belonging to COPYLEFT_LICENSE_INCLUDE and miss packages in COPYLEFT_LICENSE_EXCLUDE. Don't tarball any packages when \"FILTER\" is \"no\"""" + """ + Only archive the package belongs to COPYLEFT_LICENSE_INCLUDE + and ignore the one in COPYLEFT_LICENSE_EXCLUDE. Don't exclude any + packages when \"FILTER\" is \"no\" + """ if d.getVar('FILTER', True).upper() == "YES": included, reason = copyleft_should_include(d) if not included: @@ -78,7 +84,9 @@ def tar_filter(d): return False def get_bb_inc(d): - '''create a directory "script-logs" including .bb and .inc file in ${WORKDIR}''' + """ + create a directory "script-logs" including .bb and .inc file in ${WORKDIR} + """ import re import shutil @@ -87,26 +95,26 @@ def get_bb_inc(d): work_dir = d.getVar('WORKDIR', True) bbfile = d.getVar('FILE', True) bbdir = os.path.dirname(bbfile) - script_logs = os.path.join(work_dir,'script-logs') - bb_inc = os.path.join(script_logs,'bb_inc') + script_logs = os.path.join(work_dir, 'script-logs') + bb_inc = os.path.join(script_logs, 'bb_inc') bb.mkdirhier(script_logs) bb.mkdirhier(bb_inc) - def find_file(dir,file): + def find_file(dir, file): for root, dirs, files in os.walk(dir): if file in files: - return os.path.join(root,file) + return os.path.join(root, file) def get_inc (file): - f = open(file,'r') + 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 = bb.data.expand(os.path.basename(incfile),d) - abs_incfile = find_file(bbdir,incfile) + incfile = bb.data.expand(os.path.basename(incfile), d) + abs_incfile = find_file(bbdir, incfile) if abs_incfile: bbinc.append(abs_incfile) get_inc(abs_incfile) @@ -115,23 +123,26 @@ def get_bb_inc(d): get_inc(bbfile) bbinc = list(set(bbinc)) for bbincfile in bbinc: - shutil.copy(bbincfile,bb_inc) + shutil.copy(bbincfile, bb_inc) try: - bb.mkdirhier(os.path.join(script_logs,'temp')) - oe.path.copytree(os.path.join(work_dir,'temp'), os.path.join(script_logs,'temp')) - except (IOError,AttributeError): + bb.mkdirhier(os.path.join(script_logs, 'temp')) + oe.path.copytree(os.path.join(work_dir, 'temp'), os.path.join(script_logs, 'temp')) + except (IOError, AttributeError): pass return script_logs def get_series(d): - '''copy patches and series file to a pointed directory which will be archived to tarball in ${WORKDIR}''' + """ + 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) - s = d.getVar('S',True) + s = d.getVar('S', True) dest = os.path.join(work_dir, pf + '-series') shutil.rmtree(dest, ignore_errors=True) bb.mkdirhier(dest) @@ -141,22 +152,25 @@ def get_series(d): locals = (fetch.localpath(url) for url in fetch.urls) for local in locals: src_patches.append(local) - if not cmp(work_dir,s): + if not cmp(work_dir, s): tmp_list = src_patches else: tmp_list = src_patches[1:] for patch in tmp_list: try: - shutil.copy(patch,dest) + shutil.copy(patch, dest) except IOError: if os.path.isdir(patch): - bb.mkdirhier(os.path.join(dest,patch)) - oe.path.copytree(patch, os.path.join(dest,patch)) + bb.mkdirhier(os.path.join(dest, patch)) + oe.path.copytree(patch, os.path.join(dest, patch)) return dest def get_applying_patches(d): - """only copy applying patches to a pointed directory which will be archived to tarball""" + """ + only copy applying patches to a pointed directory which will be + archived to tarball + """ import shutil pf = d.getVar('PF', True) @@ -169,35 +183,40 @@ def get_applying_patches(d): for patch in patches: _, _, local, _, _, parm = bb.decodeurl(patch) if local: - shutil.copy(local,dest) + shutil.copy(local, dest) return dest def not_tarball(d): - '''packages including key words 'work-shared','native', 'task-' will be passed''' - - workdir = d.getVar('WORKDIR',True) - s = d.getVar('S',True) + """ + packages including key words 'work-shared', 'native', 'task-' will be passed + """ + 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 get_source_from_downloads(d,stage_name): - '''copy tarball of $P to $WORKDIR when this tarball exists in $DL_DIR''' +def get_source_from_downloads(d, stage_name): + """ + copy tarball of $P to $WORKDIR when this tarball exists in $DL_DIR + """ if stage_name in 'patched' 'configured': return pf = d.getVar('PF', True) - dl_dir = d.getVar('DL_DIR',True) + dl_dir = d.getVar('DL_DIR', True) try: - source = os.path.join(dl_dir,os.path.basename(d.getVar('SRC_URI', True).split()[0])) + source = os.path.join(dl_dir, os.path.basename(d.getVar('SRC_URI', True).split()[0])) if os.path.exists(source) and not os.path.isdir(source): return source except (IndexError, OSError): pass return '' -def do_tarball(workdir,srcdir,tarname): - '''tar "srcdir" under "workdir" to "tarname"''' +def do_tarball(workdir, srcdir, tarname): + """ + tar "srcdir" under "workdir" to "tarname" + """ import tarfile sav_dir = os.getcwd() @@ -211,54 +230,66 @@ def do_tarball(workdir,srcdir,tarname): os.chdir(sav_dir) return tarname -def archive_sources_from_directory(d,stage_name): - '''archive sources codes tree to tarball when tarball of $P doesn't exist in $DL_DIR''' +def archive_sources_from_directory(d, stage_name): + """ + archive sources codes tree to tarball when tarball of $P doesn't + exist in $DL_DIR + """ import shutil - s = d.getVar('S',True) + s = d.getVar('S', True) work_dir=d.getVar('WORKDIR', True) - PF = d.getVar('PF',True) + PF = d.getVar('PF', True) tarname = PF + '-' + stage_name + ".tar.gz" if os.path.exists(s) and work_dir in s: try: - source_dir = os.path.join(work_dir,[ i for i in s.replace(work_dir,'').split('/') if i][0]) + source_dir = os.path.join(work_dir, [ i for i in s.replace(work_dir, '').split('/') if i][0]) except IndexError: - if not cmp(s,work_dir): + if not cmp(s, work_dir): return '' else: return '' source = os.path.basename(source_dir) - return do_tarball(work_dir,source,tarname) + return do_tarball(work_dir, source, tarname) -def archive_sources(d,stage_name): - '''copy tarball from $DL_DIR to $WORKDIR if have tarball, archive source codes tree in $WORKDIR if $P is directory instead of tarball''' +def archive_sources(d, stage_name): + """ + copy tarball from $DL_DIR to $WORKDIR if have tarball, archive + source codes tree in $WORKDIR if $P is directory instead of tarball + """ import shutil - work_dir = d.getVar('WORKDIR',True) - file = get_source_from_downloads(d,stage_name) + + work_dir = d.getVar('WORKDIR', True) + file = get_source_from_downloads(d, stage_name) if file: - shutil.copy(file,work_dir) + shutil.copy(file, work_dir) file = os.path.basename(file) else: - file = archive_sources_from_directory(d,stage_name) + file = archive_sources_from_directory(d, stage_name) return file -def archive_patches(d,patchdir,series): - '''archive patches to tarball and also include series files if 'series' is True''' +def archive_patches(d, patchdir, series): + """ + archive patches to tarball and also include series files if 'series' is True + """ import shutil - s = d.getVar('S',True) + s = d.getVar('S', True) work_dir = d.getVar('WORKDIR', True) patch_dir = os.path.basename(patchdir) tarname = patch_dir + ".tar.gz" - if series == 'all' and os.path.exists(os.path.join(s,'patches/series')): - shutil.copy(os.path.join(s,'patches/series'),patchdir) - tarname = do_tarball(work_dir,patch_dir,tarname) + if series == 'all' and os.path.exists(os.path.join(s, 'patches/series')): + shutil.copy(os.path.join(s, 'patches/series'), patchdir) + tarname = do_tarball(work_dir, patch_dir, tarname) shutil.rmtree(patchdir, ignore_errors=True) return tarname -def select_archive_patches(d,option): - '''select to archive all patches including non-applying and series or applying patches ''' +def select_archive_patches(d, option): + """ + select to archive all patches including non-applying and series or + applying patches + """ if option == "all": patchdir = get_series(d) elif option == "applying": @@ -266,25 +297,27 @@ def select_archive_patches(d,option): try: os.rmdir(patchdir) except OSError: - tarpatch = archive_patches(d,patchdir,option) + 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 ''' +def archive_logs(d, logdir, bbinc=False): + """ + archive logs in temp to tarball and .bb and .inc files if bbinc is True + """ import shutil - pf = d.getVar('PF',True) - work_dir = d.getVar('WORKDIR',True) + pf = d.getVar('PF', True) + work_dir = d.getVar('WORKDIR', True) log_dir = os.path.basename(logdir) tarname = pf + '-' + log_dir + ".tar.gz" - tarname = do_tarball(work_dir,log_dir,tarname) + tarname = do_tarball(work_dir, log_dir, tarname) if bbinc: shutil.rmtree(logdir, ignore_errors=True) return tarname def get_licenses(d): - '''get licenses for running .bb file''' + """get licenses for running .bb file""" import oe.license licenses_type = d.getVar('LICENSE', True) or "" @@ -299,8 +332,8 @@ def get_licenses(d): return lice -def move_tarball_deploy(d,tarball_list): - '''move tarball in location to ${DEPLOY_DIR}/sources''' +def move_tarball_deploy(d, tarball_list): + """move tarball in location to ${DEPLOY_DIR}/sources""" import shutil if tarball_list is []: @@ -308,100 +341,114 @@ def move_tarball_deploy(d,tarball_list): target_sys = d.getVar('TARGET_SYS', True) pf = d.getVar('PF', True) licenses = get_licenses(d) - work_dir = d.getVar('WORKDIR',True) + work_dir = d.getVar('WORKDIR', True) 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(os.path.join(tar_sources, source)): - os.remove(os.path.join(tar_sources,source)) - shutil.move(os.path.join(work_dir,source),tar_sources) + os.remove(os.path.join(tar_sources, source)) + shutil.move(os.path.join(work_dir, source), tar_sources) def check_archiving_type(d): - '''check the type for archiving package('tar' or 'srpm')''' + """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"''' +def store_package(d, package_name): + """ + store tarbablls name to file "tar-package" + """ try: - f = open(os.path.join(d.getVar('WORKDIR',True),'tar-package'),'a') + f = open(os.path.join(d.getVar('WORKDIR', True), 'tar-package'), 'a') f.write(package_name + ' ') f.close() except IOError: pass def get_package(d): - '''get tarballs name from "tar-package"''' + """ + get tarballs name from "tar-package" + """ work_dir = (d.getVar('WORKDIR', True)) - tarpackage = os.path.join(work_dir,'tar-package') + tarpackage = os.path.join(work_dir, 'tar-package') try: - f = open(tarpackage,'r') - line = list(set(f.readline().replace('\n','').split())) - except UnboundLocalError,IOError: + f = open(tarpackage, 'r') + line = list(set(f.readline().replace('\n', '').split())) + except UnboundLocalError, IOError: pass f.close() return line -def archive_sources_patches(d,stage_name): - '''archive sources and patches to tarball. stage_name will append strings ${stage_name} to ${PR} as middle name. for example, zlib-1.4.6-prepatch(stage_name).tar.gz ''' +def archive_sources_patches(d, stage_name): + """ + archive sources and patches to tarball. stage_name will append + strings ${stage_name} to ${PR} as middle name. for example, + zlib-1.4.6-prepatch(stage_name).tar.gz + """ import shutil check_archiving_type(d) if not_tarball(d) or tar_filter(d): return - source_tar_name = archive_sources(d,stage_name) + source_tar_name = archive_sources(d, stage_name) if stage_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") + 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]) + move_tarball_deploy(d, [source_tar_name, patch_tar_name]) else: - tarpackage = os.path.join(d.getVar('WORKDIR', True),'tar-package') + tarpackage = os.path.join(d.getVar('WORKDIR', True), 'tar-package') if os.path.exists(tarpackage): os.remove(tarpackage) for package in os.path.basename(source_tar_name), patch_tar_name: if package: - store_package(d,str(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".''' + """ + archive scripts and logs. scripts include .bb and .inc files and + logs include stuff in "temp". + """ if tar_filter(d): return work_dir = d.getVar('WORKDIR', True) - temp_dir = os.path.join(work_dir,'temp') + temp_dir = os.path.join(work_dir, 'temp') 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) + tarlog = archive_logs(d, logdir, True) elif source_archive_log_with_scripts == 'logs': if os.path.exists(temp_dir): - tarlog = archive_logs(d,temp_dir,False) + tarlog = archive_logs(d, temp_dir, False) else: return if d.getVar('SOURCE_ARCHIVE_PACKAGE_TYPE', True).upper() not in 'SRPM': - move_tarball_deploy(d,[tarlog]) + move_tarball_deploy(d, [tarlog]) else: - store_package(d,tarlog) + 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''' + """ + dump environment to "${P}-${PR}.showdata.dump" including all + kinds of variables and functions when running a task + """ if tar_filter(d): return @@ -415,20 +462,23 @@ def dumpdata(d): if not os.path.exists(dumpdir): bb.mkdirhier(dumpdir) - dumpfile = os.path.join(dumpdir, bb.data.expand("${P}-${PR}.showdata.dump",d)) + 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 + # emit the metadata which isn't 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''' + """ + 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 import subprocess @@ -467,41 +517,47 @@ def create_diff_gz(d): 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 +# 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') + archive_sources_patches(d, 'prepatch') } -# This function will run when user want to get tarball for patched sources after do_patch +# 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') + archive_sources_patches(d, 'patched') } -# This function will run when user want to get tarball for configured sources after do_configure +# 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') + 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) +# 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 +# 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. +# 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,'') + 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,'']) + move_tarball_deploy(d, [source_tar_name, '']) } do_kernel_checkout[postfuncs] += "do_archive_linux_yocto " @@ -513,8 +569,8 @@ python do_remove_tarball(){ for file in os.listdir(os.getcwd()): if file in get_package(d): os.remove(file) - os.remove(os.path.join(work_dir,'tar-package')) - except (TypeError,OSError): + os.remove(os.path.join(work_dir, 'tar-package')) + except (TypeError, OSError): pass } do_remove_taball[deptask] = "do_archive_scripts_logs" |