generic-poky/meta/classes/compress_doc.bbclass
Richard Purdie 7fa6eeba1c classes/lib: Add expand parameter to getVarFlag
This sets the scene for removing the default False for expansion
from getVarFlag. This would later allow True to become the default.

On the most part this is an automatic translation with:

sed -e 's:\(\.getVarFlag([^,()]*, [^,()]*\)):\1, True):g'  -i `grep -ril getVar *`

In this case, the default was False, but True was used since in most
cases here expansion would be expected.

(From OE-Core rev: 42a10788e89b07b14a150ced07113566cf99fcdd)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2016-02-04 23:39:00 +00:00

261 lines
10 KiB
Text

# Compress man pages in ${mandir} and info pages in ${infodir}
#
# 1. The doc will be compressed to gz format by default.
#
# 2. It will automatically correct the compressed doc which is not
# in ${DOC_COMPRESS} but in ${DOC_COMPRESS_LIST} to the format
# of ${DOC_COMPRESS} policy
#
# 3. It is easy to add a new type compression by editing
# local.conf, such as:
# DOC_COMPRESS_LIST_append = ' abc'
# DOC_COMPRESS = 'abc'
# DOC_COMPRESS_CMD[abc] = 'abc compress cmd ***'
# DOC_DECOMPRESS_CMD[abc] = 'abc decompress cmd ***'
# All supported compression policy
DOC_COMPRESS_LIST ?= "gz xz bz2"
# Compression policy, must be one of ${DOC_COMPRESS_LIST}
DOC_COMPRESS ?= "gz"
# Compression shell command
DOC_COMPRESS_CMD[gz] ?= 'gzip -v -9 -n'
DOC_COMPRESS_CMD[bz2] ?= "bzip2 -v -9"
DOC_COMPRESS_CMD[xz] ?= "xz -v"
# Decompression shell command
DOC_DECOMPRESS_CMD[gz] ?= 'gunzip -v'
DOC_DECOMPRESS_CMD[bz2] ?= "bunzip2 -v"
DOC_DECOMPRESS_CMD[xz] ?= "unxz -v"
PACKAGE_PREPROCESS_FUNCS += "package_do_compress_doc compress_doc_updatealternatives"
python package_do_compress_doc() {
compress_mode = d.getVar('DOC_COMPRESS', True)
compress_list = (d.getVar('DOC_COMPRESS_LIST', True) or '').split()
if compress_mode not in compress_list:
bb.fatal('Compression policy %s not supported (not listed in %s)\n' % (compress_mode, compress_list))
dvar = d.getVar('PKGD', True)
compress_cmds = {}
decompress_cmds = {}
for mode in compress_list:
compress_cmds[mode] = d.getVarFlag('DOC_COMPRESS_CMD', mode, True)
decompress_cmds[mode] = d.getVarFlag('DOC_DECOMPRESS_CMD', mode, True)
mandir = os.path.abspath(dvar + os.sep + d.getVar("mandir", True))
if os.path.exists(mandir):
# Decompress doc files which format is not compress_mode
decompress_doc(mandir, compress_mode, decompress_cmds)
compress_doc(mandir, compress_mode, compress_cmds)
infodir = os.path.abspath(dvar + os.sep + d.getVar("infodir", True))
if os.path.exists(infodir):
# Decompress doc files which format is not compress_mode
decompress_doc(infodir, compress_mode, decompress_cmds)
compress_doc(infodir, compress_mode, compress_cmds)
}
def _get_compress_format(file, compress_format_list):
for compress_format in compress_format_list:
compress_suffix = '.' + compress_format
if file.endswith(compress_suffix):
return compress_format
return ''
# Collect hardlinks to dict, each element in dict lists hardlinks
# which points to the same doc file.
# {hardlink10: [hardlink11, hardlink12],,,}
# The hardlink10, hardlink11 and hardlink12 are the same file.
def _collect_hardlink(hardlink_dict, file):
for hardlink in hardlink_dict:
# Add to the existed hardlink
if os.path.samefile(hardlink, file):
hardlink_dict[hardlink].append(file)
return hardlink_dict
hardlink_dict[file] = []
return hardlink_dict
def _process_hardlink(hardlink_dict, compress_mode, shell_cmds, decompress=False):
for target in hardlink_dict:
if decompress:
compress_format = _get_compress_format(target, shell_cmds.keys())
cmd = "%s -f %s" % (shell_cmds[compress_format], target)
bb.note('decompress hardlink %s' % target)
else:
cmd = "%s -f %s" % (shell_cmds[compress_mode], target)
bb.note('compress hardlink %s' % target)
(retval, output) = oe.utils.getstatusoutput(cmd)
if retval:
bb.warn("de/compress file failed %s (cmd was %s)%s" % (retval, cmd, ":\n%s" % output if output else ""))
return
for hardlink_dup in hardlink_dict[target]:
if decompress:
# Remove compress suffix
compress_suffix = '.' + compress_format
new_hardlink = hardlink_dup[:-len(compress_suffix)]
new_target = target[:-len(compress_suffix)]
else:
# Append compress suffix
compress_suffix = '.' + compress_mode
new_hardlink = hardlink_dup + compress_suffix
new_target = target + compress_suffix
bb.note('hardlink %s-->%s' % (new_hardlink, new_target))
if not os.path.exists(new_hardlink):
os.link(new_target, new_hardlink)
if os.path.exists(hardlink_dup):
os.unlink(hardlink_dup)
def _process_symlink(file, compress_format, decompress=False):
compress_suffix = '.' + compress_format
if decompress:
# Remove compress suffix
new_linkname = file[:-len(compress_suffix)]
new_source = os.readlink(file)[:-len(compress_suffix)]
else:
# Append compress suffix
new_linkname = file + compress_suffix
new_source = os.readlink(file) + compress_suffix
bb.note('symlink %s-->%s' % (new_linkname, new_source))
if not os.path.exists(new_linkname):
os.symlink(new_source, new_linkname)
os.unlink(file)
def _is_info(file):
flags = '.info .info-'.split()
for flag in flags:
if flag in os.path.basename(file):
return True
return False
def _is_man(file):
import re
# It refers MANSECT-var in man(1.6g)'s man.config
# ".1:.1p:.8:.2:.3:.3p:.4:.5:.6:.7:.9:.0p:.tcl:.n:.l:.p:.o"
# Not start with '.', and contain the above colon-seperate element
p = re.compile(r'[^\.]+\.([1-9lnop]|0p|tcl)')
if p.search(file):
return True
return False
def _is_compress_doc(file, compress_format_list):
compress_format = _get_compress_format(file, compress_format_list)
compress_suffix = '.' + compress_format
if file.endswith(compress_suffix):
# Remove the compress suffix
uncompress_file = file[:-len(compress_suffix)]
if _is_info(uncompress_file) or _is_man(uncompress_file):
return True, compress_format
return False, ''
def compress_doc(topdir, compress_mode, compress_cmds):
hardlink_dict = {}
for root, dirs, files in os.walk(topdir):
for f in files:
file = os.path.join(root, f)
if os.path.isdir(file):
continue
if _is_info(file) or _is_man(file):
# Symlink
if os.path.islink(file):
_process_symlink(file, compress_mode)
# Hardlink
elif os.lstat(file).st_nlink > 1:
_collect_hardlink(hardlink_dict, file)
# Normal file
elif os.path.isfile(file):
cmd = "%s %s" % (compress_cmds[compress_mode], file)
(retval, output) = oe.utils.getstatusoutput(cmd)
if retval:
bb.warn("compress failed %s (cmd was %s)%s" % (retval, cmd, ":\n%s" % output if output else ""))
continue
bb.note('compress file %s' % file)
_process_hardlink(hardlink_dict, compress_mode, compress_cmds)
# Decompress doc files which format is not compress_mode
def decompress_doc(topdir, compress_mode, decompress_cmds):
hardlink_dict = {}
decompress = True
for root, dirs, files in os.walk(topdir):
for f in files:
file = os.path.join(root, f)
if os.path.isdir(file):
continue
res, compress_format = _is_compress_doc(file, decompress_cmds.keys())
# Decompress files which format is not compress_mode
if res and compress_mode!=compress_format:
# Symlink
if os.path.islink(file):
_process_symlink(file, compress_format, decompress)
# Hardlink
elif os.lstat(file).st_nlink > 1:
_collect_hardlink(hardlink_dict, file)
# Normal file
elif os.path.isfile(file):
cmd = "%s %s" % (decompress_cmds[compress_format], file)
(retval, output) = oe.utils.getstatusoutput(cmd)
if retval:
bb.warn("decompress failed %s (cmd was %s)%s" % (retval, cmd, ":\n%s" % output if output else ""))
continue
bb.note('decompress file %s' % file)
_process_hardlink(hardlink_dict, compress_mode, decompress_cmds, decompress)
python compress_doc_updatealternatives () {
if not bb.data.inherits_class('update-alternatives', d):
return
mandir = d.getVar("mandir", True)
infodir = d.getVar("infodir", True)
compress_mode = d.getVar('DOC_COMPRESS', True)
for pkg in (d.getVar('PACKAGES', True) or "").split():
old_names = (d.getVar('ALTERNATIVE_%s' % pkg, True) or "").split()
new_names = []
for old_name in old_names:
old_link = d.getVarFlag('ALTERNATIVE_LINK_NAME', old_name, True)
old_target = d.getVarFlag('ALTERNATIVE_TARGET_%s' % pkg, old_name, True) or \
d.getVarFlag('ALTERNATIVE_TARGET', old_name, True) or \
d.getVar('ALTERNATIVE_TARGET_%s' % pkg, True) or \
d.getVar('ALTERNATIVE_TARGET', True) or \
old_link
# Sometimes old_target is specified as relative to the link name.
old_target = os.path.join(os.path.dirname(old_link), old_target)
# The updatealternatives used for compress doc
if mandir in old_target or infodir in old_target:
new_name = old_name + '.' + compress_mode
new_link = old_link + '.' + compress_mode
new_target = old_target + '.' + compress_mode
d.delVarFlag('ALTERNATIVE_LINK_NAME', old_name)
d.setVarFlag('ALTERNATIVE_LINK_NAME', new_name, new_link)
if d.getVarFlag('ALTERNATIVE_TARGET_%s' % pkg, old_name, True):
d.delVarFlag('ALTERNATIVE_TARGET_%s' % pkg, old_name)
d.setVarFlag('ALTERNATIVE_TARGET_%s' % pkg, new_name, new_target)
elif d.getVarFlag('ALTERNATIVE_TARGET', old_name, True):
d.delVarFlag('ALTERNATIVE_TARGET', old_name)
d.setVarFlag('ALTERNATIVE_TARGET', new_name, new_target)
elif d.getVar('ALTERNATIVE_TARGET_%s' % pkg, True):
d.setVar('ALTERNATIVE_TARGET_%s' % pkg, new_target)
elif d.getVar('ALTERNATIVE_TARGET', old_name, True):
d.setVar('ALTERNATIVE_TARGET', new_target)
new_names.append(new_name)
if new_names:
d.setVar('ALTERNATIVE_%s' % pkg, ' '.join(new_names))
}