aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/obs/build_binpkg.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/obs/build_binpkg.py')
-rwxr-xr-xscripts/obs/build_binpkg.py108
1 files changed, 108 insertions, 0 deletions
diff --git a/scripts/obs/build_binpkg.py b/scripts/obs/build_binpkg.py
new file mode 100755
index 0000000..5c8cd01
--- /dev/null
+++ b/scripts/obs/build_binpkg.py
@@ -0,0 +1,108 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright 2022 sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
+import argparse
+import fnmatch
+import lib
+import multiprocessing
+import os
+import sys
+import lib.binpkg_deb
+import lib.config
+import lib.docker
+import lib.git
+import lib.metapkg
+import lib.srcpkg
+
+
+def arg_type_docker_distro(arg):
+ for pattern in lib.config.docker_distro_other:
+ if fnmatch.fnmatch(arg, pattern):
+ return arg
+ raise ValueError
+
+
+def main():
+ distro_default = lib.config.docker_distro_default
+ jobs_default = multiprocessing.cpu_count() + 1
+
+ parser = argparse.ArgumentParser(
+ description="Build a deb or rpm package as it would be done on"
+ " obs.osmocom.org. Use after building a source package"
+ " with build_srcpkg.py."
+ f" Output dir: {lib.config.path_temp}/binpkgs")
+ parser.add_argument("-d", "--docker", type=arg_type_docker_distro,
+ const=distro_default, nargs="?", metavar="DISTRO",
+ help="build the package in docker for a specific"
+ f" distro (default: {distro_default}, other:"
+ f" almalinux:8, debian:10, ubuntu:22.04 etc.)")
+ parser.add_argument("-f", "--feed", dest="docker_feed", default="master",
+ choices=["master", "nightly", "latest"],
+ help="the OBS feed to configure inside docker, against"
+ " which the package will get built (use nightly"
+ " if master doesn't get built for DISTRO)")
+ parser.add_argument("-j", "--jobs", type=int, default=jobs_default,
+ help=f"parallel running jobs (default: {jobs_default})")
+ parser.add_argument("-r", "--run-shell-on-error", action="store_true",
+ help="run an interactive shell if the build fails")
+ parser.add_argument("-v", "--verbose", action="store_true",
+ help="always print shell commands and their output,"
+ " instead of only printing them on error")
+ parser.add_argument("package",
+ help="package name, e.g. libosmocore")
+ args = parser.parse_args()
+
+ lib.set_args(args)
+
+ srcdir = f"{lib.config.path_temp}/srcpkgs/{args.package}"
+ if not os.path.exists(srcdir):
+ print(f"ERROR: {args.package}: no srcpkg found, run build_srcpkg.py"
+ " first!")
+ sys.exit(1)
+
+ bindir = f"{lib.config.path_temp}/binpkgs"
+ lib.run_cmd(["rm", "-rf", bindir])
+ os.makedirs(bindir)
+
+ distro = args.docker if args.docker else distro_default
+
+ env = {"JOBS": str(args.jobs),
+ "PACKAGE": args.package,
+ "BUILDUSER": os.environ["USER"],
+ "DISTRO": args.docker,
+ "PACKAGEFORMAT": "deb"}
+
+ docker_args = []
+ if args.run_shell_on_error:
+ env["RUN_SHELL_ON_ERROR"] = "1"
+ docker_args += ["-i", "-t"]
+
+ # Add capability needed for building without network
+ docker_args += ["--cap-add=NET_ADMIN"]
+
+ script_path = "data/build.sh"
+
+ if not distro.startswith("debian:") and not distro.startswith("ubuntu:"):
+ env["PACKAGEFORMAT"] = "rpm"
+
+ if args.docker:
+ image_type = "build_binpkg"
+
+ # Optimization: use docker container with osmo-gsm-manuals-dev already
+ # installed if it is in build depends
+ if env["PACKAGEFORMAT"] == "deb" \
+ and lib.srcpkg.requires_osmo_gsm_manuals_dev(args.package):
+ image_type += "_manuals"
+
+ env["BUILDUSER"] = "user"
+ lib.docker.run_in_docker_and_exit(script_path,
+ image_type=image_type,
+ distro=distro,
+ pass_argv=False, env=env,
+ docker_args=docker_args)
+ else:
+ lib.run_cmd(["sudo", "-E", script_path], env=env,
+ cwd=lib.config.path_top)
+
+if __name__ == "__main__":
+ main()