build/gen_deb_sources.py (91 lines of code) (raw):
#!/usr/bin/python
# Generate deb package sources for each distro
# from the input debian.in directory contents
output_distros = [
("oracular", "ubuntu24.10", "2410", ""),
("noble", "ubuntu24.04", "2404", ""),
("mantic", "ubuntu23.10", "2310", ""),
("lunar", "ubuntu23.04", "2304", ""),
("kinetic", "ubuntu22.10", "2210", ""),
("jammy", "ubuntu22.04", "2204", ""),
("impish", "ubuntu21.10", "2110", ""),
("focal", "ubuntu20.04", "2004", ""),
("groovy", "ubuntu20.10", "2010", ""),
("disco", "ubuntu19.04", "1904", ""),
("bionic", "ubuntu18.04", "1804", ""),
("stretch", "debian9", "9", ""),
("buster", "debian10", "10", ""),
("bullseye", "debian11", "11", "")
]
editions = ["community", "commercial"]
import shutil
import os
def preprocess(inpath, inf, outf, vars):
# Preprocessor accepts
# @ifdef <variable> [<variable>...]
# @else
# @endif
# Where variable is the name of the distro or of the edition
def evaluate(options, distro, edition, bundle, version):
return distro in options or edition in options or bundle in options or version in options
def evaluate_version(options, vars):
version = int(vars['version'])
eval_command = 'version' + ''.join(options)
return eval(eval_command)
conditions = [True]
# @ifndistro and @ifnedition also accepted
for line in inf:
for key, value in list(vars.items()):
line = line.replace('@%s@' % key, value)
if line.startswith("@") and not line.startswith("@@"):
d, _, args = line.strip().partition(" ")
conds = [s.strip() for s in args.split()]
if d == "@ifversion":
conditions.append(evaluate_version(conds, vars))
continue
if d == "@ifdef":
conditions.append(evaluate(conds, vars['distro'], vars['edition'], vars['bundle'], vars['version']))
continue
elif d == "@ifndef":
conditions.append(not evaluate(conds, vars['distro'], vars['edition'], vars['bundle'], vars['version']))
continue
elif d == "@else":
conditions[-1] = not conditions[-1]
continue
elif d == "@endif":
conditions.pop()
continue
else:
print((inpath+": unknown directive", line))
if conditions[-1]:
outf.write(line)
edition_specific_file_exts = [".menu", ".mime", ".sharedmimeinfo",".lintian-overrides"]
def generate_distro(source_dir, vars):
target_dir = '%s.deb-%s' % (vars['edition'], vars['distro'])
shutil.rmtree(target_dir, ignore_errors=True)
os.mkdir(target_dir)
target_source_dir = os.path.join(target_dir, "source")
os.mkdir(target_source_dir)
for f in os.listdir(source_dir):
inpath = os.path.join(source_dir, f)
outpath = os.path.join(target_dir, f)
if os.path.splitext(inpath)[-1] in edition_specific_file_exts:
if vars['edition'] not in inpath:
continue
if not os.path.isdir(os.path.join(target_dir, f)):
outf = open(outpath, "w+")
preprocess(inpath, open(inpath), outf, vars)
outf.close()
# set the same permissions as the original file
os.chmod(outpath, os.stat(inpath).st_mode)
# always copy this file, since the tar will come with the right README file
if vars['edition'] == "commercial":
shutil.copyfile("debian.in/copyright.commercial.in", os.path.join(target_dir,"copyright"))
else:
shutil.copyfile("debian.in/copyright.gpl.in", os.path.join(target_dir,"copyright"))
shutil.copyfile(os.path.join(source_dir, "source/format"), os.path.join(target_source_dir,"format"))
outf = open(os.path.join(target_source_dir,"lintian-override"), "w+")
inpath = os.path.join(source_dir, "source/lintian-override")
preprocess(inpath, open(inpath), outf, vars)
print((target_dir, "generated"))
if os.path.isdir("../internal"):
edition = "commercial"
else:
edition = "community"
for distro, distro_version, version, bundle in output_distros:
#for edition in editions:
vars = {}
vars['distro'] = distro
vars['distrov'] = distro_version
vars['edition'] = edition
vars['bundle'] = bundle
vars['version'] = version
generate_distro("debian.in", vars)