diff options
-rwxr-xr-x | gentree.py | 140 |
1 files changed, 78 insertions, 62 deletions
@@ -30,7 +30,9 @@ class Bp_Identity(object): are added, how we actually use the others for regular printing will need to be considered. """ - def __init__(self, integrate=False, kconfig_prefix='CPTCFG_', project_prefix=''): + def __init__(self, integrate=False, kconfig_prefix='CPTCFG_', + project_prefix='', project_dir='', + target_dir='', target_dir_name=''): self.integrate = integrate self.kconfig_prefix = kconfig_prefix self.kconfig_prefix_resafe = re.escape(kconfig_prefix) @@ -38,6 +40,9 @@ class Bp_Identity(object): self.project_prefix_resafe = re.escape(project_prefix) self.full_prefix = kconfig_prefix + project_prefix self.full_prefix_resafe = re.escape(self.full_prefix) + self.project_dir = project_dir + self.target_dir = target_dir + self.target_dir_name = target_dir_name def read_copy_list(copyfile): """ @@ -217,11 +222,11 @@ def automatic_backport_mangle_c_file(name): return name.replace('/', '-') -def add_automatic_backports(args, bpid): +def add_automatic_backports(args): disable_list = [] export = re.compile(r'^EXPORT_SYMBOL(_GPL)?\((?P<sym>[^\)]*)\)') - bpi = kconfig.get_backport_info(os.path.join(args.outdir, 'compat', 'Kconfig')) - configtree = kconfig.ConfigTree(os.path.join(args.outdir, 'Kconfig')) + bpi = kconfig.get_backport_info(os.path.join(args.bpid.target_dir, 'compat', 'Kconfig')) + configtree = kconfig.ConfigTree(os.path.join(args.bpid.target_dir, 'Kconfig')) all_selects = configtree.all_selects() for sym, vals in bpi.items(): if sym.startswith('BACKPORT_BUILD_'): @@ -238,41 +243,41 @@ def add_automatic_backports(args, bpid): files.append((os.path.join('include', f), os.path.join('include', os.path.dirname(f), 'backport-' + os.path.basename(f)))) if args.git_revision: - copy_git_files(args.kerneldir, files, args.git_revision, args.outdir) + copy_git_files(args.kerneldir, files, args.git_revision, args.bpid.target_dir) else: - copy_files(args.kerneldir, files, args.outdir) + copy_files(args.kerneldir, files, args.bpid.target_dir) # now add the Makefile line - mf = open(os.path.join(args.outdir, 'compat', 'Makefile'), 'a+') + mf = open(os.path.join(args.bpid.target_dir, 'compat', 'Makefile'), 'a+') o_files = [automatic_backport_mangle_c_file(f)[:-1] + 'o' for f in c_files] if symtype == 'tristate': if not module_name: raise Exception('backporting a module requires a #module-name') for of in o_files: mf.write('%s-objs += %s\n' % (module_name, of)) - mf.write('obj-$(%s%s) += %s.o\n' % (bpid.full_prefix, sym, module_name)) + mf.write('obj-$(%s%s) += %s.o\n' % (args.bpid.full_prefix, sym, module_name)) elif symtype == 'bool': - mf.write('compat-$(%s%s) += %s\n' % (bpid.full_prefix, sym, ' '.join(o_files))) + mf.write('compat-$(%s%s) += %s\n' % (args.bpid.full_prefix, sym, ' '.join(o_files))) # finally create the include file syms = [] for f in c_files: - for l in open(os.path.join(args.outdir, 'compat', + for l in open(os.path.join(args.bpid.target_dir, 'compat', automatic_backport_mangle_c_file(f)), 'r'): m = export.match(l) if m: syms.append(m.group('sym')) for f in h_files: - outf = open(os.path.join(args.outdir, 'include', f), 'w') + outf = open(os.path.join(args.bpid.target_dir, 'include', f), 'w') outf.write('/* Automatically created during backport process */\n') - outf.write('#ifndef %s%s\n' % (bpid.full_prefix, sym)) + outf.write('#ifndef %s%s\n' % (args.bpid.full_prefix, sym)) outf.write('#include_next <%s>\n' % f) outf.write('#else\n'); for s in syms: outf.write('#undef %s\n' % s) outf.write('#define %s LINUX_BACKPORT(%s)\n' % (s, s)) outf.write('#include <%s>\n' % (os.path.dirname(f) + '/backport-' + os.path.basename(f), )) - outf.write('#endif /* %s%s */\n' % (bpid.full_prefix, sym)) + outf.write('#endif /* %s%s */\n' % (args.bpid.full_prefix, sym)) return disable_list def git_debug_init(args): @@ -283,8 +288,8 @@ def git_debug_init(args): """ if not args.gitdebug: return - git.init(tree=args.outdir) - git.commit_all("Copied backport", tree=args.outdir) + git.init(tree=args.bpid.project_dir) + git.commit_all("Copied backport", tree=args.bpid.project_dir) def git_debug_snapshot(args, name): @@ -293,7 +298,7 @@ def git_debug_snapshot(args, name): """ if not args.gitdebug: return - git.commit_all(name, tree=args.outdir) + git.commit_all(name, tree=args.bpid.project_dir) def get_rel_spec_stable(rel): """ @@ -426,12 +431,12 @@ def upload_release(args, rel_prep, logwrite=lambda x:None): if (rel_prep['stable']): korg_path += "/stable" - parent = os.path.dirname(args.outdir) - release = os.path.basename(args.outdir) + parent = os.path.dirname(args.bpid.project_dir) + release = os.path.basename(args.bpid.project_dir) tar_name = parent + '/' + release + ".tar" gzip_name = tar_name + ".gz" - create_tar_and_gz(tar_name, args.outdir) + create_tar_and_gz(tar_name, args.bpid.project_dir) logwrite(gpg.sign(tar_name, extra_args=['--armor', '--detach-sign'])) @@ -656,13 +661,42 @@ def _main(): 'of changes done by Coccinelle.') args = parser.parse_args() + # When building a package we use CPTCFG as we can rely on the + # fact that kconfig treats CONFIG_ as an environment variable + # requring less changes on code. For kernel integration we use + # the longer CONFIG_BACKPORT given that we'll be sticking to + # the kernel symbol namespace, to address that we do a final + # search / replace. Technically its possible to rely on the + # same prefix for packaging as with kernel integration but + # there are already some users of the CPTCFG prefix. + bpid = None + integrate = False + if integrate: + bpid = Bp_Identity(integrate = integrate, + kconfig_prefix = 'CONFIG_', + project_prefix = 'BACKPORT_', + project_dir = args.outdir, + target_dir = os.path.join(args.outdir, 'backports/'), + target_dir_name = 'backports/', + ) + else: + bpid = Bp_Identity(integrate = integrate, + kconfig_prefix = 'CPTCFG_', + project_prefix = '', + project_dir = args.outdir, + target_dir = args.outdir, + target_dir_name = '', + ) + def logwrite(msg): sys.stdout.write(msg) sys.stdout.write('\n') sys.stdout.flush() - return process(args.kerneldir, args.outdir, args.copy_list, - git_revision=args.git_revision, clean=args.clean, + return process(args.kerneldir, args.copy_list, + git_revision=args.git_revision, + bpid=bpid, + clean=args.clean, refresh=args.refresh, base_name=args.base_name, gitdebug=args.gitdebug, verbose=args.verbose, extra_driver=args.extra_driver, @@ -672,7 +706,8 @@ def _main(): profile_cocci=args.profile_cocci, logwrite=logwrite) -def process(kerneldir, outdir, copy_list_file, git_revision=None, +def process(kerneldir, copy_list_file, git_revision=None, + bpid=None, clean=False, refresh=False, base_name="Linux", gitdebug=False, verbose=False, extra_driver=[], kup=False, kup_test=False, @@ -681,16 +716,16 @@ def process(kerneldir, outdir, copy_list_file, git_revision=None, logwrite=lambda x:None, git_tracked_version=False): class Args(object): - def __init__(self, kerneldir, outdir, copy_list_file, - git_revision, clean, refresh, base_name, + def __init__(self, kerneldir, copy_list_file, + git_revision, bpid, clean, refresh, base_name, gitdebug, verbose, extra_driver, kup, kup_test, test_cocci, profile_cocci): self.kerneldir = kerneldir - self.outdir = outdir self.copy_list = copy_list_file self.git_revision = git_revision + self.bpid = bpid self.clean = clean self.refresh = refresh self.base_name = base_name @@ -712,30 +747,11 @@ def process(kerneldir, outdir, copy_list_file, git_revision=None, else: logwrite('Validated tree: %s' % tree) - args = Args(kerneldir, outdir, copy_list_file, - git_revision, clean, refresh, base_name, + args = Args(kerneldir, copy_list_file, + git_revision, bpid, clean, refresh, base_name, gitdebug, verbose, extra_driver, kup, kup_test, test_cocci, profile_cocci) rel_prep = None - integrate = False - - # When building a package we use CPTCFG as we can rely on the - # fact that kconfig treats CONFIG_ as an environment variable - # requring less changes on code. For kernel integration we use - # the longer CONFIG_BACKPORT given that we'll be sticking to - # the kernel symbol namespace, to address that we do a final - # search / replace. Technically its possible to rely on the - # same prefix for packaging as with kernel integration but - # there are already some users of the CPTCFG prefix. - bpid = None - if integrate: - bpid = Bp_Identity(integrate = integrate, - kconfig_prefix = 'CONFIG_', - project_prefix = 'BACKPORT_') - else: - bpid = Bp_Identity(integrate = integrate, - kconfig_prefix = 'CPTCFG_', - project_prefix = '') # start processing ... if (args.kup or args.kup_test): @@ -743,7 +759,7 @@ def process(kerneldir, outdir, copy_list_file, git_revision=None, git_paranoia(kerneldir, logwrite) rel_describe = git.describe(rev=None, tree=source_dir, extra_args=['--dirty']) - release = os.path.basename(args.outdir) + release = os.path.basename(bpid.target_dir) version = release.replace("backports-", "") rel_prep = get_rel_prep(version) @@ -768,7 +784,7 @@ def process(kerneldir, outdir, copy_list_file, git_revision=None, deplist = read_dependencies(os.path.join(source_dir, 'dependencies')) # validate output directory - check_output_dir(args.outdir, args.clean) + check_output_dir(bpid.target_dir, args.clean) # do the copy backport_files = [(x, x) for x in [ @@ -782,33 +798,33 @@ def process(kerneldir, outdir, copy_list_file, git_revision=None, else: logwrite('Get original source files from git ...') - copy_files(os.path.join(source_dir, 'backport'), backport_files, args.outdir) + copy_files(os.path.join(source_dir, 'backport'), backport_files, bpid.target_dir) git_debug_init(args) if not args.git_revision: - copy_files(args.kerneldir, copy_list, args.outdir) + copy_files(args.kerneldir, copy_list, bpid.target_dir) else: - copy_git_files(args.kerneldir, copy_list, args.git_revision, args.outdir) + copy_git_files(args.kerneldir, copy_list, args.git_revision, bpid.target_dir) # FIXME: should we add a git version of this (e.g. --git-extra-driver)? for src, copy_list in args.extra_driver: if (args.kup or args.kup_test): git_paranoia(src) - copy_files(src, read_copy_list(open(copy_list, 'r')), args.outdir) + copy_files(src, read_copy_list(open(copy_list, 'r')), bpid.target_dir) git_debug_snapshot(args, 'Add driver sources') - disable_list = add_automatic_backports(args, bpid) + disable_list = add_automatic_backports(args) if disable_list: - bpcfg = kconfig.ConfigTree(os.path.join(args.outdir, 'compat', 'Kconfig')) + bpcfg = kconfig.ConfigTree(os.path.join(bpid.target_dir, 'compat', 'Kconfig')) bpcfg.disable_symbols(disable_list) git_debug_snapshot(args, 'Add automatic backports') - apply_patches(args, "backport", source_dir, 'patches', args.outdir, logwrite) + apply_patches(args, "backport", source_dir, 'patches', bpid.target_dir, logwrite) # some post-processing is required - configtree = kconfig.ConfigTree(os.path.join(args.outdir, 'Kconfig')) + configtree = kconfig.ConfigTree(os.path.join(bpid.target_dir, 'Kconfig')) orig_symbols = configtree.symbols() logwrite('Modify Kconfig tree ...') @@ -831,7 +847,7 @@ def process(kerneldir, outdir, copy_list_file, git_revision=None, kernel_version = git.describe(rev=args.git_revision or 'HEAD', tree=args.kerneldir, extra_args=['--long']) - f = open(os.path.join(args.outdir, 'versions'), 'w') + f = open(os.path.join(bpid.target_dir, 'versions'), 'w') f.write('BACKPORTS_VERSION="%s"\n' % backports_version) f.write('BACKPORTED_KERNEL_VERSION="%s"\n' % kernel_version) f.write('BACKPORTED_KERNEL_NAME="%s"\n' % args.base_name) @@ -844,7 +860,7 @@ def process(kerneldir, outdir, copy_list_file, git_revision=None, # write local symbol list -- needed during packaging build if not bpid.integrate: - f = open(os.path.join(args.outdir, '.local-symbols'), 'w') + f = open(os.path.join(bpid.project_dir, '.local-symbols'), 'w') for sym in symbols: f.write('%s=\n' % sym) f.close() @@ -852,7 +868,7 @@ def process(kerneldir, outdir, copy_list_file, git_revision=None, # add defconfigs that we want defconfigs_dir = os.path.join(source_dir, 'backport', 'defconfigs') - os.mkdir(os.path.join(args.outdir, 'defconfigs')) + os.mkdir(os.path.join(bpid.target_dir, 'defconfigs')) for dfbase in os.listdir(defconfigs_dir): copy_defconfig = True dfsrc = os.path.join(defconfigs_dir, dfbase) @@ -868,7 +884,7 @@ def process(kerneldir, outdir, copy_list_file, git_revision=None, copy_defconfig = False break if copy_defconfig: - shutil.copy(dfsrc, os.path.join(args.outdir, 'defconfigs', dfbase)) + shutil.copy(dfsrc, os.path.join(bpid.target_dir, 'defconfigs', dfbase)) git_debug_snapshot(args, "add (useful) defconfig files") @@ -880,7 +896,7 @@ def process(kerneldir, outdir, copy_list_file, git_revision=None, for some_symbols in [orig_symbols[i:i + 50] for i in range(0, len(orig_symbols), 50)]: r = 'CONFIG_((' + '|'.join([s + '(_MODULE)?' for s in some_symbols]) + ')([^A-Za-z0-9_]|$))' regexes.append(re.compile(r, re.MULTILINE)) - for root, dirs, files in os.walk(args.outdir): + for root, dirs, files in os.walk(bpid.target_dir): # don't go into .git dir (possible debug thing) if '.git' in dirs: dirs.remove('.git') @@ -899,7 +915,7 @@ def process(kerneldir, outdir, copy_list_file, git_revision=None, git_debug_snapshot(args, "rename config symbol / srctree usage") # disable unbuildable Kconfig symbols and stuff Makefiles that doesn't exist - maketree = make.MakeTree(os.path.join(args.outdir, 'Makefile.kernel')) + maketree = make.MakeTree(os.path.join(bpid.target_dir, 'Makefile.kernel')) disable_kconfig = [] disable_makefile = [] for sym in maketree.get_impossible_symbols(): |